数据结构-线性表的链式存储结构

术语:

1.结点:数据元素的存储映像。有数据域和指针域两部分组成。

2.链表:n个结点由指针组成一个链表

3.结点只有一个指针域的链表,成为单链表或线性链表。

4.结点有两个指针域的链表,成为双链表。

5.首尾相接的链表成为循环链表。


//单链表的存储结构
typedef struct LNode
{ElemType data;//结点的数据域struct LNode *Next;//结点的指针域
}LNode,*LinkList;//LinkList为指向结构体Lnode的指针类型

//单链表的初始化
Status InitList(LinkList &L){L=new LNode;//生成新节点作为头节点,头指针指向头节点//L=(LinkList) malloc (sizeof(LNode));L->next=NULL;//头节点的指针域置空return OK;
}

判断链表是否为空

//单链表的销毁
//从头指针开始,依次释放所有结点
Status DestoryList(LinkList &L){Lnode *p;while(L){p=L;L=L->next;delete p;}
}
//清空单链表
//链表仍存在,但链表中无元素,成功空链表(头指针和头节点仍然存在)
Status ClearList(LinkList &L)
{Lnode *p,*q;p=L->next;while(p){//没到表尾q=p->next;delete p;p=q;}L->next=NULL;return OK;
}
//求单链表的表长
int ListLength_L(LinkList L){LinkList p;p=L->next;//p指向第一个结点i=0;while(p){//遍历单链表,统计结点数i++;p=p->next;}return i;
}
/**
单链表的取值:取单链表中第i个元素的内容
算法步骤:
1.用指针p指向首元节点,用j做计数器初值赋值为1
2.从首元结点开始依次顺着链域next向下访问,只要指向当前结点的指针p不为空,并且没有到达序号为i的结点,则循环执行以下操作
P指向下一个结点
计数器j相应加1
3.推出循环时,如果指针p为空,或者计数器j大于i,说明指定的序号i值不合法(i大于表长n或i小于等于0),取值失败,否则取值成功,此时j=i时,p所指的结点就是要找的第i个结点,用参数e保存当前结点的数据域,返回ok;
**/
Status GetElem(LinkList L,int i,ElemType &e)//获取线性表L中的某个数据元素的内容,通过变量e返回
{p=L->next;j=1;while(p&&j<i)//向后扫描,直到p指向第i个元素或p为空{p=p->next;++j;}if(!p||j>i){return error;}e=p->data;return OK;
}
/**
按值查找:根据指定数据获取该数据所在的位置(该数据的地址)
算法步骤:
1.用指针p指向首元节点
2.从首元结点开始依次顺着链域next向下访问,只要指向当前结点的指针p不为空,并且指向当前结点的指针p不为空,并且p所指结点的数据域不等于定值e,则循环执行以下操作
P指向下一个结点
3.若查找成功,p此时即为结点的地址值,若查找失败,p的值即为Null
**/
LNode *LocateElem(LinkList L,ElemType e)
{p=L->next;while(p&&p->data!=e){p=p->next;}if(!p||j>i){return error;}return p;
}
//在第i个元素前插入值为e的新结点
/**
算法步骤:
1.首先找到ai-1的存储位置p
2.生成一个数据域为e的新结点s
3.插入新结点:新节点的指针域指向结点ai结点ai-1的指针域指向新结点
**/
Status ListInsert_L(LinkList &L,int i,ElemType e)
{p=L;j=0;while(p&&j<i-1){p=p->next;++j;}//寻找第i-1个结点,p指向i-1结点if(!p||j>i){//i大于表长+1或者小于1,插入位置非法return error;}s=new LNode;s->data=e;//生成新结点s,将结点s的数据域设置为es->next=p->next;p->next=s;return OK;
}
/**
删除第i个结点
算法步骤:
1.首先找到ai-1的存储位置p,保存要删除的ai的值
2.让p->next指向ai+1
3.释放结点ai的空间
**/
Status ListDelete_L(LinkList &L,int i,ElemType &e){p=L;j=0;while (p->next&&j<i-1){//寻找第i个结点,并令p指向其前驱p=p->next;++j;}if(!(p->next)||j>i-1){return error;//删除位置不合理}q=p->next;//临时保存被删结点的地址以备释放p->next=q->next;//改变删除结点前驱的指针域e=q->data;//保存删除结点的数据域delete q;//释放删除结点的空间return OK;
}

建立单链表:头插法-元素插入链表头部,也叫前插法

1.从一个空表开始,重复读入数据

2.生成新结点,将读入数据存放到新结点的数据域中

3.从最后一个结点开始,依次将各结点插入到链表的前端

void CreateList_H(LinkList & L,nt n)
{L=new LNode;L->next=NULL;//先建立一个带头结点的单链表for(i=n;i>0;--i){p=(LNode*)malloc(sizeof(LNode));//生成新结点scanf(&p->data)//输入元素值p->next=L->next;//插入到表头L->next=p;}
}

建立单链表:尾插法-元素插入链表尾部,也叫尾插法

1.从一个空表L开始,将新结点逐个插入到链表的尾部,尾指针r指向链表的尾结点

2.初始时,r同L均为头结点,每读入一个数据元素则申请一个新结点,将新结点插入到尾结点后,r指向新结点


循环链表:是一种首尾相接的链表(表中最后一个结点的指针域指向头结点,整个链表形成一个环 )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/259574.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8 个顶级的 PDF 转 Word 转换器

PDF 是跨不同平台分发信息而不影响内容格式的好方法。但这种安全级别确实有其缺点。没有直接的方法来编辑 PDF 上的文本或内容。编辑 PDF 文档的唯一方法是将其转换为 Word 文档或其他可以编辑的文件类型。将 PDF 转换为 Word 是根据需要编辑 PDF 内容的最快方法。有许多免费的…

Python中的深拷贝和浅拷贝的区别

目录 一、深拷贝和浅拷贝的概念 二、Python中的深拷贝和浅拷贝实现 三、深拷贝和浅拷贝的区别及适用场景 四、如何选择深拷贝和浅拷贝 五、总结 在Python中&#xff0c;深拷贝和浅拷贝是非常重要的概念&#xff0c;它们在处理对象和数据结构时有着截然不同的行为。理解深拷…

MN316 OpenCPU丨HTTP使用介绍

HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;即超文本传输协议&#xff0c;是一个简单的请求-响应协议&#xff0c;通常运行在TCP之上&#xff0c;它指定了客户端可能发送给服务器消息类型以及得到什么类型响应。HTTPS&#xff08;Hyper Text Transfer Protoc…

Windows 系统,TortoiseSVN 无法修改 Log 信息解决方法

使用SVN提交版本信息时&#xff0c;注释内容写的不全。通过右键TortoiseSVN的Show log看到提交的的注释&#xff0c;右键看到Edit log message的选项&#xff0c;然而提交后却给出错误提示&#xff1a; Repository has not been enabled to accept revision propchanges; ask …

炫酷不止一面:探索JavaScript动画的奇妙世界(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

wps word中图片 一保存失真变糊

在wps中依次点击 文件-文字偏好设置-常规与保存 勾选不压缩文件中的图像 并 将默认目标输出设置为220ppi 即可

c# 中间件简说

一、什么是中间件 中间件是一种装配到应用管道以处理请求和响应的软件。是介于request与response处理过程之间的一个插件(一道处理过程)&#xff0c;相对比较轻量级&#xff0c;并且在全局上会影响到request对象和response对象的属性。因为改变的是全局&#xff0c;所以需要谨…

log4j(日志的配置)

日志一般配置在resources的config下面的&#xff0c;并且Util当中的initLogRecord中的initLog&#xff08;&#xff09;方法就是加载这个log4j.properties的. 首先先看log4j.properties的配置文件 log4j.rootLoggerdebug, stdout, Rlog4j.appender.stdoutorg.apache.log4j.Co…

数据可视化:解锁企业经营的智慧之道

在现代企业管理中&#xff0c;数据可视化已经成为了一项重要的工具。它不仅仅是简单地展示数据&#xff0c;更是提供了深入理解数据、做出更明智决策的方法。作为一名可视化设计从业人员&#xff0c;我经手过一些企业自用的数据可视化项目&#xff0c;今天就来和大家聊聊数据可…

同一个kmz数据同样的底图在QGIS上显示位置正常, 在Mars3d中显示就偏移了一些

问题&#xff1a; 1.同一个kmz数据同样的底图在QGIS上显示位置正常, 在网页中显示就偏移了一些 在qgis上的显示效果&#xff0c;和在mars3d的显示效果&#xff1a;数据明显存在偏移。 解决步骤&#xff1a; 1.查看了kmz数据&#xff0c;里面实际是tif图片数据&#xff0c;估…

消息队列kafka详解:Kafka重要知识点+面试题大全

重要面试知识点 Kafka 消费端确保一个 Partition 在一个消费者组内只能被一个消费者消费。这句话改怎么理解呢&#xff1f; 在同一个消费者组内&#xff0c;一个 Partition 只能被一个消费者消费。 在同一个消费者组内&#xff0c;所有消费者组合起来必定可以消费一个 Topic 下…

gitee对接使用

1.创建一个文件夹 2.进入Gitee接受对方项目编辑 3.打开终端初始化一开始创建的文件夹 git init 3.1打开终端 3.2输入git.init 4.克隆对方的项目 4.1进入Gitee复制对方项目的路径 4.2在编辑器终端内克隆对方项目 git clone 网址 如此你的编辑器就会出现对方的项目 …