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

目录
  • 线性单链表简介
  • C语言实现代码
  • C++语言实现代码

线性单链表简介

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

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

(0)

相关推荐

  • C++超详细讲解单链表的实现

    目录 单链表的实现(从入门到熟练) 概念和结构 链表的实现 增删查改接口 节点结构体创建 节点开辟 数据打印 链表尾插数据 头删 链表数据查找 链表pos位置前插数据 链表pos位置后插数据 链表pos位置数据删除 链表节点释放 链表与顺序表区别 链表的优缺点 顺序表的优缺点 单链表的实现(从入门到熟练) 概念和结构 概念:链表是一种物理存储结构上非连续.非顺序的存储结构 数据元素的逻辑顺序是通过链表中的指针链 接次序实现的 图示: 注意: 链表结构在逻辑上为连续的,但是物理上(内存中)不一定连

  • C++ 数据结构超详细讲解单链表

    目录 前言 一.链表是什么 链表的分类 二.链表的实现 总结 (❁´◡`❁) 单链表 前言 上篇顺序表结尾了解了顺序表的诸多缺点,链表的特性很好的解决了这些问题,本期我们来认识单链表. 一.链表是什么 链表是一种物理存储结构上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接依次实现的. 由图,链式结构在逻辑上是连续的,但是物理上不一定连续 显示中结点一般是从堆上申请出来的 从堆上申请的空间,是按照一定的策略划分的,两次申请的空间,可能连续,可能不连续,见顺序表 链表的分类 链表

  • C++详解如何实现单链表

    目录 单链表 单链表的基本操作 1.初始化 2.取值 3.查找 4.插入 5.删除 示例代码 开发环境 运行结果 单链表 链表内存空间不一定连续,其扩展性较好.多余的不多说了.该文主要记录单链表的实现,该单链表含有一个非空的头节点.链表的操作实际上是对其指针域与数据域的操作. 线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素.为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继的指针. 单链表中结点类型的描述如下: t

  • C++数据结构之单链表

    目录 单链表结构的定义 单链表打印 动态申请一个结点 单链表尾插 单链表尾删 单链表头插 单链表头删 求单链表长度 单链表查找 单链表在pos位置插入 单链表在pos后面位置插入 单链表删除pos位置 单链表删除pos的下一个结点 判断单链表是否为空 头文件 源文件 简介: 线性表的顺序存储结构有一个缺点就是插入和删除时需要移动大量元素,这会耗费许多时间.能不能想办法解决呢?干脆所有的元素都不要考虑相邻位置了,哪有空位就到哪里,让每一个元素都知道它下一个元素的位置在哪里.线性表链式存储结构: 用

  • C++编程语言实现单链表详情

    目录 一.单链表简单介绍 二.下面我们先实现单链表的初始化. 三.实现单链表的插入与删除数据 一.单链表简单介绍 首先,我们再回顾一下线性表的两种存储方式--顺序存储与链式存储 上图左边为顺序存储,右边为链式存储 之前我们利用数组来实现顺序表,对于顺序表的优点缺点,总结来说就是,查找方便,增删复杂. 线性表之顺序存储的优缺点 而链表特点可以说恰恰相反,增删方便,查找复杂. 今天实现的是链表中最简单的一种--单链表(每个结点中只含有一个指针域) 对于链表我们只知道它每个结点的存储的物理地址是不连续

  • C++数据结构之单链表的实现

    目录 一.单链表的定义 二.单链表的基本操作的实现 1.初始化 2.取值 3.查找 4.插入 5.删除 三.完整代码 四.测试一下代码 一.单链表的定义 线性表的链式存储又称为单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素.为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息外,还需要存放一个指向其后继的指针. 单链表中结点类型的描述如下: typedef struct LNode{ // 定义单链表节点类型 ElemType data; // 数据域 struct

  • C++超详细分析单链表的实现与常见接口

    相信如果看完了上期顺序表的小伙伴应该发现了顺序表的诸多缺点:

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

    目录 线性单链表简介 C语言实现代码 C++语言实现代码 线性单链表简介 使用链存储结构的线性存储结构为线性单链表,线性存储结构是元素逻辑结构一对一,链存储结构是元素物理结构不连续,线性单链表操作没有限制,线性单链表优点是可以直接插入和删除元素,线性单链表缺点是不可以使用下标获取和修改元素. C语言实现代码 #include<stdio.h>//包含标准输入输出文件 #include<stdlib.h>//包含标准库文件 typedef struct element//元素 { i

  • 利用C++简单实现顺序表和单链表的示例代码

    本文主要给大家介绍了关于C++实现顺序表和单链表的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 一.顺序表示例代码: #include <assert.h> #include <iostream> using namespace std; typedef int Datatype; class SeqList { public: SeqList() :_array(NULL) ,_size(0) ,_capacity(0) { } SeqList(const

  • C语言实现线性动态(单向)链表的示例代码

    目录 什么是链表 为什么不用结构体数组 链表的操作 创建表 删除元素 插入元素 代码及运行结果 什么是链表 链表是数据结构里面的一种,线性链表是链表的一种,线性链表的延伸有双向链表和环形链表.在编程语言中优化数据结构可以在处理大数据时大大降低程序的空间复杂性和时间复杂性.这里我只用一个简单的例子——线性单向链表为例,说明C语言是如何实现该结构的. 链表的元素是由结构体来实现struct table *p.结构体中有一个成员是结构体指针struct table *next,而这个结构体指针的类型和

  • PHP单链表的实现代码

    单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 单链表简介 链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据. 关键代码如下所示: <?php /** * 单链表 */ class Demo { private $id; public $name; public $next; public function __construct ($id = ''

  • python算法与数据结构之单链表的实现代码

    =一.链表 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域. 相比于线性表顺序结构,操作复杂.由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是

  • C语言实现动态链表的示例代码

    目录 结构体定义已经函数声明 函数实现 创建一个链表 判断链表是否为空 获得链表中节点的个数 在某个特定的位置插入一个元素 获得指定下标的节点的元素 删除一个节点 链表逆序 链表的清空 链表的销毁 链表的遍历 按特定的元素查找节点 按某些特定的条件删除所有符合情况的节点 链表的排序 总结 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分:一个是存储

  • Java实现双链表的示例代码

    目录 一.双向链表是什么 二.具体方法实现 定义结点 下标访问异常 获取链表长度 打印链表 清空链表 头插法 尾插法 指定位置插入 查找元素 删除第一次出现的关键字 删除所有值为key的节点 三.完整代码 一.双向链表是什么 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. LinkedList底层就是一个双向链表,我们来实现一个双向链表. 这

  • Python单链表简单实现代码

    本文实例讲述了Python单链表简单实现代码.分享给大家供大家参考,具体如下: 用Python模拟一下单链表,比较简单,初学者可以参考参考 #coding:utf-8 class Node(object): def __init__(self, data): self.data = data self.next = None class NodeList(object): def __init__(self, node): self.head = node self.head.next = No

  • Java实现单链表翻转实例代码

    Java实现单链表反转,递归和非递归两种形式 /** * 反转单链表 */ /** * 定义链表 * * @author 16026 * */ class Node { int val; Node next; public Node(int val) { this.val = val; } } public class ReverseList { /** * 反转链表 * * @param head * @return */ public static Node reverseList(Node

  • Java单链表的实现代码

    下面是小编给大家分享的一个使用java写单链表,有问题欢迎给我留言哦. 首先定义一个Node类 public class Node { protected Node next; //指针域 public int data;//数据域 public Node( int data) { this. data = data; } //显示此节点 public void display() { System. out.print( data + " "); } } 接下来定义一个单链表,并实现

随机推荐