单向循环链表(测试通过)
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
typedef int Datatype_t;
typedef struct CirLkList
{
Datatype_t Data;
struct CirLkList *Next;
} CriLkList_t;
CriLkList_t *CirLkList_Create(void)
{
CriLkList_t *Head = (CriLkList_t *)calloc(1, sizeof(CriLkList_t));
if (NULL == Head)
{
perror("calloc memory for CirLkList if failed!\n");
exit(-1);
}
Head->Next = Head;
return Head;
}
CriLkList_t *CirLkList_NewNode(Datatype_t data)
{
CriLkList_t *NewNode = (CriLkList_t *)calloc(1, sizeof(CriLkList_t));
if (NULL == NewNode)
{
perror("calloc memory for NewNode if failed!\n");
exit(-1);
}
NewNode->Data = data;
NewNode->Next = NULL;
return NewNode;
}
void CirLkList_HeadAdd(CriLkList_t *Head, Datatype_t data)
{
CriLkList_t *NewNode = CirLkList_NewNode(data);
if (Head == Head->Next)
{
Head->Next = NewNode;
NewNode->Next = NewNode;
return;
}
{
CriLkList_t *Phead = Head->Next;
while (Phead->Next != Head->Next)
{
Phead = Phead->Next;
}
Phead->Next = NewNode;
NewNode->Next = Head->Next;
Head->Next = NewNode;
}
}
void CirLkList_TailAdd(CriLkList_t *Head, Datatype_t data)
{
CriLkList_t *NewNode = CirLkList_NewNode(data);
if (Head == Head->Next)
{
Head->Next = NewNode;
NewNode->Next = NewNode;
return;
}
CriLkList_t *Phead = Head->Next;
while (Phead->Next != Head->Next)
{
Phead = Phead->Next;
}
Phead->Next = NewNode;
NewNode->Next = Head->Next;
}
void CirLkList_AppointAdd(CriLkList_t *Head, Datatype_t DestVal, Datatype_t data)
{
CriLkList_t *NewNode = CirLkList_NewNode(data);
if (Head == Head->Next)
{
Head->Next = NewNode;
NewNode->Next = NewNode;
return;
}
CriLkList_t *Phead = Head->Next;
CriLkList_t *Dest = NULL;
while (Phead->Data != DestVal)
{
Phead = Phead->Next;
if (Phead->Next == Head->Next && Phead->Data != DestVal)
{
Dest = Phead;
break;
}
}
if (Dest)
{
printf("Can find the DestVal %d!\n", DestVal);
return;
Phead->Next = NewNode;
NewNode->Next = Head->Next;
}
NewNode->Next = Phead->Next;
Phead->Next = NewNode;
}
bool CirLkList_HeadDel(CriLkList_t *Head)
{
if (Head == Head->Next)
return false;
CriLkList_t *Phead1 = Head->Next;
CriLkList_t *Phead2 = Head->Next;
while (Phead1->Next != Head->Next)
{
Phead1 = Phead1->Next;
}
Phead1->Next = Head->Next->Next;
Head->Next = Head->Next->Next;
Phead2->Next = NULL;
free(Phead2);
return true;
}
bool CirLkList_TailDel(CriLkList_t *Head)
{
if (Head == Head->Next)
return false;
CriLkList_t *Phead1 = Head->Next;
CriLkList_t *Phead2 = Head;
while (Phead1->Next != Head->Next)
{
Phead1 = Phead1->Next;
Phead2 = Phead2->Next;
}
Phead2->Next = Head->Next;
Phead1->Next = NULL;
free(Phead1);
return true;
}
bool CirLkList_AppointDel(CriLkList_t *Head, Datatype_t DestVal)
{
if (Head == Head->Next)
return false;
CriLkList_t *Phead1 = Head->Next;
CriLkList_t *Phead2 = Head;
CriLkList_t *Dest = NULL;
while (Phead1->Data != DestVal)
{
Phead1 = Phead1->Next;
Phead2 = Phead2->Next;
if (Phead1->Next == Head->Next && Phead1->Data != DestVal)
{
Dest = Phead1;
break;
}
}
if (Dest)
{
printf("Can find the DestVal %d!\n", DestVal);
return false;
}
else
{
if (Phead1 == Head->Next)
{
CriLkList_t *Phead3 = Head->Next;
CriLkList_t *Phead4 = Head->Next;
while (Phead3->Next != Head->Next)
{
Phead3 = Phead3->Next;
}
Phead3->Next = Head->Next->Next;
Head->Next = Head->Next->Next;
Phead4->Next = NULL;
free(Phead4);
}
else if (Phead1->Next == Head->Next)
{
CriLkList_t *Phead3 = Head->Next;
CriLkList_t *Phead4 = Head;
while (Phead3->Next != Head->Next)
{
Phead3 = Phead3->Next;
Phead4 = Phead4->Next;
}
Phead4->Next = Head->Next;
Phead3->Next = NULL;
free(Phead3);
}
else
{
Phead2->Next = Phead1->Next;
Phead1->Next = NULL;
free(Phead1);
}
return true;
}
}
void Test(CriLkList_t *Head)
{
CriLkList_t *Phead = Head->Next;
while (Phead->Next != Head->Next)
{
printf("%d ", Phead->Data);
Phead = Phead->Next;
}
printf("%d\n", Phead->Data);
}
int main(void)
{
CriLkList_t *Head = CirLkList_Create();
CirLkList_HeadAdd(Head, 10);
CirLkList_HeadAdd(Head, 20);
CirLkList_HeadAdd(Head, 30);
CirLkList_HeadAdd(Head, 40);
CirLkList_HeadAdd(Head, 50);
Test(Head);
CirLkList_TailAdd(Head, 1);
CirLkList_TailAdd(Head, 2);
CirLkList_TailAdd(Head, 3);
CirLkList_TailAdd(Head, 4);
CirLkList_TailAdd(Head, 5);
Test(Head);
CirLkList_AppointAdd(Head, 5, 88);
Test(Head);
CirLkList_HeadDel(Head);
CirLkList_HeadDel(Head);
Test(Head);
CirLkList_TailDel(Head);
Test(Head);
CirLkList_AppointDel(Head, 5);
Test(Head);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!