亲宝软件园·资讯

展开

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
}

加载全部内容

相关教程
猜你喜欢
用户评论