数据结构线性单链表

数据结构线性单链表

线性单链表简介

使用链存储结构的线性存储结构为线性单链表,线性存储结构是元素逻辑结构一对一,链存储结构是元素物理结构不连续,表是操作没有限制.

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){malloc(sizeof(Element))};//返回单链表成员头赋值分配字节元素
}
void Single_Linked_List_Destroy(Single_Linked_List*single_linked_list)//空单链表销毁,单链表指针单链表
{
	for(;single_linked_list->Length>0;--single_linked_list->Length)//循环,单链表成员长度大于0,减减单链表成员长度
	{
		Element*Delete_Element=single_linked_list->Head;//元素指针删除元素赋值单链表成员头
		single_linked_list->Head=Delete_Element->Next;//单链表成员头赋值删除元素成员下一个
		free(Delete_Element);//释放删除元素
	}
	free(single_linked_list->Head);//释放单链表成员头
}
void Single_Linked_List_Insert(Single_Linked_List*single_linked_list,int Insert_Index,int Insert_Data)//空单链表插入,单链表指针单链表,整数插
{
	Element*Insert_Element_Prev_Element=single_linked_list->Head,*Insert_Element=malloc(sizeof(Element));//元素指针插入元素上一个元素赋值单链表成员头,元
	for(int Index=0;Index<Insert_Index;++Index)//循环,整数索引赋值0,索引小于插入索引,加加索引
		Insert_Element_Prev_Element=Insert_Element_Prev_Element->Next;//插入元素上一个元素赋值插入元素上一个元素成员下一个
	Insert_Element->Data=Insert_Data;//插入元素成员数据赋值插入数据
	Insert_Element->Next=Insert_Element_Prev_Element->Next;//插入元素成员下一个赋值插入元素上一个元素成员下一个
	Insert_Element_Prev_Element->Next=Insert_Element;//插入元素上一个元素成员下一个赋值插入元素
	++single_linked_list->Length;//加加单链表成员长度
}
void Single_Linked_List_Delete(Single_Linked_List*single_linked_list,int Delete_Index)//空单链表删除,单链表指针单链表,整数删除索引
{
	Element*Delete_Element_Prev_Element=single_linked_list->Head;//元素指针删除元素上一个元素赋值单链表成员头
	for(int Index=0;Index<Delete_Index;++Index)//循环,整数索引赋值0,索引小于删除索引,加加索引
		Delete_Element_Prev_Element=Delete_Element_Prev_Element->Next;//删除元素上一个元素赋值删除元素上一个元素成员下一个
	Element*Delete_Element=Delete_Element_Prev_Element->Next;//元素指针删除元素赋值删除元素上一个元素成员下一个
	Delete_Element_Prev_Element->Next=Delete_Element_Prev_Element->Next->Next;//删除元素上一个元素成员下一个赋值删除元素上一个元素成员下一个成员下一个
	free(Delete_Element);//释放删除元素
	--single_linked_list->Length;//减减单链表成员长度
}
int Single_Linked_List_Obtain(Single_Linked_List single_linked_list,int Obtain_Index)//整数单链表获取,单链表单链表,整数获取索引
{
	for(int Index=0;Index<Obtain_Index;++Index)//循环,整数索引赋值0,索引小于获取索引,加加索引
		single_linked_list.Head=single_linked_list.Head->Next;//单链表成员头赋值单链表成员头成员下一个
	return single_linked_list.Head->Next->Data;//返回单链表成员头成员下一个成员数据
}
int Single_Linked_List_Size(Single_Linked_List single_linked_list)//整数单链表尺寸,单链表单链表
{
	return single_linked_list.Length;//返回单链表成员长度
}
int main(void)//整数主,空
{
	Single_Linked_List single_linked_list=Single_Linked_List_Create();//单链表单链表赋值单链表创造
	for(int Select=5,Data,Index;Select;scanf("%i",&Select))//循环,整数选择赋值5,整数数据,整数索引,选择不等于0,格式扫描选择
	{
		if(Select==1)//如果,选择等于1
		{
			scanf("%i%i",&Index,&Data);//格式扫描索引和数据
			Single_Linked_List_Insert(&single_linked_list,Index,Data);//单链表插入单链表索引数据
		}
		else if(Select==2)//否则如果,选择等于2
		{
			scanf("%i",&Index);//格式扫描索引
			Single_Linked_List_Delete(&single_linked_list,Index);//单链表删除单链表索引数据
		}
		else if(Select==3)//否则如果,选择等于3
		{
			scanf("%i",&Index);//格式扫描索引
			printf("%i",Single_Linked_List_Obtain(single_linked_list,Index));//格式打印单链表获取单链表索引数据
		}
		else if(Select==4)//否则如果,选择等于4
			printf("%i",Single_Linked_List_Size(single_linked_list));//格式打印单链表尺寸单链表
	}
	Single_Linked_List_Destroy(&single_linked_list);//单链表销毁单链表
}

C++语言实现代码

#include<iostream>//包含输入输出流库文件
struct Single_Linked_List//结构单链表
{
	struct Element//结构元素
	{
		int Data;//整数数据
		Element*Next;//元素指针下一个
	}*Head=new Element;//元素指针头赋值新元素
	int Length=0;//整数长度赋值0
	~Single_Linked_List(void)//单链表析构,空
	{
		for(;Length>0;--Length)//循环,长度大于0,减减长度
		{	
			Element*Delete_Element=Head;//元素指针删除元素赋值头
			Head=Delete_Element->Next;//头赋值删除元素成员下一个
			delete Delete_Element;//删除删除元素
		}
		delete Head;//删除头
	}
	void Insert(int Insert_Index,int Insert_Data)//空整数插入索引,整数插入数据
	{
		Element*Insert_Element_Prev_Element=Head;//元素指针插入元素上一个元素赋值头
		for(int Index=0;Index<Insert_Index;++Index)//循环,整数索引赋值0,索引小于插入索引,加加索引
			Insert_Element_Prev_Element=Insert_Element_Prev_Element->Next;//插入元素上一个元素赋值插入元素上一个元素成员下一个
		Element*Insert_Element=new Element{Insert_Data,Insert_Element_Prev_Element->Next};//元素指针插入元素赋值新元素,插入元素数据赋值插入数据,插入元素下一个赋值插入元素上一个元素成员下一个
		Insert_Element_Prev_Element->Next=Insert_Element;//插入元素上一个元素成员下一个赋值插入元素
		++Length;//加加长度
	}
	void Delete(int Delete_Index)//空删除,整数删除索引
	{
		Element*Delete_Element_Prev_Element=Head;//元素指针删除元素上一个元素赋值头
		for(int Index=0;Index<Delete_Index;++Index)//循环,整数索引赋值0,索引小于删除索引,加加索引
			Delete_Element_Prev_Element=Delete_Element_Prev_Element->Next;//删除元素上一个元素赋值删除元素上一个元素成员下一个
		Element*Delete_Element=Delete_Element_Prev_Element->Next;//元素指针删除元素赋值删除元素上一个元素成员下一个
		Delete_Element_Prev_Element->Next=Delete_Element_Prev_Element->Next->Next;//删除元素上一个元素成员下一个赋值删除元素上一个元素成员下一个成员下一个
		delete Delete_Element;//删除删除元素
		--Length;//减减长度
	}
	int Obtain(int Obtain_Index)//整数获取,整数获取索引
	{
		Element*Obtain_Element=Head;//元素指针获取元素赋值头
		for(int Index=0;Index<Obtain_Index;++Index)//循环,整数索引赋值0,索引小于获取索引,加加索引
			Obtain_Element=Obtain_Element->Next;//获取元素赋值获取元素成员下一个
		return Obtain_Element->Next->Data;//返回获取元素成员下一个成员数据
	}
	int Size(void)//整数尺寸,空
	{
		return Length;//返回长度
	}
}single_linked_list;//单链表
int main(void)//整数主,空
{
	for(int Select=5,Data,Index;Select;std::cin>>Select)//循环,整数选择赋值5,整数数据,整数索引,选择不等于0,标准输入选择
	{
		if(Select==1)//如果,选择等于1
		{
			std::cin>>Index>>Data;//标准输入索引和数据
			single_linked_list.Insert(Index,Data);//单链表成员插入索引数据
		}
		else if(Select==2)//否则如果,选择等于2
		{
			std::cin>>Index;//标准输入索引
			single_linked_list.Delete(Index);//单链表成员删除索引数据
		}
		else if(Select==3)//否则如果,选择等于3
		{
			std::cin>>Index;//标准输入索引
			std::cout<<single_linked_list.Obtain(Index);//标准输出单链表成员获取索引数据
		}
		else if(Select==4)//否则如果,选择等于4
			std::cout<<single_linked_list.Size();//标准输出单链表成员尺寸
	}
}
  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学编程的闹钟

自愿打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值