網站首頁 編程語言 正文
線性單鏈表簡介
使用鏈存儲結構的線性存儲結構為線性單鏈表,線性存儲結構是元素邏輯結構一對一,鏈存儲結構是元素物理結構不連續,線性單鏈表操作沒有限制,線性單鏈表優點是可以直接插入和刪除元素,線性單鏈表缺點是不可以使用下標獲取和修改元素.
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
}
原文鏈接:https://blog.csdn.net/vbnetcx/article/details/124764283
相關推薦
- 2023-01-21 詳解Go語言如何使用標準庫sort對切片進行排序_Golang
- 2022-04-26 EF?Core通過顯式編譯提高查詢性能_實用技巧
- 2022-04-22 SketchUp:解決鏡頭剪切屏幕出現破面視角的問題圖文教程
- 2023-04-08 Swift?HTTP加載請求Loading?Requests教程_Swift
- 2022-08-23 多線程python的實現及多線程有序性_python
- 2022-10-27 React事件處理和表單的綁定詳解_React
- 2024-01-29 在springboot多數據源項目中創建多個事務(解決@Transactional影響切換數據源問題
- 2022-09-12 Python?argparse庫的基本使用步驟_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支