首页 > 其他分享 >线性表之链式存储

线性表之链式存储

时间:2023-01-02 12:33:48浏览次数:39  
标签:结点 return 线性表 List 存储 Next Ptrl 链式 NULL

目录

初始化一个空线性表

空链式表的抽象表达

//typedef用于给结构体取别名,
typedef struct LNode* List;
//上面这行的内容是,说明 List 是结构体 LNode 类型的指针
//下面这行就是结构体的创建
struct LNode
{
	//这行看不懂还敲不出的代码就是抽象表达了
	//ElementType->任意类型,Data->数据,
	//这下应该懂了吧,也就是说,这里可以写任意类型的数据,然后成为链表的“数据域”
	ElementType Data;
	//而这一行就很简单了,一个指向本类型的指针,经典的指针域
	List Next;
};
//创建一个 struct Lnode 类型的变量 L
struct Lnode L;
//创建一个 List(一个指向 LNode 的指针类型) 类型的变量 Ptrl
List PtrL;

查找

按序号

List FindKth(int K,List Ptrl)
{
// p 指向表的第一个结点,也就是头指针
List p = PtrL;
int i = 1;
while (p!=NULL&&i<K)
{
	p = p->Next;
	i++;
}
//找到第K个,返回指针
if (i == K) return p;
//如果根本没有第K个,就返回NULL
else return NULL;
}

按值

List FindKth(ElementTpye K,List Ptrl)
{
// p 指向表的第一个结点,也就是头指针
List p = PtrL;
while (p!=NULL&&p->Data!=K)
{
	p = p->Next;
}
return p;
}

在位序i前插入一个新元素X

  1. 先构造一个新结点,用s指向;
  2. 再找到链表的第 i-1 个结点,用 p 指向;
  3. 然后修改指针,插入结点,使得p指向结点s,s指向p的原下一个结点;

分两种情况
当i=1,也就是要在链表头部插入新元素x的时候

List Insert(ElementTpye X, int i, List Ptrl)
{
List s;
if (i == 1)
{
	//给s结点开辟新的空间
	s = (List)malloc(sizeof(struct LNode));
	//修改新结点的数据
	s->Data = X;
	//使得新的头结点的指针指向原先的头结点
	s->Next = PtrL;
	//返回新的头结点
	return s;
}
}

当i!=1时

List Insert(ElementTpye X, int i, List Ptrl)
{
List p,s;
p = FindKth(i - 1, Ptrl);	//使得p指向i-1的结点
if (p==NULL)	如果i-1的结点不存在,说明有BUG
{
	printf("参数i错误");
	return NULL;
}
else
{
	s = (List)malloc(sizeof(struct LNode));
	s->Data = X;
	//使得s的指针指向p的指针,也就是i结点
	s->Next = p->Next;
	//再使得p指向s结点
	p->Next = s;
	//这样就插入完成了,最后返回头指针
	return PtrL;
}
}

总体

List Insert(ElementTpye X, int i, List Ptrl)
{
List p,s;
if (i == 1)
{
	//给s结点开辟新的空间
	s = (List)malloc(sizeof(struct LNode));
	//修改新结点的数据
	s->Data = X;
	//使得新的头结点的指针指向原先的头结点
	s->Next = PtrL;
	//返回新的头结点
	return s;
}
p = FindKth(i - 1, Ptrl);	//使得p指向i-1的结点
if (p==NULL)	如果i-1的结点不存在,说明有BUG
{
	printf("参数i错误");
	return NULL;
}
else
{
	s = (List)malloc(sizeof(struct LNode));
	s->Data = X;
	//使得s的指针指向p的指针,也就是i结点
	s->Next = p->Next;
	//再使得p指向s结点
	p->Next = s;
	//这样就插入完成了,最后返回头指针
	return Ptrl;
}
}

删除指定位序i的元素

跟插入的做法大差不差的

List Delete(int i, List Ptrl)
{
List p,s;
if (i == 1)
{
	//使得s指向头结点
	s = Ptrl;
	//头结点往后移一位
	if (Ptrl != NULL) Ptrl = Ptrl->Next;
	else return NULL;
	//释放s的空间
	free(s);
	return Ptrl;
}
p = FindKth(i - 1, Ptrl);
if (p==NULL)
{
	printf("第%d个结点不存在",i-1);
	return NULL;
}
else if (p->Next == NULL)
{
	printf("第%d个结点不存在", i);
	return NULL;
}
else
{
	//s指向i结点
	s = p->Next;
	//连接上i-1结点和i+1结点
	p->Next = s->Next;
	//释放空间
	free(s);
	return Ptrl;
}
}

返回线性表L的长度n

int Length(List Ptrl)
{
// p 指向表的第一个结点,也就是头指针
List p = PtrL;
int j = 0;
while (p)	//如果p!=NULL,那就会一直执行,直到p==NULL,也就是链表遍历完了为止
{
	p = p->Next;	//使得 p 指向下一个结点
	j++;	//当前 p 指向的是第 j 个结点
}
return j;
}

吐槽

  • 累死老子了,基本上就是把PPT的内容手打一遍抄过来,真心不想抄,想着复制粘贴算了。
  • 但是吧,不抄不自己写好注释,过不了几天我又得重头学起。
  • 阿西吧,毁灭吧,赶紧的,累了

标签:结点,return,线性表,List,存储,Next,Ptrl,链式,NULL
From: https://www.cnblogs.com/aduiduidui/p/17019723.html

相关文章

  • yum仓库的灵活部署和nfs共享存储服务
    一、yum仓库的灵活部署1、YUM(YellowdogUpdaterModified)●基于RPM包构建的软件更新机制●可以自动解决依赖关系●所有软件包由集中的YUM软件仓库提供 2、yum仓......
  • Stata 变量存储类型及显示格式
    1.变量的存储类型清楚变量的取值区间后设定数据存储的类型,可以降低Stata内存容量。①整数的存储类型Byte,字节型,取值±100Int,一般整数型,取值±32000Long,长整数型,取值±......
  • Android笔记--数据存储之SharedPreferences
    SharedPreferences--轻量级存储工具(共享参数)其采用的存储结构是Key-Value的键值对方式SharedPreferences用法以及相关的简单案例记住密码的实现实现啦!那,就白天......
  • PostgreSQL 修改数据存储路径
    PostgreSQL修改数据存储路径 0、版本说明使用的PostgreSQL版本是14.X版本的。 1、创建需要存放数据的路径mkdir-p/home/data/pg14/data其中,/home/data/pg......
  • 44-KVM虚拟化-存储管理和磁盘扩容
    KVM存储模式基于文件系统的存储dir:FilesystemDirectory需要有挂载点的文件系统fs:Pre-FormattedBlockDevice无需挂载的文件系统,如:位于SAN存储的文件系统,可支持多......
  • 算法之链式前向星存图
    蒟蒻们往这里看!链式前向星存图的讲解先上代码://MAXN指的是最大边数//MAXM指的是最大节点数intcnt;inthead[MAXM];//head[n]指的是第n个节点存储的最后一条边地址......
  • 分布式存储系统 Ceph 介绍与环境部署
    目录一、概述二、Ceph架构三、Ceph核心组件介绍四、Ceph三种存储类型1)块存储服务(RBD)2)文件系统存储服务(CephFS)3)对象存储服务(RGW)五、Ceph版本发行生命周期六、Ceph......
  • 阿里云开通OSS存储服务详细流程
    文章目录​​学习文档​​​​一、购买资源包​​​​二、创建Bucket及目录​​​​三、创建用户,分配权限​​​​四、最终绑定PicGo来进行上传​​​​关于收费​​​​图......
  • RocketMQ存储篇一:概览
    这篇文章记录RocketMQ大致的存储流程,源码为5.0.1-SNAPSHOT入口从Broker模块的SendMessageProcessor开始@SendMessageProcessor#sendMessage()5.0中将putmessage中的......
  • containerd容器存储探究
    ContainerD容器目录结构探究启动容器作为开始,我们需要去启动一个容器。你可以通过命令行的方式来启动一个容器,例如:ctripulldocker.io/library/nginx:alpinectrc......