C++线性单链表
学编程的闹钟 人气:0线性单链表简介
使用链存储结构的线性存储结构为线性单链表,线性存储结构是元素逻辑结构一对一,链存储结构是元素物理结构不连续,线性单链表操作没有限制,线性单链表优点是可以直接插入和删除元素,线性单链表缺点是不可以使用下标获取和修改元素.
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 }
加载全部内容