数据结构-双循环链表

一.双循环列表dcList结构

       双循环列表中有三个成员ListNode * first、 ListNode * last、 size_t size    ,三个成员变量分别是,指向头结点的指针,指向尾部节点的指针,以及链表的大小(即结点的个数)。

数据结构-双循环链表_第1张图片

       其结点类型多了一个前驱指针 ListNode * prev

二.双循环列表的表示

数据结构-双循环链表_第2张图片

三、双循环列表中的重要函数

1.购买结点

数据结构-双循环链表_第3张图片

2.初始化链表

       先申请一个结点,作为链表的头结点,用来其数据域用来存储结点个数(不包括头结点),要让其形成双循环列表,先让链表的头指针,尾指针直线新申请的结点s, 让其循环的话,list->first->prev = list->last;list->last->next = list->first;也就是让头的前驱指向尾指针,尾指针的后继指向头指针。size赋值为0.

数据结构-双循环链表_第4张图片

3.尾插push_back

        尾插的思想是:在链表的尾部插入一个结点,该节点需要改变四个指针指向,先让新结点的前驱指向尾指针,然后尾  指针的后继指向新结点,再让链表的尾指针指向新结点,最后新结点的后继指向头结点,头结点的前驱指向尾结点

数据结构-双循环链表_第5张图片

数据结构-双循环链表_第6张图片

4.显示函数

      显示函数和顺序表,单链表有所区别,主要是它的循环结束条件,不能再用p->next == NULL,因为他是循环的所以需要用 p == list->first。

数据结构-双循环链表_第7张图片

5.查找函数

      首先链表不能为空,然后循环查找(从头结点的下一个查找,并且以再次循环到头结点结束,同时value != p->data) p = p->next; if(p == p->first),return NULL;否者return p 指针,说明找到了。

数据结构-双循环链表_第8张图片

6.删除函数

       先调用find函数,p == NULL ;return 否者free,p结点所指的空间,free之前先链接 p的前驱的后继 指向p的后继,p的后继的前驱 指向p的前驱。 一定要判断删除的结点是否是尾结点,如果是尾结点的话,要让链表的尾指针指向p的后继,这样才能释放p,释放完之后要赋空,预防野指针。最后给结点的size--;

数据结构-双循环链表_第9张图片

四.双循环列表与顺序表、单链表的区别

         双循环链表其他的一些函数操作,类似与单链表的操作,其思想大体一致,区别就是,对链表的结点操作,需要改动四个指针,并且循环结束不能用NULL作为标识,循环一圈是否等于头结点。

你可能感兴趣的:(数据结构)