数据结构
文章目录
前言
双向循环链表用的次数是最多的,下面我们看一下双向循环链表的增删改查。
一、双向循环链表初始化
双向循环链表不能出现NULL
typedef int DataType;
typedef struct ListNode
{
DataType a;
struct ListNode *next;
struct ListNode *prior;
}ListNode;
//初始化
int BuyListNode(ListNode **h)
{
*h = (ListNode*)malloc(sizeof(ListNode));
(*h)->next = *h;
(*h)->prior = *h;
return 1;
}
二、双向循环链表的插入
我们在单链表和双链表中插入,是先移动指针到合适位置,然后判断位置是否合法,在进行双向循环链表的插入的时候要先进行判断位置是否合法,然后再移动指针
int charu(ListNode *h,int p,int n)
{
if(NULL==h)
printf("NULL");
if(p<=0||p>listlen(h)+1)
printf("NULL");
//移动指针到要插入位置的前一位
ListNode *q=h;
int i;
for(i=0;i<p-1;i++)
{
q=q->next;
}
ListNode *w=(ListNode*)malloc(sizeof(ListNode));
w->a=n;
w->next=q->next;
w->prior=q;
q->next->prior=w;
q->next=w;
}
具体怎么理解还需要你自己画出来双向循环链表对照着理解就行了
遍历
void listprintf(ListNode *h)
{
ListNode *q=h->next; //q指向第一个节点
while (q!=h) //双向循环链表不为空,所以这个地方要改成q!=h (遍历完成之后回头)
{
printf("%d\n",q->a);
q=q->next;
}
}
三、双向链表的删除
//删除
void shanchu(ListNode *h,int p)
{
if (h==NULL)
printf("NULL");
//判断位置是否合法
if(p<=0)
{
printf("位置不合法");
}
//移动到要删除的前一位
ListNode *q=h;//定义一个新的节点
int i;
for( i=0;i<p-1;i++)
{
q=q->next;
}
ListNode *n=q->next;//定义一个要删除的的节点
n->next->prior=q; //要删除的后一个节点指向要删除的前一个节点
q->next=n->next; //要删除的前一个节点指向要删除的前一个节点
free(n);
printf("删除第%d个位置\n",p);
}
总结
双向循环链表和其他链表差不多,重点还是要掌握他的原理,以及单链表的熟练使用