首頁 > 軟體

C/C++實現線性單連結串列的範例程式碼

2022-05-26 18:02:58

線性單連結串列簡介

使用鏈儲存結構的線性儲存結構為線性單連結串列,線性儲存結構是元素邏輯結構一對一,鏈儲存結構是元素物理結構不連續,線性單連結串列操作沒有限制,線性單連結串列優點是可以直接插入和刪除元素,線性單連結串列缺點是不可以使用下標獲取和修改元素.

C語言實現程式碼

#include<stdio.h>//包含標準輸入輸出檔案
#include<stdlib.h>//包含標準庫檔案
typedef struct element//元素
{
	int data;//資料
	struct element*next;//下一個
}Element;//元素
typedef struct
{
	Element*head;//頭
	int length;//長度
}Single_Linked_List;//單連結串列
Single_Linked_List Single_Linked_List_Create(void)//單連結串列創造
{
	return(Single_Linked_List){(Element*)calloc(1,sizeof(Element)),0};//單連結串列頭初始化為分配1個元素資料型別動態記憶體返回值,單連結串列長度初始化為0,返回單連結串列並且退出函數
}
int Single_Linked_List_Obtain_Length(Single_Linked_List*single_linked_list/*單連結串列*/)//單連結串列獲取長度
{
	return single_linked_list->length;//返回單連結串列長度並且退出函數
}
void Single_Linked_List_Insert(Single_Linked_List*single_linked_list/*單連結串列*/,int insert_index/*插入索引*/,int insert_data/*插入資料*/)//單連結串列插入
{
	Element*insert_element_prev=single_linked_list->head,*insert_element=(Element*)calloc(1,sizeof(Element));//插入元素上一個初始化為單連結串列頭,插入元素初始化為分配1個元素資料型別動態記憶體返回值
	for(int index=0;index<insert_index;++index)//索引初始化為0,索引小於插入索引,索引累加1
		insert_element_prev=insert_element_prev->next;//插入元素上一個賦值為插入元素上一個下一個
	insert_element->data=insert_data;//插入元素資料賦值為插入資料
	insert_element->next=insert_element_prev->next;//插入元素下一個賦值為插入元素上一個下一個
	insert_element_prev->next=insert_element;//插入元素上一個下一個賦值為插入元素
	++single_linked_list->length;//單連結串列長度累加1
}
void Single_Linked_List_Delete(Single_Linked_List*single_linked_list/*單連結串列*/,int delete_index/*刪除索引*/)//單連結串列刪除
{
	Element*delete_element_prev=single_linked_list->head;//刪除元素上一個初始化為單連結串列頭
	for(int index=0;index<delete_index;++index)//索引初始化為0,索引小於刪除索引,索引累加1
		delete_element_prev=delete_element_prev->next;//刪除元素上一個賦值為刪除元素上一個下一個
	Element*delete_element=delete_element_prev->next;//刪除元素初始化為刪除元素上一個下一個
	delete_element_prev->next=delete_element_prev->next->next;//刪除元素上一個下一個賦值為刪除元素上一個下一個下一個
	free(delete_element);//釋放刪除元素
	--single_linked_list->length;//單連結串列長度累減1
}
void Single_Linked_List_Modify(Single_Linked_List*single_linked_list/*單連結串列*/,int modify_index/*修改索引*/,int modify_data/*修改資料*/)//單連結串列修改
{
	Element*modify_element=single_linked_list->head;//修改元素初始化為單連結串列頭
	for(int index=0;index<modify_index;++index)//索引初始化為0,索引小於修改索引,索引累加1
		modify_element=modify_element->next;//修改元素賦值為修改元素下一個
	modify_element->next->data=modify_data;//修改元素下一個資料賦值為修改資料
}
int Single_Linked_List_Obtain(Single_Linked_List*single_linked_list/*單連結串列*/,int obtain_index/*獲取索引*/)//單連結串列獲取
{
	Element*obtain_element=single_linked_list->head;//獲取元素初始化為單連結串列頭
	for(int index=0;index<obtain_index;++index)//索引初始化為0,索引小於獲取索引,索引累加1
		obtain_element=obtain_element->next;//獲取元素賦值為獲取元素下一個
	return obtain_element->next->data;//返回獲取元素下一個資料
}
void Single_Linked_List_Output(Single_Linked_List*single_linked_list/*單連結串列*/)//單連結串列輸出
{
	Element*output_element=single_linked_list->head;//輸出元素初始化為單連結串列頭
	for(int index=0;index<single_linked_list->length;++index)//索引初始化為0,索引小於單連結串列長度,索引累加1
	{
		output_element=output_element->next;//輸出元素賦值為輸出元素下一個
		printf("%i ",output_element->data);//輸出輸出元素資料
	}
}
void Single_Linked_List_Clear(Single_Linked_List*single_linked_list/*單連結串列*/)//單連結串列清空
{
	for(;single_linked_list->length>0;--single_linked_list->length)//單連結串列長度大於0,單連結串列長度累減1
	{	
		Element*delete_element=single_linked_list->head;//刪除元素初始化為單連結串列頭
		single_linked_list->head=delete_element->next;//單連結串列頭賦值為刪除元素下一個
		free(delete_element);//釋放刪除元素
	}
}
int main(void)//主函數
{
	Single_Linked_List single_linked_list=Single_Linked_List_Create();//單連結串列初始化為單連結串列創造返回值
	int select_number=0,index=0,data=0;//選擇號碼初始化為0,索引初始化為0,資料初始化為0
	do{
		printf("n0.退出程式n1.單連結串列獲取長度n2.單連結串列插入n3.單連結串列刪除n4.單連結串列修改n5.單連結串列獲取n6.單連結串列輸出n7.單連結串列清空n輸入選擇號碼:");
		scanf("%i",&select_number);//輸入選擇號碼
		if(select_number==1)//選擇號碼等於1
			printf("%i",Single_Linked_List_Obtain_Length(&single_linked_list));//輸出單連結串列獲取長度返回值
		else if(select_number==2)//選擇號碼等於2
		{
			printf("輸入單連結串列插入的索引和資料:");
			scanf("%i%i",&index,&data);//輸入索引和資料
			Single_Linked_List_Insert(&single_linked_list,index,data);//單連結串列插入第索引個元素資料為資料
		}
		else if(select_number==3)//選擇號碼等於3
		{
			printf("輸入單連結串列刪除的索引:");
			scanf("%i",&index);//輸入索引
			Single_Linked_List_Delete(&single_linked_list,index);//單連結串列刪除第索引個元素資料
		}
		else if(select_number==4)//選擇號碼等於4
		{
			printf("輸入單連結串列修改的索引和資料:");
			scanf("%i%i",&index,&data);//輸入索引和資料
			Single_Linked_List_Modify(&single_linked_list,index,data);//單連結串列修改第索引個元素資料為資料
		}
		else if(select_number==5)//選擇號碼等於5
		{
			printf("輸入單連結串列獲取的索引:");
			scanf("%i",&index);//輸入索引
			printf("%i",Single_Linked_List_Obtain(&single_linked_list,index));//輸出單連結串列獲取第索引個元素資料返回值
		}
		else if(select_number==6)//選擇號碼等於6
			Single_Linked_List_Output(&single_linked_list);//單連結串列輸出
		else if(select_number==7)//選擇號碼等於7
			Single_Linked_List_Clear(&single_linked_list);//單連結串列清空
	}while(select_number!=0);//選擇號碼不等於0
	Single_Linked_List_Clear(&single_linked_list);//單連結串列清空
	free(single_linked_list.head);//釋放單連結串列頭
}

C++語言實現程式碼

#include<iostream>//包含輸入輸出流檔案
struct Element//元素
{
	int data;//資料
	Element*next;//下一個
};
struct Single_Linked_List//單連結串列
{
	Element*head{new Element[1]{}};//頭初始化為分配1個元素資料型別動態記憶體返回值
	int length{};//長度初始化為0
	~Single_Linked_List(void)//解構
	{
		Clear();//清空
		delete[]head;//釋放頭
	}
	int Obtain_Length(void)//獲取長度
	{
		return length;//返回長度並且退出函數
	}
	void Insert(int insert_index/*插入索引*/,int insert_data/*插入資料*/)//插入
	{
		Element*insert_element_prev{head};//插入元素上一個初始化為頭
		for(int index{};index<insert_index;++index)//索引初始化為0,索引小於插入索引,索引累加1
			insert_element_prev=insert_element_prev->next;//插入元素上一個賦值為插入元素上一個下一個
		Element*insert_element{new Element[1]{insert_data,insert_element_prev->next}};//插入元素初始化為分配1個元素資料型別動態記憶體返回值,插入元素資料初始化為插入資料,插入元素下一個初始化為插入元素上一個下一個
		insert_element_prev->next=insert_element;//插入元素上一個下一個賦值為插入元素
		++length;//長度累加1
	}
	void Delete(int delete_index/*刪除索引*/)//刪除
	{
		Element*delete_element_prev{head};//刪除元素上一個初始化為頭
		for(int index{};index<delete_index;++index)//索引初始化為0,索引小於刪除索引,索引累加1
			delete_element_prev=delete_element_prev->next;//刪除元素上一個賦值為刪除元素上一個下一個
		Element*delete_element{delete_element_prev->next};//刪除元素初始化為刪除元素上一個下一個
		delete_element_prev->next=delete_element_prev->next->next;//刪除元素上一個下一個賦值為刪除元素上一個下一個下一個
		delete[]delete_element;//釋放刪除元素
		--length;//長度累減1
	}
	void Modify(int modify_index/*修改索引*/,int modify_data/*修改資料*/)//修改
	{
		Element*modify_element{head};//修改元素初始化為頭
		for(int index{};index<modify_index;++index)//索引初始化為0,索引小於修改索引,索引累加1
			modify_element=modify_element->next;//修改元素賦值為修改元素下一個
		modify_element->next->data=modify_data;//修改元素下一個資料賦值為修改資料
	}
	int Obtain(int obtain_index/*獲取索引*/)//獲取
	{
		Element*obtain_element{head};//獲取元素初始化為頭
		for(int index{};index<obtain_index;++index)//索引初始化為0,索引小於獲取索引,索引累加1
			obtain_element=obtain_element->next;//獲取元素賦值為獲取元素下一個
		return obtain_element->next->data;//返回獲取元素下一個資料
	}
	void Output(void)//輸出
	{
		Element*output_element{head};//輸出元素初始化為頭
		for(int index{};index<length;++index)//索引初始化為0,索引小於長度,索引累加1
		{
			output_element=output_element->next;//輸出元素賦值為輸出元素下一個
			std::cout<<output_element->data<<" ";//標準輸出輸出元素資料
		}
	}
	void Clear(void)//清空
	{
		for(;length>0;--length)//長度大於0,長度累減1
		{	
			Element*delete_element{head};//刪除元素初始化為頭
			head=delete_element->next;//頭賦值為刪除元素下一個
			delete[]delete_element;//釋放刪除元素
		}
	}
};
int main(void)//主函數
{
	Single_Linked_List single_linked_list;//單連結串列
	int select_number{},index{},data{};//選擇號碼初始化為0,索引初始化為0,資料初始化為0
	do{
		std::cout<<"n0.退出程式n1.單連結串列獲取長度n2.單連結串列插入n3.單連結串列刪除n4.單連結串列修改n5.單連結串列獲取n6.單連結串列輸出n7.單連結串列清空n輸入選擇號碼:";//標準輸出
		std::cin>>select_number;//標準輸入選擇號碼
		if(select_number==1)//選擇號碼等於1
			std::cout<<single_linked_list.Obtain_Length();//標準輸出單連結串列獲取長度返回值
		else if(select_number==2)//選擇號碼等於2
		{
			std::cout<<"輸入單連結串列插入的索引和資料:";//標準輸出
			std::cin>>index>>data;//標準輸入索引和資料
			single_linked_list.Insert(index,data);//單連結串列插入第索引個元素資料為資料
		}
		else if(select_number==3)//選擇號碼等於3
		{
			std::cout<<"輸入單連結串列刪除的索引:";//標準輸出
			std::cin>>index;//標準輸入索引
			single_linked_list.Delete(index);//單連結串列刪除第索引個元素資料
		}
		else if(select_number==4)//選擇號碼等於4
		{
			std::cout<<"輸入單連結串列修改的索引和資料:";//標準輸出
			std::cin>>index>>data;//標準輸入索引和資料
			single_linked_list.Modify(index,data);//單連結串列修改第索引個元素資料為資料
		}
		else if(select_number==5)//選擇號碼等於5
		{
			std::cout<<"輸入單連結串列獲取的索引:";//標準輸出
			std::cin>>index;//標準輸入索引
			std::cout<<single_linked_list.Obtain(index);//標準輸出單連結串列獲取第索引個元素資料返回值
		}
		else if(select_number==6)//選擇號碼等於6
			single_linked_list.Output();//單連結串列輸出
		else if(select_number==7)//選擇號碼等於7
			single_linked_list.Clear();//單連結串列清空
	}while(select_number!=0);//選擇號碼不等於0
}

到此這篇關於C/C++實現線性單連結串列的範例程式碼的文章就介紹到這了,更多相關C++線性單連結串列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com