文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

线性单链表简介

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

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯