#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define ERROR 0
#define LIST_INIT_SIZE 100
#define LISTINCREACEMENT 10
#define OK 1
#define OVERFLOW 1
typedef int ElemType;
typedef struct {
ElemType *elem;//存储空间首地址
int length;//当前长度
int listsize;//当前可分配的存储容量
}Sqlist;
int InitList(Sqlist &L);
int ListInsert(Sqlist &L,int i,ElemType e);
int ListDelete(Sqlist &L,int i);
void main()
{
Sqlist L;
ElemType e,z;
int n,i=0,j=0;
int x,y,w;
if(InitList(L))
{
printf(" 初始化顺序表成功 /n");
}
printf("请输入顺序表的长度n:/n");
scanf("%d",&n);
printf("请输入n个数:/n");
for(;i<n;i++)
{
scanf("%d",&(L.elem[i]));
++L.length;
}
for(;j<n;j++)
{
if(j%5==0){
printf("/n");
printf("%d ",L.elem[j]);
}
else{
printf("%d ",L.elem[j]);
}
}
printf("/n");
printf("请输入要查询表中具体的值:");
scanf("%d",&e);
for(z=1;z<L.length;z++)
{
if(L.elem[z]==e)
printf("该值的具体位序:%d/n",z);
}
printf("/n");
printf("请输入你要插入的位置和值:");
scanf("%d%d",&x,&y);
ListInsert(L,x,y);
for(int k=0;k<L.length;k++)
{
printf("%d ",L.elem[k]);
}
printf("/n");
do{
printf("请输入你要删除的位序:/n");
scanf("%d",&w);
ListDelete(L,w);//删除表中具体的值。
if(w>0)
{
for(int v=0;v<L.length;v++)
{
printf("%d ",L.elem[v]);
}
}
}while(w>0);
printf(" 将顺序表逆序: /n");
for(int g=0;g<L.length/2;g++)//将顺序表逆序。
{
int m;
m=L.elem[g];
L.elem[g]=L.elem[L.length-1-g];
L.elem[L.length-1-g]=m;
}
for(int v=0;v<L.length;v++)
{
printf("%d ",L.elem[v]);
}
}
//构造一个空的顺序表
int InitList(Sqlist &L)
{
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//动态存储分配,将分配内存的首地址赋值顺序表的首地址。
if (!L.elem)exit(OVERFLOW);//存储分配失败;
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
int ListInsert(Sqlist &L,int i,ElemType e)
{int *p,*q,*newbase;
if (i<1||i>L.length)return ERROR;//判断i得知是否合法;
if (L.length>=L.listsize)
{
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREACEMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREACEMENT;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;//插入位置向右移
*q=e;//插入e;
++L.length;
return OK;
}
int ListDelete(Sqlist &L,int i)
{
int *p,*q;
if(i<1||i>L.length)return ERROR;
p=&L.elem[i-1];//p为被删除的位置;
q=&(L.elem[L.length-1]);
for(++p;p<=q;++p)
{
*(p-1)=*p;
}
--L.length;
return OK;
}