一、双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。双向链表的基本操作与单链表基本一样,除了插入和删除的时候需要更改两个指针变量,需要注意的是修改的顺序很重要,插入如图3-14-5,删除如图3-14-6。
由于引入了prev指针,insert和delete函数中都有一些特殊情况需要用特殊的代码处理,不能和一般情况用同样的代码处理,这非常不爽,如果在表头和表尾各添加一个Sentinel节点(这两个节点只用于界定表头和表尾,不保存数据),就可以把这些特殊情况都转化为一般情况了。如图26.6
在《队列的链式存储结构》中我们使用单链表实现队列的尾进头出,下面我们演示使用双向链表实现队列的头进尾出。
参考:《Linux C编程 一站式学习》
1 | /************************************************************************* > File Name: doublylinkedlist.h > Author: Simba > Mail: dameng34@163.com > Created Time: Fri 28 Dec 2012 08:02:35 PM CST ************************************************************************/ #ifndef DOUBLYLINKEDLIST_H typedef typedef node *link; link make_node( #endif |
1 | /************************************************************************* > File Name: doublylinkedlist.c > Author: Simba > Mail: dameng34@163.com > Created Time: Fri 28 Dec 2012 08:07:21 PM CST ************************************************************************/ #include<stdio.h> node tailsentinel; static link head = &headsentinel; link make_node( void free_node(link p) link search( void insert(link p) void deletep(link p) void traverse( void destroy( void enqueue(link p) link dequeue( |
1 | /************************************************************************* > File Name: main2.c > Author: Simba > Mail: dameng34@163.com > Created Time: Fri 28 Dec 2012 08:18:57 PM CST ************************************************************************/ #include<stdio.h> void print_item(link p) int main( p = make_node( |
输出为:
解决的error:
关于错误 error C2275: “XXX”: 将此类型用作表达式非法
在移植c++代码到c的时候,经常会出现一个奇怪的错误, error C2275: “XXX”: 将此类型用作表达式非法,这个错误是由于c的编译器要求将变量的定义放在所有函数调用语句之前,而c++没有这样的要求造成的。解决的办法就是把变量的定义全部放在变量的生存块的开始。
------------------------------------------------------------------------------------------------------------------------------------
二、将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表就称为单循环链表,简称循环链表(circular linked list)。如下图所示。
其实循环链表和单链表的主要差异就在于循环的判断条件上,原来是判断p->next是否为空,现在则是p->next不等于头结点,则循环未结束。
我们在《队列的顺序存储结构(循环队列)》中使用数组实现了环形队列,我们还要“假想”它是首尾相接的,而如果基于链表实现环形队列,我们本来就可以用指针串成首尾相接的。把上面的程序改成双向环形链表也非常简单,只需要将
把doublylinkedlist.c中的
node tailsentinel;
node headsentinel = {0, NULL, &tailsentinel};
node tailsentinel = {0, &headsentinel, NULL};
static link head = &headsentinel;
static link tail = &tailsentinel;
改成:
node sentinel = {0, &sentinel, &sentinel};
static link head = &sentinel;
再把doublylinkedlist.c中所有的tail替换成head即可,相当于把head和tail合二为一了。如图26.7:
原文链接: https://www.cnblogs.com/javawebsoa/archive/2013/04/26/3045554.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/86133
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!