資料結構:單迴圈連結串列的建立插入與刪除

大螺丝贼六發表於2024-04-23

資料結構:單迴圈連結串列的建立·插入·刪除

/**
  * @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	
}


相關文章