1.1
线性表:
由n个数据元素组成的有限序列;
(a1,a2.a3.........an)
a1为起始结点;
an-1为an的直接前驱,an+1为an的直接后驱;
an为终端节点;
数据元素的长度为表的长度;
当n为0时为空表;
例:26个英文字母组成的英文表(A,B,C,D...Z)
逻辑特征:
在非空线性表中只有一个开始节点,仅有一个直接后继。
1.2
线性表的类型定义:
抽象数据类型线性表的定义如下(很长,不写了)
基本操作有
initlist(&L)构造一个空的线性表
destorylist(&L)删除线性表
clearlist(&L)清空线性表
listempty(L)判断线性表是否为空
listlength(L)返回线性表中元素个数
getekem(L,i,&e)用e返回表L中第i个数据元素
locateelem(L,e,compare())线性表已经存在,返回L中第一个与e满足compare()的数据元素的位序,若不存在则返回0
priorelem(L,cur_e,&pre_e)若cur_e时L的数据元素,且不是第一个,则用pre_e返回它的前驱
nextelem(L,cur_e,&next_e)若cur_e是L的数据元素,且不是最后一个,则用next_e返回他的后继
listinsert(&L,i,e)在L的第i个位置之前插入新的元素e,L的长度加1
listdelete(&L,i,&e)、删除表中第i个数据元素,长度减1
listtraverse(&L,visited())遍历表中每个元素并进行visited()
这些运算是逻辑结构上定义的运算,至于细节,需要确定了存储结构之后才考虑
接下来就是线性表的存储
1.3
两种基本的存储结构:顺序存储结构和链式存储结构
线性表的顺序表示和实现1
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元的存储结构。
线性表顺序存储结构占用一片连续的存储空间,也可以理解成没有间断点
假设线性表的每个元素占l个存储单元,则第i+1个数据元素的存储位置和第i个存储位置之间满足关系
LOC(ai+1)=LOC(ai)+l;(公式,由顺序存储结构定义得出的推论)
可以用一维数组表示顺序表。
线性表长可变,数组长度不可动态定义,创建线性表代码实现:
#define maxsize 20
typedef int elemtype;
typedef struct {
elemtype data[maxsize];
int length;
}Sqlist;
接下来是对于线性表的各种操作
获得元素操作:对于线性表的顺序存储结构来说,获取元素只要在数组下标范围内,将元素值返回即可。代码如下:
#define OK 1
#dedine ERROR 0
typedf int Status;
Status GetElem(Salish L,int i,Elemtype *e)
{
if(L.length==0||i<1||i>L.length)
return ERROR;
*e=L.data[i-1];
return OK;
}
插入操作:我们可以理解成排队,插入一个元素,这是后面的元素都要往后移一位,包括原先下标表示的值,并且表长加1。
代码如下:
Status ListInsert(Salish *L,int i,Elemtype e)
{
int k;
if(L->next==MAXSIZE)
return ERROR;
if(i<=L->length)
{
for(k=L->length-1;k>=i-1;k--)
L->data[k+1]=L->data[k];
}
L->data[i-1]=e;
L->length++;
rerurn OK;
}
删除操作:只要找到删除的元素的位置下标,然后令从下标+1的元素开始,全部往前一位即可,然后表长-1。代码如下
Status ListDelete(Salish *L,int i,Elemtype *e){
int k;
if(L->length==0)
return ERROR;
if(i<1||i>L->length)
return ERROR;
*e=L->data[i-1];
if(i<L->length)
{
for(k=i;k<L->length;k++)
L->data[k-1]=L->data[k];
}
L->length--;
return OK;
}