#include
#include
#include
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct
{
char name[10];
char number[20];
}Phonenum;
typedef struct
{
Phonenum *elem;
int length;//当前长度
int listsize;//当前分配的存储容量
}SqList;
void ST(int ts) //出错时指示错误状态
{
if(ts==0)
printf("ERROR!\n\n");
if(ts==-2)
printf("OVERLOW!\n\n");
if(ts==-1)
printf("INFEASIBLE!\n\n");
if(ts==1);
else;
}
int InitList(SqList &L)//初始化
{
L.elem=(Phonenum *)malloc(LIST_INIT_SIZE*sizeof(Phonenum));
if(!L.elem) exit(OVERFLOW);
L.listsize=LIST_INIT_SIZE;
L.length=0;
return OK;
}
int Build(SqList &L)//建立表
{
int i,n;
printf("请初始化n个人的电话信息:\n");
scanf("%d",&n);
if(n>LIST_INIT_SIZE)//如果n大于当前空间
{
L.elem=(Phonenum *)realloc(L.elem,(n+LISTINCREMENT)*sizeof(Phonenum));
if(!L.elem)
exit(OVERFLOW);
L.listsize=n+LISTINCREMENT;
}
printf("请输依次输入%d人的姓名和电话号码\n",n);
for(i=0;i
{
printf("第%d个:",i+1);
scanf("%s %s",(L.elem+i)->name,(L.elem+i)->number);
}
printf("\n");
L.length=n;
return OK;
}
void Print(SqList &L)//输出表中元素
{
int i;
for(i=0;i
printf("%d号位置: %s %s\n",i+1,(L.elem+i)->name,(L.elem+i)->number);
printf("\n");
}
void Tips()//提示函数
{
printf("选择编号以执行对应操作:\n");
printf("1 输出\n");
printf("2 删除给定位置i数据\n");
printf("3 在i位置处插入信息\n");
printf("0 退出\n\n");
}
int ListDelete(SqList &L,int i)//删除第i个元素
{
int x;
if(i=L.length)
return ERROR;
for(x=i+1;x<L.length;x++)
(L.elem+x-1)=(L.elem+x);
L.length--;
printf("成功删除信息!\n\n");
return OK;
}
int ListInsert(SqList &L,int i,SqList &X)//插入一个人的信息在位置i处,使仍然有序
{
int k;
if(L.length=L.listsize) //判断线性表是否已满
{
L.elem=(Phonenum )realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(Phonenum));
if(!L.elem) //若再分配失败
exit(OVERFLOW);
L.listsize+=LISTINCREMENT;
}
for(k=L.length;k>i;k--)
{
strcpy(((L.elem+k)).name,(*(L.elem+k-1)).name);
strcpy((*(L.elem+k)).number,(*(L.elem+k-1)).number);
}
strcpy((L.elem+i)->name,X.elem->name);
strcpy((L.elem+i)->number,X.elem->number);
L.length++;
printf("成功插入!\n");
return OK;
}
int main()
{
Phonenum xx;
int op,x;
SqList L,i;
InitList(L);//初始化
Build(L);//建立表
Tips();
scanf("%d",&op);
while(op)
{
switch(op)
{
case 1:
Print(L);
break;
case 2:
printf("请输入要删除的位置i:\n");
scanf("%d",&x);
ST(ListDelete(L,x-1));//第i个元素对应的下标为i-1
break;
case 3:
printf("请输入要插入的位置:\n");
scanf("%d",&i);
printf("请输依次输入姓名和电话号码\n");
scanf("%s %s",xx.name,xx.number);
ST(ListInsert(L,i,xx));
break;
case 0:
exit(OK);
}
Tips();
scanf("%d",&op);
}
return 0;
}