![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;
}
}
}