#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
ElemType a[MAXSIZE];
int length;
}SqList;
SqList a,b,c;
void creat_list(SqList *L);
void out_list(SqList L);
void insert_sq(SqList *L,int i,ElemType e);
ElemType delete_sq(SqList *L,int i);
int locat_sq(SqList L,ElemType e);
int len_list(SqList *L);
void reverse(SqList *L);
ElemType dell(SqList *L,int e);
ElemType alldell(SqList *L,int e);
void insert(SqList *L,int e);
int main( )
{
int i,k,loc;
ElemType e,x;
char ch;
do{
printf("\n\n\n");
printf("\n 1.建立线性表");
printf("\n 2.在i位置插入元素e");
printf("\n 3.删除第i个元素,返回其值");
printf("\n 4.查找值为e的元素");
printf("\n 5.删除首次出现值为x的元素");
printf("\n 6.删除所有值为x的元素");
printf("\n 7.输出顺序表的各结点的值");
printf("\n 8.求顺序表的长度");
printf("\n 9.在顺序表的末尾插入数e");
printf("\n 10.将顺序表逆置");
printf("\n 11.结束程序运行");
printf("\n ---------------------");
printf("\n 请输入您的选择(1,2,3,4,6,8,11)");
scanf("%d",&k);
switch(k)
{
case 1:
{ creat_list(&a);
out_list(a);
} break;
case 2:
{
printf("\n i,e=?");
scanf("%d%d",&i,&e);
insert_sq(&a,i,e);
out_list(a);
} break;
case 3:
{
printf("\n i=?");
scanf("%d",&i);
x=delete_sq(&a,i);
out_list(a);
printf("\n x=%d",x);
} break;
case 4:
{
printf("\n e=?");
scanf("%d",&e);
loc=locat_sq(a,e);
if(loc==-1)
printf("\n未找到 %d",loc);
else
printf("\n已找到,元素位置是%d",loc);
}break;
case 5:
{
scanf("%d",&e);
dell(&a,e);
out_list(a);
} break;
case 6:
{
scanf("%d",&e);
alldell(&a,e);
out_list(a);
} break;
case 7:
{
out_list(a);
} break;
case 8:
{
len_list(&a);
} break;
case 9:
{
scanf("%d",&e);
insert(&a,e);
out_list(a);
} break;
case 10:
{
reverse(&a);
out_list(a);
} break;
}
}while (k!=11);
printf("\n 再见!");
printf("\n 按enter键,返回");
ch=getchar();
}
//建表
void creat_list(SqList *L)
{
int i;
printf("\n n=?");
scanf("%d",&L->length); //输入表长
for(i=0;i<L->length;i++)
{
printf("\n data %d=?",i);
scanf("%d",&(L->a[i]));
}
}
//输出
void out_list(SqList L)
{
int i;
char ch;
printf("\n");
for(i=0;i<=L.length-1;i++) //O(n)
printf("%10d",L.a[i]);
printf("\n\n 按enter键,继续");
ch=getchar();
}
//在第i个位置插入元素e
void insert_sq(SqList *L,int i,ElemType e)
{
int j;
if(L->length==MAXSIZE)
printf("\n overflow!");
else if(i<1||i>L->length+1)
printf("\n erroe i !"); //插入位置不在表的范围内
else
{
for(j=L->length-1;j>=i-1;j--) //O(n)
L->a[j+1]=L->a[j]; //向后移动数据元素
L->a[i-1]=e; //插入元素
L->length++; //增加表长
}
}
//删除第i个元素,返回其值
ElemType delete_sq(SqList *L,int i)
{
ElemType x;
int j;
if(L->length==0)
printf("\n 是空表。underflow !");
else if (i<1||i>L->length)
{
printf("\n error i !");
x=-1;
}
else
{
x=L->a[i-1]; //找到第i个元素的位置
for(j=i;j<=L->length-1;j++) //O(n)
L->a[j-1]=L->a[j]; //第i+1个位置覆盖第i个位置
L->length--;
}
return(x);
}
//查找值为e的元素,返回其位置
int locat_sq(SqList L,ElemType e)
{
int i=0;
while(i<=L.length-1&&L.a[i]!=e)
i++;
if(i<=L.length-1)
return(i+1);
else
return(-1);
}
//求顺序表的长度
int len_list(SqList *L)
{
printf("%d",L->length);
}
//将顺序表逆置
void reverse(SqList *L)
{
int t,i,j;
j=L->length-1; //两头互换
for(i=0;i<j;i++,j--)
{
t=L->a[i];
L->a[i]=L->a[j];
L->a[j]=t;
}
}
//删除首次出现值为x的元素
ElemType dell(SqList *L,int e)
{ int i=0,k;
while(i<L->length)
{
if(L->a[i]!=e)
i++; //找到第一个出现值为e的位置
else
{
for(k=i+1;k<L->length;k++) //O(n)
L->a[k-1]=L->a[k]; //e后面的值向前移,覆盖e
L->length--;
break ;
}
}
if (i>L->length)
{
printf("要删除的数据元素不存在!\n") ;
return 0;
}
return 1;
}
//删除所有值为x的元素
ElemType alldell(SqList *L,int e)
{
int i=0,k=0;
while(i<L->length)
{
if(L->a[i]==e)
k++; //值为e的个数
else
L->a[i-k]=L->a[i]; //当前元素向前移k个位置
i++;
}
L->length-=k;
if (i>L->length)
{
printf("要删除的数据元素不存在!\n") ;
return 0;
}
return L->length;
}
//在顺序表的末尾插入数e
void insert(SqList *L,int e)
{
L->length+=1; //表长+1
L->a[L->length-1]=e; //末尾插入数字e
}