一. 简介
- 线性结构:
①存在唯一一个被称为“第一个”的元素;也存在唯一一个被称为“最后一个”的元素。
②除第一个外,每一个元素只有一个前驱;除了最后一个外,每一个元素只有一个后驱。 - 线性表的顺序表示:用一组地址连续的存储单元一次存储线性表的数据元素。
如果满足LOC(ai)=LOC(a1)+(i-1)*l (l是每个元素的存储长度),则说明这个线性表是顺序表示的。 - 顺序的线性表插入或删除元素时候,时间主要耗费在移动元素上。长度为n的线性表插入和删除操作的时间复杂度均为O(n)
二. 线性表的链式表示
1. 线性链表
-
线性链式存储,是用一组任意的存储单元存储线性表的数据元素(可以是连续的,也可以是不连续的)。一个结点(node)分成两个部分:一个存储数据元素信息的数据域,一个存储后续存储位置的指针域。
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
-
整个链表的存储必须从头指针开始进行,头指针指向链表第一个结点的存储位置。
-
单链表插入:插入元素x,p为x的前一元素的指针,s为指向x的指针
s->next=p->next;
p->next=s;
bool ListInsert(LinkList &L,int i,ElemType e){
LinkList p=L; int j=0;
//寻找第i-1个结点
while(p&&j<i-1){
p=p->next;
++j;
}
if(!p||j>i-1)
return false;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
- 删除一个结点:
bool ListDelete(LinkList &L,int i,ElemType &e){
LinkList p=L; int j=0;
//寻找第i个结点
while(p->next && j<i-1){
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
return false;
LinkList *q=p->next;
p->next=q->next;
e=q->date;
free(q);
return true;
}
2. 循环链表
- 循环链表:表中最后一个结点的指针域不为空,而是指向头结点。整个链表构成一个环。
3. 双向链表
- 双向链表有两个指针域,一个指向后继,一个指向前趋。
- 双向链表也可以有循环表。即表中有两个环。