目录
2.5.3循环链表1
一.循环链表
1.循环链表基本概念
(1)循环链表:是一种头尾相接的链表(即:表中最后一个结点的指针域指向头结点,整个链表形成一个环)
- 优点:从表中任一结点出发均可找到表中其他结点
(2)循环链表的终止条件
由于循环链表中没有NULL指针,故涉及遍历操作时,其终止条件就不再像非循环链表那样判断p或p->next是否为空,而是判断他们是否等于头指针。
- 循环条件:
2.循环链表的时间复杂度
3.带尾指针循环链表的合并
LinkList Connect(LinkList Ta,LinkList Tb){ //假设Ta,Tb都是非空的单循环链表
p=Ta->next; //p存表头结点
Ta->next=Tb->next->next; //Tb表头连结Ta表尾
delete Tb->next; //释放Tb表头结点
Tb->next=p; //修改指针
return Tb;
}
2.5.4双向链表
一.双向链表
1.双向链表基本概念
双向链表:在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表。
2.双向链表的结构定义
typedef struct DuLNode{
Elemtype data;
struct DuLNode *prior,*next;
}DuLNode,*DuLinkList;
二.双循环链表
1.双循环链表基本概念
和单链表的循环类似,双向链表也可以有循环表
- 让头结点的前驱指针指向链表的最后一个结点
- 让最后一个结点的后继指针指向头结点
2.双向链表结构的对称性
p->prior->next=p=p->next->prior
在双向链表中有些操作(如:ListLength,GetElem等),因仅涉及一个方向的指针,故他们的算法与线性链表的相同。但在插入,删除时,则需同时修改两个方向上的指针,两者的操作的时间复杂度均为O(n)
三. 双向链表的操作
1.双向链表的插入操作
void Listlnsert_Dul(DuLinkList&L,int i,ElemType e){
//在带头结点的双向循环链表L中第i个位置之前插入元素e
if(!(p=GetElemP_DuL(L,i)))return ERROR;
s=new DuLNode; s->data =e;
s->prior=p->prior; p->prior->next =s;
s->next=p; p->prior =s;
return OK;
}//Listlnsert_DuL
2.双向链表的删除
void ListDelete_DuL(DuLink&L,int i,ElemType &e){
//删除带头系欸但的双向循环链表L的第i个元素,并用e返回
if(!(p=GetElemP_DuL(L,i))) return ERROR;
e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return OK;
}//ListDelete_DuL
三.单链表,循环链表和双向链表的时间效率比较
2.6顺序表和链表的比较
一.链式存储结构的优缺点
(1)链式存储结构的优点
- 结点空间可以动态申请和释放;
- 数据元素的逻辑次序靠结点的指针来指示,插入和删除时不需要移动数据元素
(2)链式存储结构的缺点
- 存储密度小,每个结点的指针域需额外占用存储空间。当每个结点的数据域所占字节不多时,指针域所占储存空间的比重显得很大。
- 链式存储结构是非随机存取结构。对任一结点的操作都要从头指针链查找到该结点,这增加了算法的复杂度。
二.顺序表和链表的比较
2.7线性表的应用
1.线性表的合并
2.有序表的合并
3.有序表合并——用链表实现
2.8案例分析与实现
1.一元多项式的运算:实现两个多项式加,减,乘运算
2.稀疏多项式的运算
3.图书信息管理系统
3.1栈和队列的定义和特点
一.栈和队列的定义
1.定义
(1)栈和队列是两种常用的,重要的数据结构
(2)栈和队列是限定插入和删除只能在表的“端点”进行的线性表
二.栈的定义和特点
1.栈的特性
由于栈的操作具有后进先出的固有特性,使得栈成为程序设计中的有用工具。另外,如果问题求解的过程具有“后进先出”的天然特性的话,则求解的算法中也必然需要利用“栈”。
2.栈的特点
- 栈是一个特殊的线性表,是限定仅在一端(通常是表尾)进行插入和删除操作的线性表。
- 又称为后进先出的线性表,简称LIFO结构
3.栈的相关概念
(1)栈是仅在表尾进行插入,删除操作的线性表
(2)表尾(即an端)称为栈顶Top;表头(即a1端)称为栈底Base
(3)插入元素到栈顶(即表尾)的操作,称为入栈
(4)从栈顶(即表尾)删除最后一个元素的操作,称为出栈
(5)栈与一般线性表有什么不同
区别:仅在运算规则不同
三.队列的定义和特点
1.队列的特性
由于队列的操作具有先进先出的特性,使得队列成为程序设计中解决类似排队问题的有用工具。
2.定义
队列是一种先进先出的线性表。在表的一端插入(表尾),在另一端(表头)删除