首页 > 其他分享 >单向循环链表实现头插、尾插、中间插、头删、尾删、中间删

单向循环链表实现头插、尾插、中间插、头删、尾删、中间删

时间:2024-04-25 21:37:03浏览次数:15  
标签:结点 单向 Head CircLList next 链表 中间 Phead

*  name     :单向循环链表
*  author   :[email protected]
*  data     :2024/04/23
*  function :设计一个单向循环链表,实现头插、尾插、中间插、头删、尾删、中间删
*  noto     :None
*
*  CopyRight  (c)   2023-2024   [email protected]   A1l Right Reseverd
*
****************************************/

//指的是单向循环链表中的结点有效数据类型,用户可以根据需要进行修改
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 new node\n");
        return false;
    }
    //2.判断链表是否为空,如果为空,则把新结点作为首结点,体现“循环”
    if(Head->next == Head)
    {
        Head->next = New;
        New->next = New;
        return true;
    }
    //3.如果链表是非空的,则需要对链表尾结点的next指针进行处理,指向首结点
    //要遍历了,备份头结点地址
    while(Phead->next)
    {
        Phead = Phead->next;
        
        if(Phead->next == Head->next)
        {
            break;
        }
    }
    Phead->next = New;//尾结点的next指针指向新的首结点
    
    New->next = Head->next;//新结点的next指针指向原来的首结点
    
    Head->next = New;//更新首结点地址,让头结点的next指针指向新结点
    
    return true;
}

//尾插
bool CircLList_TailInsert(CircLList_t *Head,DataType_t data)
{
	CircLList_t *Phead = Head;//备份头结点的地址
    
    //1.创建新的结点,并对新结点进行初始化
    CircLList_t *New = CircLList_NewNode(data);
    if(NULL == New)
    {
        printf("can not new node\n");
        return false;
    }
    //2.判断链表是否为空,如果为空,则把新结点作为首结点,体现“循环”
    if(Head->next == Head)
    {
        Head->next = New;
        New->next = New;
        return true;
    }
     //3.如果链表是非空的,则需要对链表尾结点的next指针进行处理,指向首结点
    //要遍历了,备份头结点地址
    while(Phead->next)
    {
        Phead = Phead->next;
        
        if(Phead->next == Head->next)
        {
            break;
        }
    }
    Phead->next = New;//旧的尾结点的next指针指向新结点
    New->next = Head->next;//新结点的next指针指向首结点地址
    
    return ture;
}

//指定位置插入--myself
bool CircLList_DestInsert(CircLList_t *Head,DataType_t destval,DataType_t data)
{
	CircLList_t *Phead = Head;//备份头结点的地址
    
    //1.创建新的结点,并对新结点进行初始化
    CircLList_t *New = CircLList_NewNode(data);
    if(NULL == New)
    {
        printf("can not new node\n");
        return false;
    }
    //2.判断链表是否为空,如果为空,则把新结点作为首结点,体现“循环”
    if(Head->next == Head)
    {
        Head->next = New;
        New->next = New;
        return true;
    }
    //3.如果链表是非空的,则需要对链表尾结点的next指针进行处理,指向首结点
    //要遍历了,备份头结点地址
    while(Phead->next)
    {
        Phead = Phead->next;
        
        if(Phead->next == Head->next)
        {
            break;
        }
    }
    
    
    
    
}

//遍历链表
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;
    
    //对单向循环链表的首结点的地址进行备份
    CircLList_t *Temp = Head->next;
    
     //2.判断链表是否为空,如果为空,则退出
    if(Head->next == Head)
    {
        printf("linkedlist is Empty\n");
        return true;
    }
    //3.判断链表中是否只有首结点
    if(Head->next == Head->next->next)
    {
        Temp->next = NULL;//首结点的next指针指向NULL
        Head->next = Head;//头结点的next指针指向头结点,体现“循环”
        free(Temp);       //释放首结点
        return ture;
    }
    //4.如果链表是非空的,则需要对链表尾结点的next指针进行处理,指向新的首结点
    while(Phead->next)
    {
        Phead = Phead->next;
        
        if(Phead->next == Head->next)
        {
            break;
        }
    }
    Phead->next = Head->next->next;//让尾结点的next指针指向新的首结点
    
    Head->next = Phead->next;//更新首结点,让头结点的next指针指向新的首结点
    
    Temp->next = NULL;//旧的首结点的next指针指向NULL,从链表中断开
    
    free(Temp);
    
    return ture;

	
}

标签:结点,单向,Head,CircLList,next,链表,中间,Phead
From: https://www.cnblogs.com/CamelliaWY/p/18158633

相关文章

  • 以链表作为基础实现栈空间(链式栈)
    数据结构以链表作为基础实现栈空间(链式栈)/****************************************************************************************************************** * filename : LinkedStack.c* author : [email protected]* data : 2024/04/25* function : 链式栈......
  • 单链表的头插、尾插、中间插、头删、尾删、中间删
    //指的是单向链表中的结点有效数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造链表的结点,链表中所有结点的数据类型应该是相同的typedefstructLinkedList{ DataType_t data;//结点的数据域 structLinkedList *next;//结点的指针域}LList_t;......
  • 单向链表的学习
    单向链表的学习链表:链式存储的线性表。单向链表的优缺点优点插入、删除时只需要调整几个指针,无需移动任何数据当数据节点数量较多时,无需一整片较大的连续内存空间,可以灵活利用离散的内存当数据节点数量变化剧烈时,内存的释放和分配灵活,速度快缺点在节点中,需要多余的指......
  • 双向链表的学习
    双向链表的学习经过单链表、双链表的学习,可以总结链表的适用场合:适合用于节点数目不固定,动态变化较大的场合适合用于节点需要频繁插入、删除的场合适合用于对节点查找效率不十分敏感的场合双向链表的增删改查实现双向链表的初始化//指的是双向链表中的节点有效数据......
  • 双向循环链表的增删改查功能
    数据结构双向循环链表双向循环链表的增删改查/****************************************************************************************************************** * filename : DoubleCirLinkedList.c* author : [email protected]* data : 2024/04/24* funct......
  • 基于c语言数据结构-双循环链表
    DoubleCircularLinkedList双循环链表/**************************************************************函数名称:*函数功能:设计双向循环链表的接口*函数参数:*返回结果:*注意事项:None*函数作者:zcx982795194@[email protected]*创建日期:2024/04/25*修......
  • 数据结构_链表_单向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)
    版本:2024年4月25日V1.0发布于博客园/***@filename:CircularLinkedList.c*@brief:实现单向循环链表的相关功能*@author:[email protected]*@date:2024/04/25*@version:1.1*@note:*CopyRight(c)2023-2024RISE_A......
  • 数据结构——双向循环链表
    二、双向循环链表(一)双向循环链表的构造双向循环链表的首结点中的prev指针成员指向链表的尾结点,并且双向循环链表的尾结点里的next指针成员指向链表的首结点,所以双向循环链表也属于环形结构。1)构造双向循环链表的结点//双向链表中的结点有效数据类型,用户可以根据需要进行修......
  • 双向循环链表的插入和删除
    数据结构线性表--双向循环链表操作**注意!!!**怎么说,今天(2024.4.24)找一个小小的运行bug(没有报错)找了非常之久,明天继续把这些代码补齐,啊啊啊,但是感谢还是把这个bug找出来(这段话我不会删的)~~测试该程序的相关头文件和定义以及相关函数最后一个代码块。/****************......
  • 双向链表
    /**************************************************************************************设计双向链表的接口***Copyright(c)[email protected]*************************************************************************......