线性表的概念
线性表的定义: 线性表是n个类型相同数据元素的有限序列,对n>0,除第一元素无直接前驱、最后一个元素无直接后继外,其余的每个数据元素只有一个直接前驱和一个直接后继。
线性表的特点:
(1)同一性。线性表由同类数据元素组成,每一个ai必须属于同一数据类型
(2)有穷性。线性表由有限个数据元素组成,表长度就是表中数据元素的个数。
(3)有序性。线性表中相邻数据元素之间存在着序偶关系<ai ai+1>
线性表的分类: 顺序表和链表
顺序表
顺序表(顺序存储结构的线性表):用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表中在逻辑结构上相邻的数据元素存储在连续的物理存储单元中,即通过数据元素物理存储的连续性来反映数据元素之间逻辑上的相邻关系。例如:c语言中的数组
c语言定义线性表的顺序存储结构:
#define MAXSIZE 100 /*此处的宏定义常量表示线性表的最大长度*/
typedef struct
{
ElemType elem[MAXSIZE]; /*线性表占用的数组空间*/
int last; /*纪录线性表中最后一个元素在数组elem[]中的位置*/
}SeqList;
如何定义变量:
(1)通过变量定义语句: SeqList L;
将L定义为SeqList类型的变量,利用L.elem[i-1]来访问顺序表中序号为i的元素ai;通过L.last可得到顺序表中最后一个元素的下标,而L.last+1就是顺序表的长度。
(2)通过 指针变量定义语句:
SeqList L1,*L;
L=&L1;
将L定义为指向SeqList类型的指针变量,使用时,可通过L->elem[i-1]来访问顺序表中序号为i的元素ai,使用L->last+1得到顺序表的长度。
顺序表的基本运算:
1.查找
从第一个元素开始,依次将表中元素和e相比较,若相等,则查找成功,返回该元素在表中的序号;若e与表中的所有元素都不相等,则查找失败,返回-1。
int Locate(SeqList L,ElemType e)
{
i=0;
while((i<=L.last)&&(L.elem[i]!=e))
i++;
if(i<=L.last) /*找到元素*/
return(i+1);
else /*未找到元素*/
return(-1);
2.插入
在表的第i(1≤i≤n+1)个位置前插入一个新元素e,使长度为n的线性表变成长度为n+1的线性表。即将原表中位置i,…n-1,n上的结点,依次后移到位置 i+1,…n,n+1上,空出第i个位置,然后在该位置上插入新结点e。当i=n+1时,是指在线性表的末尾插入结点,所以无需移动结点,直接将e插入表的末尾即可。
int InsList(SeqList *L,int i,ElemType e)
{
int k;
if((i<1)||(i>L->last+2))
{
printf("插入位置i值不合法");
return(0);
}
if(L->last>=MAXSIZE-1)
{
printf("表已满,无法插入");
return(0);
}
for(k=L->last;k>=i-1;k--)
L->elem[k+1]=L->elem[k];
L->elem[i-1]=e;
l->last++;
return(1);
}
3.删除
将表的第i(1≤i≤n)个元素删去,使长度为n的线性表变成长度为n-1的线性表。即将原表中位置在i+1,i+2…,n-1,n上的结点,依次前移到位置i,i+1,…n-1。
int DelList(SeqList *L,int i,ElemType *e)
{
int k;
if((i<1)||(i>L->last+1))
{
printf("删除位置不合法!");
return(0);
}
*e=L->