《大话数据结构》循环链表和双向链表
原创
©著作权归作者所有:来自51CTO博客作者喜欢打篮球的普通人的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、循环链表
定义:
//A的头节点,即(1)
p=rearA->next;
//(2)后继指针的操作
//给我感觉就是,由于后继指针的特殊性,每次操作节点了,就是指向下个节点了,如果是指针操作,就还是老老实实呆在该节点
//注意B的头节点不要了
rearA->next=rearB->next->next;
//B的头节点
q=rearB->next;
//将A表的头节点的值赋值给rearB->next,即(3)
rearB->next=p;
free(p),free(q);
二、双向链表
定义:
tyoedef struct dulnode
{
int data;
struct dulnode *prior;//前置指针
struct dulnode *next;//后继指针
}dulnode;
双向链表比单链表多了可以反向遍历查找,操作过程中:需要更改两个指针变量
双向链表的插入操作:
注意:顺序很重要不能写反
我们在单链表的插入中写过,插入一个node,核心在于:后继指针以及node的操作,现时指针操作,后是节点操作
双向链表,类似,但是需要注意插入的过程
typedef struct dullist
{
int data;
struct dullist *prior;
struct dullist *next;
}dullist;
核心的步骤:
首先是后继的操作
步骤(4)+(2),写的时候,从右往左写,先写(2),再写(4)
(4)是node操作
(2)是指针操作
s->next=p->next(2)
p->next=s(4)
接下来是前驱的操作,都是node操作
步骤(3)+(1)
s->prior=p;(1)
p->next->prior=s;(3)
最后按照(1)-(4)的顺序写下来即可
双向链表的删除操作:
直接说核心思想了
p->prior->next=p->next(1)//后继指针的操作
p->next->prior=p->prior(2)//前去指针的操作
free(p)