#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 30 //线性表存储空间的初始分配量
#define ERROR 0 //失败标识
#define OK 1 //成功标识
typedef int Status; //Status为函数类型,他的值为上面定义的函数结果状态代码,ERROR,OK
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
}SqList;
//以下为构造一个空的顺序表
Status InitList(SqList *L)
{
L->elem=(ElemType *)malloc(MAXSIZE*sizeof(ElemType));
//malloc函数的参数只有一个,是要开辟的内存的大小,返回一个指针,指向已分配的内存大小,如果请求失败,则返回NULL。
//一般要free(p),p=NULL//
if(!L->elem)
return ERROR;//创建失败
L->length=0; //把顺序表的长度置0
return OK; //创建成功
}
//以下为顺序表的插入
Status ListInsert(SqList *L,int i,ElemType e)//把新的数据元素e插入到L的第i个位置之前,并使L的长度加1
{
if(L->length==MAXSIZE)//如果顺序表已满,则插入失败
return ERROR;
if(i<1||i>L->length+1)//如果i的输入不正确,则插入失败
return ERROR;
if(i<=L->length)//如果插入的位置不在表尾
{
for(int k=L->length-1;k>=i-1;k--)//为e腾位置,从表尾一个一个往后移
L->elem[k+1]=L->elem[k];
}
L->elem[i-1]=e;//把新的数据元素e插入到第i个位置之前
L->length++;//顺序表的长度加1
return OK;//插入成功
}
//以下为线性表的删除
Status DeleteList(SqList *L,int i,ElemType *e)//删除L中第i个元素,用e返回其值并使L的长度减1
{
if(L->length==0)//如果顺序表为空,则删除失败
return ERROR;
if(i<1||i>L->length)//如果i的输入不正确,则删除失败
return ERROR;
*e = L->elem[i - 1];
if(i<L->length)//如果删除位置不在表尾
{
for(int k=i;k<L->length;k++)//从第i+1个位置开始依次往前走一个
L->elem[k-1]=L->elem[k];
}
L->length--;//L长度减1
return OK;//删除成功
}
//以下为获取顺序表上某一位置上的元素
Status GetElem(SqList L,int i,ElemType *e)//用e返回L中第i个位置上的元素
{
if(L.length==0||i<1||i>L.length)//如果线性表为空,或i的取值不正确
return ERROR;//获取失败
*e=L.elem[i-1];//让e为L中第i个位置上的元素
return OK;//获取成功
}
//以下为打印出顺序表中的所有元素
Status OutPut(SqList L)
{
printf("现在顺序表的长度为:%d\n",L.length);
for(int i=0;i<L.length;i++)
printf("%3d",L.elem[i]);
printf("\n");
return OK;
}
int main()
{
SqList L;
printf("构造空的线性表L:\n");
InitList(&L);
int a[10],m=0;
printf("请输入10个数:\n");
for(m=0;m<10;m++)
scanf("%d",&a[m]);
//把这10个数插入顺序表
for(int j=1,n=0;j<=10;j++)
{
ListInsert(&L,j,a[n]);
n++;
}
OutPut(L);
printf("在第三位之前插入0\n");
ListInsert(&L,3,0);
OutPut(L);
ElemType e;
printf("删除第六位数据\n");
DeleteList(&L,6,&e);
OutPut(L);
printf("删除的数据为%d\n",e);
printf("获取第5位元素: ");
GetElem(L,5,&e);
printf("%3d",e);
return 0;
}
试运行结果: