众所周知,顺序表是数据结构中线性表的知识,线性表有两种存储结构,一种是顺序存储(顺序表),一种是链式存储(链表)。现在给出顺序表中常用基本操作的c语言代码实现。
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 20
typedef int ElemType;
typedef struct
{
ElemType *data; //定义数组
int lenth; //线性表当前长度
}SqList;
void InitList(SqList *L) //线性表的初始化
{
L->data=(ElemType *)malloc(Maxsize*sizeof(ElemType)); //为数组分配空间
L->lenth=0; //初始长度为0
}
void DestoryList(SqList *L) //线性表的销毁
{
if(L->data!=NULL)
free(L->data);
L->data=NULL;
L->lenth=0;
}
int GetElem(SqList L,int i,ElemType *e) //获取表L中第i个元素 这里的*e代表指针,传递的时候用地址传递
{
if(i<0||L.lenth==0||i>L.lenth) //如果超出范围则返回0,表示未找到
return 0;
else
{*e=L.data[i-1]; //把表中第i个元素赋值给e 这里的*e代表引用
return 1;
}
}
int ListInsert(SqList *L,int i,ElemType e) //在表L中第i个元素之前插入e
{
int k;
if(L->lenth==Maxsize) //如果表满,返回0
return 0;
if(i<1||i>L->lenth+1) //如果要插入的i不在范围时,返回0.注:i>lenth+1是因为可以在表的最后插入
return 0;
if(i<=L->lenth)
{
for(k=L->lenth-1;k>=i-1;k--) //因为数组下标从0开始,所以都要-1
L->data[k+1]=L->data[k]; //将插入的第i位之后的所有元素全部后移一位
}
L->data[i-1]=e; //将e的值插入
L->lenth++; //表长度+1
return 1;
}
int ListDelete(SqList *L,int i,ElemType *e) //删除表中第i个元素,并用e返回其值
{
int k;
if(L->lenth==0) //如果是空表,返回0
return 0;
if(i<1||i>L->lenth) //如果要删除的i不在范围时,返回0.
return 0;
*e=L->data[i-1]; //先把要删除的元素赋值给e
if(i<L->lenth)
{
for(k=i-1;k<L->lenth-1;k++)
L->data[k]=L->data[k+1]; //将删除元素之后的所有元素前移一位
}
L->lenth--; //表长度-1
return 1;
}
void print(SqList L)
{
int i;
for(i=0;i<L.lenth;i++)
printf("%d ",L.data[i]);
}
void menu()
{
printf("\n-------------------------------------1.向表中插入元素----------------------------------------------------------");
printf("\n-------------------------------------2.向表中删除元素----------------------------------------------------------");
printf("\n-------------------------------------3.获取表中元素------------------------------------------------------------");
printf("\n-------------------------------------4.打印表中元素-------------------------------------------------------------");
printf("\n-------------------------------------5.销毁线性表-------------------------------------------------------------");
}
int main()
{ int choose,location,m,i;
SqList L;
ElemType e;
InitList(&L);
printf("请输入线性表的长度n:");
scanf("%d",&m);
printf("\n请输入n个元素:");
for(i=0;i<m;i++)
{ scanf("%d",&e);
ListInsert(&L,i+1,e);
}
menu();
p:
printf("\n请输入你的选项: ");
scanf("%d",&choose);
switch(choose)
{ case 1:printf("\n请输入要插入元素的位置:");scanf("%d",&location);printf("\n请输入要插入的元素:");scanf("%d",&e);ListInsert(&L,location,e);goto p;
case 2:printf("\n请输入要删除元素的位置:");scanf("%d",&location);ListDelete(&L,location,&e);printf("\n被删除的数是%d\n",e); goto p;
case 3:printf("\n请输入要获取元素的位置:");scanf("%d",&location);GetElem(L,location,&e);printf("\n获取到的数是%d\n",e); goto p;
case 4:print(L); goto p;
case 5:DestoryList(&L);printf("\n线性表已被销毁"); goto p;
default:printf("输入错误,请重新输入"); goto p;
}
return 0;
}
上述便为常见的顺序表操作代码。
下面给出运行结果图