typedef int ElemType;
typedef struct
{
ElemType *elem;//存储空间基址
int length; //当前长度
int ListSize; //当前分配的存储
} sqlist;
int InitList_sq(sqlist *l) /*initial the list l*///形参是一个结构体指针
{
l->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//初始化十个int容量
if(!l->elem) // if l->elem == NULL 前面有个!就代表if里的值为true
{
printf("无法分配空间!");
return 1;
}
else
{
l->length=0;//当前长度置为0
l->ListSize=LIST_INIT_SIZE;
//printf("ok\n");
return 0;
}
}
int ListInsert_sq(sqlist &l, int i, int e)//增
{
//线性表l第i个位置前插入e
//从i起到最后一个向后移一位,注意先从最后一个开始移
ElemType *p, *q;
if(i < 1 || i > l.length + 1)//插入位置有误
return 0;
if(l.length >= l.ListSize)//存储空间已满,增加空间
{
ElemType *newelem = (ElemType *)realloc(l.elem,(l.ListSize+LISTINCREMENT) * sizeof(ElemType));
if(!newelem)
{
exit(0);
}
l.elem = newelem;//更新基址
l.ListSize += LISTINCREMENT;//更新分配量
}
q = &(l.elem[i-1]); //q是插入位置
for(p = &(l.elem[l.length-1]); p >= q; p--)
{
*(p+1) = *(p);
}
*q = e;
l.length++;
return 1;
}
int Delete_sq(sqlist &l, int i, ElemType &e)//删
{
ElemType *q, *p;
if(i < 1 || i > l.length || l.length == 0) //删除位置有误或者l是个空表
return 0;
p = &(l.elem[i-1]);//删除元素的位置
e = *p;
q = &(l.elem[l.length - 1]);//最后一个元素
for(;p < q;p++)
{
*(p) = *(p+1);
}
l.length--;
return 1;
}
int FindValue_sq(sqlist &l, ElemType e)//查按值
{
int j;
if(l.length == 0)
return 0;
for(int i = 0; i < l.length; i++)
{
if(l.elem[i] == e)
{
j = i;
break;
}
}
if(i >= l.length)
{
printf("线性表中无这个值\n");
return 0;
}
return j+1;
}
int FindIndex_sq(sqlist &l, int i, ElemType &e)//查 按位置
{
if(i <= 0 || i >= l.length-1)
{
printf("查找位置有误\n");
return -1;
}
e = l.elem[i-1];
return e;
}
void change(sqlist &l, int i, ElemType &e)
{
if(i <= 0 || i >= l.length-1)
return;
l.elem[i-1] = e;
}
void show(sqlist &l)//显示
{
for(int i = 0; i < l.length; i++)
{
printf("%d ",l.elem[i]);
}
printf("\n");
}
void ui()
{
printf(" 欢迎进入顺序表操作界面\n");
printf(" 1.插入数据\n");
printf(" 2.删除数据\n");
printf(" 3.修改数据\n");
printf(" 4.查找数据\n");
printf(" 5.显示数据\n");
printf(" 6.退出程序\n");
}
void FindUi()
{
printf(" 1.按位置查找\n");
printf(" 2.按值查找\n");
printf(" 3.返回\n");
}
int main()
{
sqlist L;
int i, j,k, select;
int e;
InitList_sq(&L);
for(i = 1; i <= 10; i++)
ListInsert_sq(L,i,11-i);//第i个插入i
while(1)
{
ui();
scanf("%d",&select);
if(select == 1)
{
show(L);
fflush(stdin);
//system("cls");
printf("请输入要插入的位置:");
scanf("%d",&i);
printf("请输入插入的值:");
scanf("%d",&e);
ListInsert_sq(L,i,e);//第i个插入i
printf("数据已插入\n");
show(L);
fflush(stdin);
printf("按任意键返回\n");
getchar();
system("cls");
}
else if(select == 2)
{
show(L);
fflush(stdin);
printf("请输入删除的位置:");
scanf("%d",&i); //删除第i个数
Delete_sq(L,i,e);
printf("数据已删除\n");
show(L);
fflush(stdin);
printf("按任意键返回\n");
getchar();
system("cls");
}
else if(select == 3)
{
show(L);
fflush(stdin);
printf("请输入要修改的位置:");
scanf("%d",&i);
printf("请输入修改后的值:");
scanf("%d",&e);
change(L, i, e);
printf("数据已修改\n");
show(L);
fflush(stdin);
printf("按任意键返回\n");
getchar();
system("cls");
}
else if(select == 4)
{
while(1)
{
int find_select;
system("cls");
FindUi();
scanf("%d",&find_select);
fflush(stdin);
if(find_select == 1)
{
show(L);
scanf("%d",&i); //查找第i个数
e = FindIndex_sq(L,i,e);
if(e!=-1)
printf("%d\n",e);
fflush(stdin);
printf("按任意键返回\n");
getchar();
//system("cls");
}
else if(find_select == 2)
{
show(L);
scanf("%d",&e);
j = FindValue_sq(L,e);
printf("%d\n",j);
fflush(stdin);
printf("按任意键返回\n");
getchar();
//system("cls");
}
else
{
system("cls");
break;
}
}
}
else if(select == 5)
{
fflush(stdin);
show(L);
printf("按任意键返回\n");
getchar();
system("cls");
}
else
{
return 0;
}
}
}