首页 > 其他分享 >双向循环链表的实现

双向循环链表的实现

时间:2024-05-06 22:55:05浏览次数:17  
标签:Head DoubleLList Phead 结点 next 链表 循环 双向 New

/********************************************************************************************************
*
*	file name:	Zqh_链表.c
* 	author	 :	[email protected]
* 	date	 :	2024/05/05
*	function :	链表的增删改查
*	note	 :	模板
*	
*  Copyright (c)  2023-2025   [email protected]    All right Reserved
* ******************************************************************************************************/



#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>

//指的是双向循环链表中的结点有效数据类型,用户可以根据需要进行修改
typedef int  DataType_t;

//构造双向循环链表的结点,链表中所有结点的数据类型应该是相同的
typedef struct DoubleLinkedList
{
	DataType_t  		     data; //结点的数据域
	struct DoubleLinkedList	*prev; //直接前驱的指针域
	struct DoubleLinkedList	*next; //直接后继的指针域

}DoubleLList_t;




//创建一个空双向循环链表,空链表应该有一个头结点,对链表进行初始化
DoubleLList_t * DoubleCirLList_Create(void)
{
	//1.创建一个头结点并对头结点申请内存
	DoubleLList_t *Head = (DoubleLList_t *)calloc(1,sizeof(DoubleLList_t));
	if (NULL == Head)
	{
		perror("Calloc memory for Head is Failed");
		exit(-1);
	}

	//2.对头结点进行初始化,头结点是不存储数据域,指针域指向自身即可,体现“循环”
	Head->prev = Head;
	Head->next = Head;

	//3.把头结点的地址返回即可
	return Head;
}



//创建新的结点,并对新结点进行初始化(数据域 + 指针域)
DoubleLList_t * DoubleCirLList_NewNode(DataType_t data)
{
	//1.创建一个新结点并对新结点申请内存
	DoubleLList_t *New = (DoubleLList_t *)calloc(1,sizeof(DoubleLList_t));
	if (NULL == New)
	{
		perror("Calloc memory for NewNode is Failed");
		return NULL;
	}

	//2.对新结点的数据域和指针域(2个)进行初始化,指针域指向结点自身,体现“循环”
	New->data = data;
	New->prev = New;
	New->next = New;

	return New;
}


//双向循环链表头插
bool  insertCirDoublyLinList(DoubleLList_t*Head, DoubleLList_t*New)
{

	DoubleLList_t* Phead;
	Phead=Head->next;

	if (Head==Head->next){
		Phead = New;
		Head->next=Phead;
		return true;
	}
	Phead->prev->next=New;
	New->prev=Phead->prev;
	New->next=Phead;
	Phead->prev=New;
	Head->next=New;
	return true;
}

//双向循环链表头删
bool deleteInCircularDoublyLinkedList(DoubleLList_t*Head)
{
	DoubleLList_t*Phead;
	Phead=Head->next;

	if (Head==Head->next){
		printf("链表为空\n");
		return true;
	}
	
	if (Phead->next!=Phead){

		Head->next=Phead->next;
		Phead->prev->next=Phead->next;
		Phead->next->prev=Phead->prev; //左值指向右值
	}else{
		Head->next=Head;
	}

	Phead->next=NULL;
	Phead->prev=NULL;

	free(Phead);
	return true;

}



标签:Head,DoubleLList,Phead,结点,next,链表,循环,双向,New
From: https://www.cnblogs.com/kencszqh/p/18176135

相关文章

  • 双向链表实现
    /********************************************************************************************************** filename: Zqh_链表.c* author : [email protected]* date : 2024/05/05* function: 链表的增删改查* note : 模板* *Copyright(c)2023-202......
  • 单向循环链表的实现
    /********************************************************************************************************** filename: Zqh_链表.c* author : [email protected]* date : 2024/05/05* function: 链表的增删改查* note : 模板* *Copyright(c)2023-202......
  • 单链表逆序
    逆序原理:保留头节点下一个结点地址,将头节点断开,遍历除头节点以外的节点,将那些节点头插入头节点中。就能实习逆序。/********************************************************************* filename: demo2.c* author :lzj* date :2024/04/23* function:单向链......
  • 以数组为基础实现循环队列
    /*****************************************************************name;CirQueue_Create*function:创建循环队列*parameter;unsighedintsize*ReValue;CirQueue_t**author;小北blog*attention;*date;2024.04.26*history;*version;*Copyright(c)......
  • 头插法新建链表
    新建链表指针结构体typedefintElemType;typedefstructLNode{ ElemTypedata; structLNode*next;//指向下一个结点}LNode,*LinkList;//结构体名LNode==*LinkList;LNode*==LinkList头插法新建链表先建立一个头结点:L=(LinkList)malloc(sizeof(LNode));//带......
  • 尾插法新建链表
    核心代码:tail=head;s->next=NULL;tail->next=s;tail=s;插入过程演示:![[Pastedimage20230623143820.png]]头插法尾插法新建链表完整代码#include<iostream>#include<malloc.h>usingnamespacestd;typedefintElemtype;typedefstructLNode{ El......
  • 高性能摩托车灯降压恒流ic全亮/半亮/循环模式短路保护AP5126
    AP5126是一款PWM工作模式,高效率、外围简单、内置功率管,适用于12-80V输入的高精度降压LED恒流驱动芯片。输出最大功率可达15W,最大电流1.2A。AP5126可实现全亮/半亮功能切换,通过MODE切换:全亮/半亮/循环模式。AP5126工作频率固定在140KHZ,同时内置抖频电路,可以降低对......
  • 考研打卡链表,栈,队列
    1:链表点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedefstructnode{ intdata; structnode*next;}listnode,*list1;typedefstructnow{ intdata; structnow*next,*prve;}listnow,*list2;boollistn(list1&L,intx,inty){ if(x&l......
  • python教程2:if...else...+循环
    一、if判断有单分支、双分支、多分支,下面就是一个多分支的案例:二、缩进三、for循环四、while循环 五、其他random模块 string模块 ......
  • Aveva marine c# 循环中显示进度条
    主要的代码如下 try{WindowManager.Instance.StatusBar.StartProgressDisplay();WindowManager.Instance.StatusBar.ProgressMinimum=0;WindowManager.Instance.StatusBar.ProgressMaximum=100;WindowManager.Instance.StatusBar.Progress=0;W......