数据结构——双向循环链表(八)

数据结构


前言

双向循环链表用的次数是最多的,下面我们看一下双向循环链表的增删改查。

一、双向循环链表初始化

双向循环链表不能出现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); 
}

在这里插入图片描述

总结

双向循环链表和其他链表差不多,重点还是要掌握他的原理,以及单链表的熟练使用

猜你喜欢

转载自blog.csdn.net/qq_51963216/article/details/128817905