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

单向循环链表的实现

时间:2024-05-06 22:33:57浏览次数:34  
标签:结点 单向 Head CircLList next 链表 循环 Phead

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



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

//构造单向循环链表的结点,链表中所有结点的数据类型应该是相同的
typedef struct CircularLinkedList
{
	DataType_t  		 data; //结点的数据域
	struct LinkedList	*next; //结点的指针域

}CircLList_t;


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

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

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

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

	//2.对新结点的数据域和指针域进行初始化
	New->data = data;
	New->next = NULL;

	return New;
}

//头插
bool CircLList_HeadInsert(CircLList_t *Head,DataType_t data)
{
		
	CircLList_t* Phead = Head; //定义一个变量,保存头结点

		//1.创建新的结点,并对新结点进行初始化
	CircLList_t *New = CircLList_NewNode(data);
	if (NULL == New)
	{
		printf("can not insert new node\n");
		return false;
	}

	//2.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		Head->next = New;
		New ->next = New;
		return true;
	}

	//3.循环遍历到尾结点
		while(Phead->next){
		//把头结点的直接后继作为新的头结点
		Phead = Phead->next;

		//输出头结点的直接后继的数据域
		printf("data = %d\n",Phead->data);

		//判断是否到达尾结点,尾结点的next指针是指向首结点的地址
		if (Phead->next == Head->next)
		{
			break;
		}	
	}

	//4.如果链表为非空,则把新结点插入到链表的头部
	New->next  = Head->next;
	Head->next = New;
	Phead ->next = New;


	return true;
}

//尾插
bool CircLList_TailInsert(CircLList_t *Head,DataType_t data)
{
		//判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		Head->next = New;
		New ->next = New;
		return true;
	}

	CircLList_t* Phead = Head ->next;	//尾结点,目前指向首结点
	while(Phead->next){
		//把首结点的直接后继作为新的首结点
		Phead = Phead->next;

		//输出头结点的直接后继的数据域
		printf("data = %d\n",Phead->data);

		//判断是否到达尾结点,尾结点的next指针是指向首结点的地址
		if (Phead->next == Head->next)
		{
			break;
		}	
	}

	New ->next   = Phead ->next; 
	Phead ->next = New;


}



//遍历链表
bool CircLList_Print(CircLList_t *Head)
{
	//对单向循环链表的头结点的地址进行备份
	CircLList_t *Phead = Head;
	
	//判断当前链表是否为空,为空则直接退出
	if (Head->next == Head)
	{
		printf("current linkeflist is empty!\n");
		return false;
	}

	//从首结点开始遍历
	while(Phead->next)
	{
		//把头结点的直接后继作为新的头结点
		Phead = Phead->next;

		//输出头结点的直接后继的数据域
		printf("data = %d\n",Phead->data);

		//判断是否到达尾结点,尾结点的next指针是指向首结点的地址
		if (Phead->next == Head->next)
		{
			break;
		}	
	}

	return true;
}

//头删
bool LList_HeadDel(LList_t *Head)
{
	//对单向循环链表的头结点的地址进行备份
	CircLList_t *Phead = Head;

	
}






int main(int argc, char const *argv[])
{
	
	return 0;
}

标签:结点,单向,Head,CircLList,next,链表,循环,Phead
From: https://www.cnblogs.com/kencszqh/p/18176092

相关文章

  • 单链表逆序
    逆序原理:保留头节点下一个结点地址,将头节点断开,遍历除头节点以外的节点,将那些节点头插入头节点中。就能实习逆序。/********************************************************************* 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......
  • for循环打印九九乘法表
    1、九九乘法表例;1*1=1  2*1=2  2*2=4  3*1=3  3*2=6  3*3=9  4*1=4  4*2=8  4*3=12  4*4=16  5*1=5  5*2=10  5*3=15  5*4=20  5*5=25  6*1=6  6*2=12  6*3=18  6*4=24  6*5=30  6*6=36  7......
  • 力扣-430. 扁平化多级双向链表
    1.题目题目地址(430.扁平化多级双向链表-力扣(LeetCode))https://leetcode.cn/problems/flatten-a-multilevel-doubly-linked-list/题目描述你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的子指针。这个子指针可能指向一个单独的双向链表,也......