数据结构-双循环链表
一.双循环列表dcList结构
双循环列表中有三个成员ListNode * first、 ListNode * last、 size_t size ,三个成员变量分别是,指向头结点的指针,指向尾部节点的指针,以及链表的大小(即结点的个数)。
其结点类型多了一个前驱指针 ListNode * prev
二.双循环列表的表示
三、双循环列表中的重要函数
1.购买结点
2.初始化链表
先申请一个结点,作为链表的头结点,用来其数据域用来存储结点个数(不包括头结点),要让其形成双循环列表,先让链表的头指针,尾指针直线新申请的结点s, 让其循环的话,list->first->prev = list->last;list->last->next = list->first;也就是让头的前驱指向尾指针,尾指针的后继指向头指针。size赋值为0.
3.尾插push_back
尾插的思想是:在链表的尾部插入一个结点,该节点需要改变四个指针指向,先让新结点的前驱指向尾指针,然后尾 指针的后继指向新结点,再让链表的尾指针指向新结点,最后新结点的后继指向头结点,头结点的前驱指向尾结点
4.显示函数
显示函数和顺序表,单链表有所区别,主要是它的循环结束条件,不能再用p->next == NULL,因为他是循环的所以需要用 p == list->first。
5.查找函数
首先链表不能为空,然后循环查找(从头结点的下一个查找,并且以再次循环到头结点结束,同时value != p->data) p = p->next; if(p == p->first),return NULL;否者return p 指针,说明找到了。
6.删除函数
先调用find函数,p == NULL ;return 否者free,p结点所指的空间,free之前先链接 p的前驱的后继 指向p的后继,p的后继的前驱 指向p的前驱。 一定要判断删除的结点是否是尾结点,如果是尾结点的话,要让链表的尾指针指向p的后继,这样才能释放p,释放完之后要赋空,预防野指针。最后给结点的size--;
四.双循环列表与顺序表、单链表的区别
双循环链表其他的一些函数操作,类似与单链表的操作,其思想大体一致,区别就是,对链表的结点操作,需要改动四个指针,并且循环结束不能用NULL作为标识,循环一圈是否等于头结点。