当前位置:首页 > 数码 > 双链表-线性表链式实现的终极指南 (双链表存储线性表优点)

双链表-线性表链式实现的终极指南 (双链表存储线性表优点)

admin6个月前 (05-08)数码21
单链表与双链表:全面的比较 引言 单链表和双链表是两种基本的数据结构,广泛用于计算机科学和软件开发中。它们都是线性表的链式实现,这意味着它们使用指针将数据项连接成链式结构。这两种数据结构之间的主要区别在于它们的节点结构。 节点结构 单链表节点包含以下字段: 数据字段:存储数据项。 下一个指针:指向链表中下一个节点。 双链表节点包含以下字段: 数据字段:存储数据项。 下一个指针:指向链表中下一个节点。 上一个指针:指向链表中上一个节点。 特点和优点 单链表 优点: 内存效率高:仅需存储数据字段和下一个指针,因此内存占用更少。 插入和删除效率高:插入和删除操作只需要重新分配指针,而无需移动数据。 易于实现:由于其简单的结构,单链表相对容易实现。 缺点: 只能按顺序遍历:遍历单链表需要从头节点开始并逐个节点前进,这可能对于大型链表效率较低。 不支持双向遍历:无法从尾节点向头节点遍历链表。 双链表 优点: 支持双向遍历:双链表可以从头节点或尾节点双向遍历,这提高了遍历效率。 插入和删除更加方便:在双链表中插入或删除节点不需要修改其他节点的数据字段,只需重新分配指针即可。 定位节点更加容易:可以从两个方向定位节点,这使得寻找特定节点更加容易。 缺点: 内存开销更大:由于包含额外的上一个指针,双链表的节点占用更多的内存。 插入和删除成本稍高:虽然插入和删除操作只需要重新分配指针,但涉及的指针较多,可能导致稍高的成本。 常见应用程序 单链表: 栈和队列等基本数据结构的实现。 存储有序数据,例如:排序列表。 作为其他更复杂数据结构(如哈希表)的基础。 双链表: 浏览器后退和前进历史记录的实现。 允许双向遍历的列表,例如:编辑器中用于管理文本插入和删除。 在需要快速查找和删除节点的应用程序中,例如:缓存或LRU队列。 性能比较 在性能方面,单链表和双链表有以下差异: 内存使用:双链表的节点占用更多的内存,因为它们包含额外的上一个指针。 插入和删除:对于单个插入和删除操作,单链表通常更有效率,因为涉及的指针较少。对于大量插入和删除操作,双链表更占优势,因为它不需要移动数据。 遍历:双链表支持双向遍历,这可能会提高遍历效率,尤其是在大型链表中。 结论 单链表和双链表都是重要的线性表数据结构,具有不同的优点和缺点。单链表内存效率高、插入和删除效率高,而双链表支持双向遍历,查找和删除节点更加方便。根据特定应用程序的需求和性能要求,选择合适的结构至关重要。

线性表- 链式存储结构- 循环链表

循环链表(Circular Linked List)

循环链表是一种首尾相接的链表

循环链表

( )单循环链表 ——在单链表中 将终端结点的指针域NULL改为指向表头结点或开始结点即可

( )多重链的循环链表 ——将表中结点链在多个环上

带头结点的单循环链表

注意

判断空链表的条件是head==head >next;

仅设尾指针的单循环链表

用尾指针rear表示的单循环链表对开始结点a 和终端结点a n 查找时间都是O( ) 而表的操作常常是在表的首尾位置上进行 因此 实用中多采用尾指针表示单循环链表 带尾指针的单循环链表可见下图

注意

判断空链表的条件为rear==rear >next;

循环链表的特点

循环链表的特点是无须增加存储量 仅对表的链接方式稍作改变 即可使得表处理更加方便灵活

【例】在链表上实现将两个线性表(a a … a n )和(b b … b m )连接成一个线性表(a … a n b …b m )的运算

分析 若在单链表或头指针表示的单循环表上做这种链接操作 都需要遍历第一个链表 找到结点a n 然后将结点b 链到a n的后面 其执行时间是O(n) 若在尾指针表示的单循环链表上实现 则只需修改指针 无须遍历 其执行时间是O( )

相应的算法如下

LinkList Connect(LinkList A LinkList B)

{//假设A B为非空循环链表的尾指针

LinkList p=A >next;//①保存A表的头结点位置

A >next=B >next >next;//②B表的开始结点链接到A表尾

free(B >next);//③释放B表的头结点

B >next=p;//④

return B;//返回新循环链表的尾指针

注意

①循环链表中没有NULL指针 涉及遍历操作时 其终止条件就不再是像非循环链表那样判别p或p >next是否为空 而是判别它们是否等于某一指定指针 如头指针或尾指针等

②在单链表中 从一已知结点出发 只能访问到该结点及其后续结点 无法找到该结点之前的其它结点 而在单循环链表中 从任一结点出发都可访问到表中所有结点 这一优点使某些运算在单循环链表上易于实现

lishixinzhi/Article/program/sjjg//

[线性表 链表实验报告]链表线性表

实验一:线性表运算的实现

班级 姓名 学号

一、实验预备知识

2 复习如何用主函数将多个函数连在一起构成一个C++完整程序。

二、实验目的

1 掌握线性表的顺序和链式存储结构

2 熟练运用线性表在顺序存储方式下的初始化、创建、输出、插入和删除运算

3 熟练运用线性表在链式存储方式下的创建、输出、插入和删除运算

三、实验要求

1 编写初始化并创建线性表和输出线性表的算法。

2 编写对线性表插入和删除运算算法,要判断位置的合法性和溢出问题。

3 编写一个主函数,将上面函数连在一起,构成一个完整的程序。

4将实验源程序调试并运行,写出输入、输出结果,并对结果进行分析。

四、实验步骤

◇顺序表实验内容:

1.给定的线性表为L=(12,25,7,42,19,38),元素由键盘输入。

2.初始化并建立顺序表。

3.编写顺序表输出算法。(内存中开辟的单元数为8)

4.依次插入3,21,15三个数,分别插入在第4,6和2位置,每插入一次都要输出一次顺序表。

5.删除第5,第3和第12个位置上的元素,每删除一个元素都要输出一次顺序表。 ◇单链表实验内容:

1.给定的线性表为L=(12,25,7,42,19,38),元素由键盘输入。

2.建立一个带表头结点的单链表(前插入法和尾插入法都可以)。

双链表

3.编写单链表输出算法。

4.依次插入3,21,15三个数,分别插入在第4,6和12位置,每插入一次都要输出一次单链表。

5.删除第5,第3和第12个位置上的元素,每删除一个元素都要输出一次单链表。

五、实验程序

◇顺序表实验

//LinkList.h

#define MAXSIZE 8

typedef int DataType;

typedef struct{

DataType data[MAXSIZE];

void creat_seqlist(Seqlist &s);

void display_seqlist(Seqlist &s);

int insert_seqlist(Seqlist &s, int i, DataType x);

int delet_seqlist(Seqlist &s, int i);

#includeSeqlist.h

void creat_seqlist(Seqlist &s)

while(x != -1){

void display_seqlist(Seqlist &s)

int insert_seqlist(Seqlist &s, int i, DataType x)

if( == MAXSIZE-1){

cout + 2){ cout= i-1;j --) [j+1] = [j]; [i-1] =x ; ++; return 1;

int delet_seqlist(Seqlist &s, int i)

[j-1] = [j];

#includeSeqlist.h

Seqlist s_list;

creat_seqlist(s_list);

cout>d; cout>x; s=insert_seqlist(s_list ,d,x); if(s==1){ cout>d; s=delet_seqlist(s_list,d);

if(s==1){ cout

运行结果:

请输入数据(以输入-1结束)

12 25 7 42 19 38 -1

顺序表为:

12 25 7 42 19 38

插入操作

请输入插入的位置:4

请输入要插入的数据:3

插入后的顺序表为:

12 25 7 3 42 19 38

请输入插入的位置:6

请输入要插入的数据:21

插入后的顺序表为:

12 25 7 3 42 21 19 38

请输入插入的位置:2

请输入要插入的数据:15

表满!

删除操作

请输入删除元素的位置:5

删除后的顺序表为:

12 25 7 3 21 19 38

请输入删除元素的位置:3

删除后的顺序表为:

12 25 3 21 19 38

请输入删除元素的位置:12

不存在该元素!

Press any key to continue

◇单链表实验

//LinkList.h

typedef int DataType;

typedef struct Node{

DataType data;

struct Node *next;

}LNode,*LinkList;

void Creat_LinkList(LinkList &L); //创建链表

void Show_LinkList(LinkList &L); //显示数据

LNode * Get_LinkList(LinkList &L, int i); //获得第i个结点的地址 int Insert_linklist(LinkList &L,int i,DataType x); //插入结点

int Delete_LinkList(LinkList &L,int i); //删除结点

#includeLinkList.h

void Creat_LinkList(LinkList &L)

s = new LNode;

s->next = L;

//头插法创建带头结点的链表 cout>x; while(x != -1){ s = new LNode; s->next = L; L->data = x; L = s; cin>>x; }

void Show_LinkList(LinkList &L)

p = L->next;

while(p!=NULL){

p = p->next; //显示数据

LNode * Get_LinkList(LinkList &L, int i)

q = L->next;

while(q != NULL && j

q = q->next;

//获得第i个结点的地址

int Insert_LinkList(LinkList &L, int i, DataType x)//插入结点 {

LNode *p, *s;

p = Get_LinkList(L,i-1);

if(p == NULL){

coutdata = x; s->next = p->next; p->next = s; return 1; }

int Delete_LinkList(LinkList &L,int i)

LNode *p, *s;

p = Get_LinkList(L,i-1);

if(p == NULL){

//删除结点 coutnext == NULL){ cout

s = p->next;

p->next = s->next; delete s;

#include #includeLinkList.h

LinkList H;

Creat_LinkList(H); Show_LinkList(H);

} cout>d; cout>x; s = Insert_LinkList(H,d,x); if(s == 1){ cout>d; s = Delete_LinkList(H,d); if(s == 1){ cout

运行结果:

请输入数据(以输入-1结束) 12 25 7 42 19 38 -1 单链表为:

38 19 42 7 25 12

插入操作

请输入插入的位置:4 请输入要插入的数据:3 插入后的单链表为: 38 19 42 3 7 25 12 请输入插入的位置:6 请输入要插入的数据:21 插入后的单链表为:

38 19 42 3 7 21 25 12 请输入插入的位置:12 请输入要插入的数据:15 插入位置错误!

删除操作

请输入删除元素的位置:5 删除后的单链表为:

38 19 42 3 21 25 12 请输入删除元素的位置:3 删除后的单链表为: 38 19 3 21 25 12

请输入删除元素的位置:12 插入位置的前驱结点不存在!

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: 双链表