資料結構:單迴圈連結串列的建立·插入·刪除
/**
* @file name: 單迴圈連結串列的建立·插入·刪除
* @brief 實現單迴圈連結串列的建立刪除插入的功能
* @author liuliu@163.com
* @date 2024/04/23
* @version 1.0 :版本
* @note noone
* CopyRight (c) 2023-2024 liuliu@163.com All Right Reseverd*/
//定義一個連結串列中節點的資料域型別
typedef int datatype_t;
//定義節點的型別並取別名
typedef struct Circular_LList{
datatype_t data;
*next;
}CirLList_t;
//建立一個空連結串列,含有一個頭節點並初始化
CirLList_t *CirLList_Create()
{
CirLList_t *Head=(CirLList_t *)calloc(1,sizeof(CirLList_t ));
if(NULL==Head)
{
perror("calloc memory for Head is failed");
exit(-1);
}
Head-->next=NULL;
return Head;
}
//建立一個新的節點,並初始化成員變數
CirLList_t* CirLList_Newnode_Create(datatype_t data)
{
CirLList_t * New=(CirLList_t *)calloc(1,sizeof(CirLList_t ));
if(NULL==New)
{
perror("calloc memory for New is failed");
exit(-1);
}
//為成員初始化
New-->data=data;
New-->next=NULL;
return New;
}
//判斷連結串列是否為空
bool CirLList_Isempoty(CirLList_t* Head)
{
if(Head-->next==NULL)
{
return ture;
}
return false;
}
//從頭部插入一個節點
bool CirLList_t* CirLList_HeadAdd(CirLList_t* Head,CirLList_t * New)
{
if(New==NULL)
{
return false;
}
//當連結串列為空的情況
if(CirLList_Isempoty(CirLList_t* Head))
{
Head-->next=New;
New-->next=New;
return ture;
}
//連結串列不為空的情況
New-->next=Head-->next;
Head-->next=New;
return ture;
}
//從尾部插入一個節點
bool CirLList_t* CirLList_TailAdd(CirLList_t* Head,CirLList_t * New)
{
CirLList_t* current=Head-->next;//記錄當前節點的地址
if(New==NULL)
{
return false;
}
//當連結串列為空的情況
if(CirLList_Isempoty(CirLList_t* Head))
{
Head-->next=New;
New-->next=New;
return ture;
}
//連結串列不為空的情況,遍歷找出尾部節點
while(current)
{
if(current-->next==Head-->next)
{
brake;
}
current=current-->next;
}
//插入節點到尾部節點後面
current-->next=New;
New-->next=Head-->next;
return ture;
}
//從中間插入一個節點
bool CirLList_t* CirLList_MidAdd(CirLList_t* Head,CirLList_t * New,CirLList_t *Des)
{
CirLList_t* current=Head-->next;//記錄當前節點的地址
if(New==NULL)
{
return false;
}
//當連結串列為空的情況
if(CirLList_Isempoty(CirLList_t* Head))
{
Head-->next=New;
New-->next=New;
return ture;
}
//連結串列不為空的情況,遍歷找出目標節點
while(current)
{
if(current-->data==Des-->data)
{
brake;
}
current=current-->next;
}
//插入節點到目標節點後面
New-->next=current-->next;
current-->next=New;
return ture;
}
//從頭部刪除節點
void CirLList_HeadDel(CirLList_t* Head)
{
CirLList_t* current=Head-->next;//記錄當前節點的地址
CirLList_t* phead=Head-->next//記錄首地址的地址
//遍歷找到尾節點
while(current)
{
if(current-->next==Head-->next)
{
brake;
}
current=current-->next;
}
//刪除節點並釋放首節點地址
current-->next=Head-->next-->next;
phead-->next=NULL;
Head-->next=current-->next;
free(phead);
return
}
//尾部刪除節點
void CirLList_TailDel(CirLList_t* Head)
{
CirLList_t* current=Head-->next;//記錄當前節點的地址
CirLList_t* prev=Head//記錄當前地節點的直接前驅的地址
CirLList_t* prev_current=prev//記錄尾部節點的直接前驅的地址
//遍歷找到尾節點
while(current)
{
if(current-->next==Head-->next)
{
prev_current=prev;
brake;
}
current=current-->next;
prev=prev-->next;
}
//刪除節點並釋放節點地址
prev_current-->next=Head-->next;
current-->next=NULL;
free(current);
return ;
}
//從中間刪除節點
void CirLList_MidDel(CirLList_t* Head,CirLList_t* Dest)
{
CirLList_t* current=Head-->next;//記錄當前節點的地址
CirLList_t* prev=Head//記錄當前地節點的直接前驅的地址
CirLList_t* prev_current=prev//記錄要刪除節點的直接前驅的地址
//遍歷找到要刪除的目標節點並找到要刪除節點的直接前驅
while(current)
{
if(current-->data==Dest-->data)
{
prev_current=prev;
brake;
}
current=current-->next;
prev=prev-->next;
}
//刪除節點並釋放節點地址
prev_current-->next=current-->next;
current-->next=NULL;
free(current);
return
}