这是老师布置的课本上的作业,欢迎大家一起来交流,很欢迎指点,大一第一次做这种事。我用的课本是浙大的数据结构,陈越和何钦铭出的书,第一篇是顺序表的代码:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MAXSIZE 100
#define ERROR -1
#define NotFound 0
typedef int Position;
struct LNode
{
int *date;
Position Last;
int MaxSize;
};
typedef struct LNode *PtrToLNode;
typedef PtrToLNode List;
void show();
List MakeEmpty(int MaxSize);
Position Find(List L, int X);
bool Insert( List L, int X, int i);
bool Delete(List L, int i);
Position BinarySearch(List L, int X);
void print(List L);
int main()
{
int n=-1, k, X, i, c=0, j=0;
List L = (List)malloc(sizeof(struct LNode));
while(1)
{
if(c==1||j==0)
{
show();
j = 1;
}
scanf("%d", &n);
//system("pause");
if(n>6||n<-1)
{
printf("请输入合法数字!请选择菜单序号:");
continue;
}
switch(n)
{
case 1:
{
L = MakeEmpty(MAXSIZE);
if(L)
c=1;
}
break;
case 2:
{
if(1==c)
{
printf("请输入你要查找的数字:");
scanf("%d", &X);
k = Find(L, X);
if(k==ERROR)
printf("查找无效!重新查询\n");
else
printf("你查找的数字在第%d个位置上\n", k+1);
}
else
{
printf("失败!您还未创建表。重新选择:");
}
}break;
case 3:
{
if(1==c)
{
printf("请输入你要插入的位置:");
scanf("%d", &i);
printf("请输入你要插入的数字:");
scanf("%d", &X);
k = Insert( L, X, i);
if(k)
printf("插入成功\n");
else
printf("插入失败\n");
}
else
{
printf("失败!您还未创建表。重新选择:");
}
}break;
case 4:
{
if(1==c)
{
printf("输入你要删除的位序号:");
scanf("%d", &i);
k = Delete(L, i);
if(k)
printf("删除成功!\n");
else
printf("删除失败,请输入合法序号或检查表容量");
}
else
{
printf("失败!您还未创建表。重新选择:");
}
}break;
case 5:
{
if(1==c)
{
printf("请输入需要查找的数字:");
scanf("%d", &X);
k = BinarySearch(L, X);
if(k)
printf("查找的数字在第%d位置上\n", k+1);
else
printf("查找失败!\n");
}
else
{
printf("失败!您还未创建表。重新选择:");
}
}break;
case 6:
if(1==c)
{
print(L);
}
else
{
printf("失败!您还未创建表。重新选择:");
}
break;
}
if( n==0 )
break;
}
}
List MakeEmpty(int MaxSize)//创建顺序表
{
List L;
L = (List)malloc(sizeof(struct LNode));
L->date = (int*)malloc(MaxSize*sizeof(int));
L->Last = -1;
int i=0 , n, k=0;
printf("输入一连串数字,中间用空格分开, 输入0退出:");
while(1)
{
scanf("%d", &n);
if( n==0 )
break;
L->date[i] = n;
L->Last++;//让指向最后的那个指针指向最后的一个数据的位置
i++;
k = 1;
}
if(k==1)
printf("创建成功\n\n");
else
printf("创建失败\n\n");
return L;
}
Position Find(List L, int X)//查找函数
{
Position i=0;
while( i<L->Last&&L->date[i]!=X)
i++;
if( i>L->Last)
return ERROR;
else
return i;
}
bool Insert( List L, int X, int i)//插入函数
{
Position j;
if(L->Last == MAXSIZE-1 )
{
printf("表满\n");
return false;
}
if(i<1||i>L->Last+2)
{
printf("位序不合法\n");
return false;
}
for( j=L->Last; j>=i-1; j-- )
L->date[j+1] = L->date[j];
L->date[i-1] = X;
L->Last++;
return true;
}
bool Delete(List L, int i)//删除函数
{
Position j;
if( i<1||i>L->Last+2 )
{
printf("位序%d不存在元素\n", i);
return false;
}
for( j=i; j<=L->Last; j++ )
L->date[j-1] = L->date[j];
L->Last--;
return true;
}
Position BinarySearch(List L, int X)//这里是二分查找法
{
Position left, right, mid;
left = 0;
right = L->Last;
while(left<=right)
{
mid=(left+right)/2;
if( X<L->date[mid])
right = mid-1;
else if( X>L->date[mid])
left = mid+1;
else
return mid;
}
return NotFound;
}
void print(List L)
{
int i;
printf("该序列为:");
if( L->Last == -1 )
printf("序列空\n");
else
for( i=0; i<=L->Last; i++)
printf("%d ", L->date[i]);
printf("\n");
}
void show()
{
printf("\n");
printf(" *************顺序表*************\n");
printf(" * 1.输 入 数 字 *\n");
printf(" * 2.查 找 数 字 *\n");
printf(" * 3.插 入 数 字 *\n");
printf(" * 4.删 除 数 字 *\n");
printf(" * 5.二分法 查找 *\n");
printf(" * 6.查 询 显 示 *\n");
printf(" * 0.退 出 系 统 *\n");
printf(" ********************************\n");
printf("请选择菜单序号:");
}