# 顺序表（数据结构）

#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("请选择菜单序号：");

}

• 写评论