首先让我们来认识顺序表
在顺序存储结构中,以数据元素的长度为单位,所以每个元素之间的距离为L。
在顺序存储结构中,数据的存储位置和它们的物理位置一致,因此较为简单、自然
使用C语言描述顺序存储结构下的线性表代码如下:
#define MAXSIZE 100 //线性表的最大长度 typedef struct Linear_list { datatype elem[MAXSIZE]; //定义数组域 int last; //最后一个元素在表中的位置 }SeqList;
需要注意的有以下问题
(1)数组的长度和线性表的长度不是一个概念。数组的长度是存放线性表的存储空间的长度,线性表的长度是线性表中数据元素的个数,它随着插入、删除等操作会发生变化,而数组的长度一开始就被定义且不可改变。
(2)线性表的当前长度:由于last表示最后一个元素1在表中的位置,而且元素是从0开始,所以当前长度为last+1。
(3)线性表的最大容量为一开始为线性表分配的MAXSIZE决定,后序不可更改。
(4)elem[]即用来存储数据的数组。
在C语言中,为了发挥指针的优势,我们可以定义一个指向SeqList类型的指针,即:
SeqList *Lp;
Lp是一个指针变量,存储空间通过C Lp=(SeqList*)malloc(sizeof(SeqList))
来获得。Lp是存放的顺序表的地址
##顺序表的插入、删除、求表长等操作
1、在某一位置(如i)插入元素之后:
(1)将ai~an一直向下移动,为新元素让出位置
(2)将x置入空出的位置
(3)修改Last指针使其总指向最后一个元素
此处的逻辑关系应当很容易理解,博主在这里就不上流程图了
代码如下:
int InsertList(SeqList *Lp,int i,datatype x) //分别是表、插入的位置(在...之前)、插入的值 { int j; if(Lp->last==MAXSIZE) //空间已满,无法继续存入元素了 { printf("内存已满,无法继续存入"); return(-1); } if(i<1||i>Lp->last+2) { printf("位置错误,不能进行该操作哦"\n); return(0); } for(j=Lp->last;j>=i-1;j--) { Lp->elem[j+1]=Lp->elem[j]; //往后移动 Lp->elem[i-1]=x; //插入元素 Lp->last++; //使Lp->last指向最后一个元素 return(1); }
2、删除某个元素
在删除线性表之后,长度为n线性表的长度会变为n-1;
(1)将ai+1~an顺序向上移动
(2)修改Lp-last指针,使其总指向最后一个元素
此处也比较简单,就不像后序非递归遍历二叉树那样上了流程图了,代码如下
int DeleteList(SeqList *Lp,int i) { int j; if(i<1||i>Lp->last+1) //判断输入数据的合法性 { printf("不存在第%d个元素哦\n",i); return 0; } for(j=i;j<=Lp->last,j++) Lp->elem[j-1]=Lp-elem[j]; //向上移动 Lp->last--; return(1); }
2、求表长
这里没什么好说的我们定义了Lp->last总指向最后一个元素,所以表长不言而喻了
ex:创建一个递增顺序表并实现顺序表的基本功能
代码如下:
#include<stdio.h> #define M 100 //数组长度 typedef int ElemType; typedef struct //定义线性表 { ElemType list[M]; int last; //指向末尾的last元素 }SeqList; void InitList(SeqList *L) //创建空表 { L->last=-1; //初始化last元素 } void Scanflist(SeqList *L,int n) //输入递增的有序顺序表 { int i; for(i=0;i<n;i++) scanf("%d",&(L->list[i])); L->last=L->last+n; } int LengthList(SeqList *L) { int Len; //初始化一个len值,用于记录列表长度 Len=L->last+1; //长度==last+1 last初始值为-1 return Len; } int PositionList(SeqList *L,int x) //判断插入位置 { int j; for(j=0;j<=L->last;j++) if(x<L->list[j]) //如果找到位置就返回地址 return j+1; //下标j表示j+1个元素,所以返回j+1 return(L->last+2); //插入位置合法,所以可以添加元素,所以线性表长度+1,即last+2 } int InsertList(SeqList *L,int i,int e) { int k; if((i<1)||(i>L->last+2)) { printf("您的输入有误"); return 0; } if(L->last>=M-1) { printf("该表已满,无法再添加数据"); return 0; } for(k=L->last;k>=i-1;k--) L->list[k+1]=L->list[k]; L->list[i-1]=e; L->last++; return(1); } int OutputList(SeqList *L) { int i; printf("输出结果为:"); for(i=0;i<=L->last;i++) printf("%d",L->list[i]); return(L->list[i]); } int main() { int s,c; SeqList L; InitList(&L); printf("请输入顺序表长度:"); scanf("%d",&s); printf("请输入递增顺序表:"); Scanflist(&L,s); LengthList(&L); printf("表长为:%d\n",LengthList(&L)); printf("请输入要插入的元素:"); scanf("%d",&c); InsertList(&L,PositionList(&L,c),c); OutputList(&L); printf("\n"); }