单向循环链表

image-20240423212240499

//头插
bool CircLList_HeadInsert(CircLList_t *Head,DataType_t data)
{
	//创建一个新节点
	CircLList_t *New = CircLList_NewNode(data);
	//对单向循环链表的头结点的地址进行备份
	CircLList_t *Phead = Head;
	
	//判断当前链表是否为空,就直接插入
	if (Head->next == Head)
	{
		Head->next = New;
        New->next = New;
		return true;
	}

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

		//判断是否到达尾结点,尾结点的next指针是指向首结点的地址
		if (Phead->next == Head->next)
		{
            New->next = Head->next;     //新节点的直接后继指向原本的首节点
            Head->next = New;   //更新链表的首节点
            Phead->next = New;  //尾节点的next指向新的首节点
			break;
		}
	}	
}	  

image-20240423212316928

//尾插
bool CircLList_TailInsert(CircLList_t *Head,DataType_t data)
{
	//创建一个新节点
	CircLList_t *New = CircLList_NewNode(data);
	//对单向循环链表的头结点的地址进行备份
	CircLList_t *Phead = Head;
	
	//判断当前链表是否为空,就直接插入
	if (Head->next == Head)
	{
		Head->next = New;
        New->next = New;
		return true;
	}

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

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

    return true;
}

image-20240423212349264

//指定位置插入
bool CircLList_DestInsert(CircLList_t *Head,DataType_t destval,DataType_t data)
{
	//创建一个新节点
	CircLList_t *New = CircLList_NewNode(data);
	//对单向循环链表的头结点的地址进行备份
	CircLList_t *Phead = Head;
	
	//判断当前链表是否为空,就直接插入
	if (Head->next == Head)
	{
		Head->next = New;
		return true;
	}

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

		//判断是否找到目标数据,找到了新节点连接目标节点的下一个节点,目标节点再连接新节点
		if (New->data == destval)
		{
			New->next = Phead->next;
			Phead->next = New;
			break;
		}	
	}

	
}

image-20240423212834517

//头删
bool CircLList_HeadDel(CircLList_t *Head)
{
	//对单向循环链表的头结点的地址进行备份
	CircLList_t *Phead = Head;
	CircLList_t *lphead = Head->next;
	//判断当前链表是否为空,为空则直接退出
	if (Head->next == Head)
	{
		printf("linkeflist is empty!\n");
		return false;
	}
    //判断链表中是否只有首节点
    if (Head->next == Head->next->next)
    {
        lphead->next = NULL;
        Head->next = Head;
        free(lphead);
        return true;
    }
    
	//从首结点开始遍历
	while(Phead->next)
	{
		//把头结点的直接后继作为新的头结点
		Phead = Phead->next;

		//判断是否到达尾结点,尾结点的next指针是指向首结点的地址
		if (Phead->next == Head->next)
		{
			break;
		}	
	}
    	Phead->next = Head->next->next;    //让尾节点的next指针指向新的首节点
        Head->next =  Phead->next;  //更新首节点,让头系欸但的next指针指向新的首节点
        lphead->next = NULL;    //旧的首节点的next指针指向NULL,从链表中断开
        free(lphead);//释放
        return true;  
}

image-20240423212909026

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

	while(Phead->next)
	{
		//把头结点的直接后继作为新的头结点
		Phead = Phead->next;

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

	}
}

image-20240423212935313

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

	while(Phead->next)
	{
		//把头结点的直接后继作为新的头结点
		Phead = Phead->next;

		//判断是否到达找到想要删除的目标数据
		if (Phead->data != data)
		{
			printf("没有找到想要删除的文件!\n");
			return false;
		}	
		//找到达找到想要删除的目标数据
		if (Phead->data == data)
		{
			Pphead->next = Phead->next;
			Phead->next =NULL;
			free(Phead);
			break;
		}	

	}
}
posted @ 2024-04-23 21:36  Ikin粉  阅读(37)  评论(0)    收藏  举报