知识大全 线性表- 链式存储结构- 双链表
Posted 结点
篇首语:多见者博,多闻者智,拒谏者塞,专己者孤。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 线性表- 链式存储结构- 双链表相关的知识,希望对你有一定的参考价值。
双向链表(Double Linked List)
双(向)链表中有两条方向不同的链 即每个结点中除next域存放后继结点地址外 还增加一个指向其直接前趋的指针域
prior
>
注意
①双链表由头指针head惟一确定的
②带头结点的双链表的某些运算变得方便
③将头结点和尾结点链接起来 为双(向)循环链表
双向链表的结点结构和形式描述
①结点结构(见上图a)
②形式描述
typedef struct dlistnode
DataType data;
struct dlistnode *prior *next;
DListNode;
typedef DListNode *DLinkList;
DLinkList head;
双向链表的前插和删除本结点操作
由于双链表的对称性 在双链表能能方便地完成各种插入 删除操作
①双链表的前插操作
>
void DInsertBefore(DListNode *p DataType x)
//在带头结点的双链表中 将值为x的新结点插入*p之前 设p≠NULL
DListNode *s=malloc(sizeof(DListNode));//①
s >data=x;//②
s >prior=p >prior;//③
s >next=p;//④
p >prior >next=s;//⑤
p >prior=s;//⑥
②双链表上删除结点*p自身的操作
>
void DDeleteNode(DListNode *p)
//在带头结点的双链表中 删除结点*p 设*p为非终端结点
p >prior >next=p >next;//①
p >next >prior=p >prior;//②
free(p);//③
注意
与单链表上的插入和删除操作不同的是 在双链表中插入和删除必须同时修改两个方向上的指针
上述两个算法的时间复杂度均为O( )
cha138/Article/program/sjjg/201311/23300相关参考
循环链表(CircularLinkedList) 循环链表是一种首尾相接的链表 循环链表 ()单循环链表——在单链表中将终端结点的指针域NULL改为指向表头结点或开始结点即可 ()多重链的
作为线性表的一种存储结构我们关心的是结点间的逻辑结构(线性关系)而对每个结点的实际地址并不关心所以通常的单链表用图的形式表示 > >
单链表的运算 建立单链表 假设线性表中结点的数据类型是字符我们逐个输入这些字符型的结点并以换行符\\n为输入条件结束标志符动态地建立单链表 的常用方法有如下两种 ()头插法建表 ①算法思
顺序表的存贮特点是利用物理上的相邻关系表达出逻辑上的前驱和后继关系它要求用连续的存储单元顺序存储线性表中各元素因此对顺序表进行插入和删除时需要通过移动数据元素来实现线性表的逻辑上的相邻关系从而影响
单链表的查找运算 ()按序号查找 ①链表不是随机存取结构 在链表中即使知道被访问结点的序号i也不能像顺序表中那样直接按序号i访问结点而只能从链表的头指针出发顺链域 next逐个结点往下搜索
插入运算 ()思想方法 插入运算是将值为x的新结点插入到表的第i个结点的位置上即插入到ai与ai之间 具体步骤 ()找到ai存储位置p ()生成一个数据域为x的新结点*s ()令结点*
()尾插法建表 ①算法思路 从一个空表开始重复读入数据生成新结点将读入数据存放在新结点的数据域中然后将新结点插入到当前链表的表尾上直到读入结束标志为止 > 具体方法【参见动画演示】 注意
()尾插法建带头结点的单链表 ①头结点及作用 头结点是在链表的开始结点之前附加一个结点它具有两个优点: ⒈由于开始结点的位置被存放在头结点的指针域中所以在链表的第一个位置上的操作就和在表的其
> cha138/Article/program/sjjg/201311/23374
链表的每个元素构成一个结点结点定义如下 Typedefstructnode DataTypedata;/*每个元素数据信息*/ structnode*next;/*存放后继元素的地址*/