一、定义
零个或多个数据元素的有限序列
在较复杂的线性表中,一个数据元素可以由诺干个数据项组成
二、线性表的顺序存储结构
定义:是指用一段地址连续的存储单元一次存储线性表的数据元素
结构代码:
#define ListSize 100 //线性表的最大长度
typedef int DataType;
typedef struct
{
DataType data[ListSize]; //用数组存储线性表中的元素
DataType length; //顺序表中元素的个数
}SeqList;
DataType是数据元素类型,可以根据需要定义,可以使用SeqList定义数据表类型变量
数组长度与线性表长度区别:
数组长度是存放线性表的存储空间的长度
线性表的长度是线性表中数据元素的个数
顺序表的基本操作:
**(1)**按序号查找(用e返回L中第i个数据元素的值):
#define ok 1
#define error 0
typedef int status;
status getelem(sqlist L,int i,elemtype *e)
{
if (L->length < 1 || (L->length > LengthList(L)))
{
return error;
}
*e=L.data[i-1];
}
**(2)**插入操作(在L中第i个位置之前插入新的数据元素e,L的长度+1)
status InsList(PSeqList L, int i, DataType e)
{
int k;
//判断插入位置是否合法
if (i < 1 || L->length >(LengthList(L) + 1))
{
printf("插入位置不合法!\n");
return error;
}
//判断顺序表是否已满
else if (L->length >= ListSize)
{
printf("顺序表已满,不能插入!\n");
return error;
}
else
{
for (k = i; k <= L->length; k--)
{
L->data[k + 1] = L->data[k];
}
L->data[i - 1] = e;//将新元素插入
L->length++; //数据表的长度加1
return ok;
}
return 0;
}
**(2)**删除操作
status DelList(PSeqList L, DataType i, DataType* e)
{
int k;
if (L->length < 1)
{
printf("表为空!\n");
return error;
}
*e = L->data[i - 1];
for (k = i; k < L->length; k++)
{
L->data[k - 1] = L->data[k];
}
L->length--;
return *e;
}
优点:
无需为表中元素之间的逻辑关系增加额外的存储空间,可以快速存取表中任一位置的元素
缺点:
插入和删除操作需要移动大量元素,当线性表长度变化较大时,难以确定存储空间的容量,造成存储空间碎片
三、线性表的链式存储结构
分类:单链表,双向链表,循环链表
定义:对数据元素a来说,除了存储其本身的信息之外,还需要存储一个指示其直接后继的信息(其中存储数据的为数据域,存储直接后继位置称为指针域)
注意:要注意区分头指针和头结点之间的区别
结构代码描述:
typedef struct node
{
elemtype data;
struct node *next;
}
链表的基本操作:
**(1)**读取(用e返回l中第i个数据元素的值)
status getelem(linklist l,int i,elemtype *e)
{
int j;
linklist p;
p=l ->next;
j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return error;
*e=p>data;
return ok;
}
**(2)**插入(在l中第i个位置之前插入新的数据元素e,l的长度加1)
statues listinsert(linklist *l,int i,elemtype e)
{
int j;
linklist p,s;
p=*l;
j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(p||j>i)
{
return error;
}
//生成新节点
s=(linklist)malloc(sizeof(node));
.
s->data=e;
s->next=p->next;
p->next=s;
return ok;
}
**(3)**删除(删除l的第i个数据元素,并用e返回其值,l的长度-1)
status listdelete(linklist *l,int i,elemtype *e)
{
int j;
linklist p,q;
p=*l;
j=1;
while(p->&&j<i)
{
p=p->next;
++j;
}
if(!(p->next)||j>i)
retuen 0;
q=p->next;
p->next=q->next
*e=q->data;
free(q);
return ok;
}