C/C++实现线性单链表的示例代码

2022-11-13 08:11:25 示例 链表 线性

线性单链表简介

使用链存储结构的线性存储结构为线性单链表,线性存储结构是元素逻辑结构一对一,链存储结构是元素物理结构不连续,线性单链表操作没有限制,线性单链表优点是可以直接插入和删除元素,线性单链表缺点是不可以使用下标获取和修改元素.

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++线性单链表内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关文章