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

news2024/11/26 4:38:49

术语:

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的数据域设置为e
	s->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.coloradmin.cn/o/1296575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大创项目推荐 交通目标检测-行人车辆检测流量计数 - 大创项目推荐

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

Day54力扣打卡

打卡记录 出租车的最大盈利&#xff08;动态规划&#xff09; 链接 class Solution:def maxTaxiEarnings(self, n: int, rides: List[List[int]]) -> int:d defaultdict(list)for start, end, w in rides:d[end].append((start, end - start w))f [0] * (n 1)for i in…

Spring Boot整合 Spring Security

Spring Boot整合 1、RBAC 权限模型 RBAC模型&#xff08;Role-Based Access Control&#xff1a;基于角色的访问控制&#xff09; 在RBAC模型里面&#xff0c;有3个基础组成部分&#xff0c;分别是&#xff1a;用户、角色和权限&#xff0c;它们之间的关系如下图所示 SELECT…

案例061:基于微信小程序的互助学习系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

销售技巧培训之如何提高手机销售技巧

销售技巧培训之如何提高手机销售技巧 随着科技的迅速发展&#xff0c;手机已成为我们日常生活中不可或缺的一部分。作为一名手机销售员&#xff0c;了解手机销售技巧是必不可少的。本文将通过案例分析与实践&#xff0c;为你揭示手机销售的奥秘。 一、了解客户需求 在销售过程…

IDEA 出现问题:Idea-操作多次commit,如何合并为一个并push解决方案

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

【软件安装】VMware安装Centos7虚拟机并且设置静态IP,实现Windows和Centos7网络互相访问

这篇文章&#xff0c;主要介绍VMware安装Centos7虚拟机并且设置静态IP&#xff0c;实现Windows和Centos7网络互相访问。 目录 一、VMware安装Centos7 1.1、下载Centos7镜像 1.2、安装Centos7系统 二、设置静态IP地址 2.1、查看虚拟机网络IP 2.2、禁用NetworkManager服务 …

Elastic Support Hub 转向语义搜索

作者&#xff1a;Chris Blaisure 我们很高兴与大家分享 Elastic Support Hub 最近的增强功能&#xff1a;它现在由语义搜索提供支持&#xff01; 但在我们更详细地了解对 Elastic Support Hub 所做的更改及其对客户的影响之前&#xff0c;我们需要花点时间解释语义搜索的概念&…

Amazon CodeWhisperer 开箱初体验

文章作者&#xff1a;Coder9527 科技的进步日新月异&#xff0c;正当人工智能发展如火如荼的时候&#xff0c;各大厂商在“解放”码农的道路上不断创造出各种 Coding 利器&#xff0c;今天在下就带大家开箱体验一个 Coding 利器&#xff1a; Amazon CodeWhisperer。 亚马逊云科…

【HTML】解析垂直滚动轮播效果的HTML、CSS和JavaScript实现

解析垂直滚动轮播效果的HTML、CSS和JavaScript实现 在现代Web开发中&#xff0c;滚动轮播效果是网页设计中常见的交互元素之一。在本文中&#xff0c;我们将深入解析一段HTML、CSS和JavaScript的代码&#xff0c;实现了一个简单而高效的垂直滚动轮播效果。通过该代码&#xff…

自动化使用GradCAM处理图片(用于ViT和swin的变体)附链接

GradCAM_On_ViT 用于可视化模型结果的 GradCAM 自动脚本 如何在 GradCam 中调整 XXXFormer 请确保您的模型格式正确。 如果您应用的变压器是类似 swin&#xff08;无ClassToken&#xff09;或类似 ViT &#xff08;有ClassToken&#xff09; 张量的形状可能看起来像[Batc…

linux Ubuntu下,第一个C++程序访问数据库,遇到的问题,及解决办法

在ubuntu下安装了mysql&#xff0c;mysql以后&#xff0c;编写了第一个访问数据库的程序&#xff1a; #include <iostream> #include <string> #include <cstdlib> //for system #include <mysql.h>using namespace std;int main() {mysqlpp::Connect…

webSRc实现浏览器播放rtsp【海康】

先上代码 <template><div>video的配置自己写<video id"video" autoplay width"900" height"900"></video></div> </template><script> export default {name: index1,data() {return {webRtcServer: …

关于IDEA中maven的作用以及如何配置MAVEN

关于IDEA中maven的作用以及如何配置MAVEN 1、Maven是什么2、Idea中对于Maven的配置3、下载依赖时&#xff0c;Idea下方的显示3.1、Maven中央仓库的下载显示界面3.2、阿里云仓库的下载显示界面 4、Maven在Idea中的使用4.1、clean4.2、validate4.3、compile4.4、test&#xff08;…

go语言 grpc 拦截器

文章目录 拦截器服务端拦截器一元拦截器流拦截器 客户端拦截器一元拦截器流拦截 多个拦截器 代码仓库 拦截器 gRPC拦截器&#xff08;interceptor&#xff09;是一种函数&#xff0c;它可以在gRPC调用之前和之后执行一些逻辑&#xff0c;例如认证、授权、日志记录、监控和统计…

目标检测——OverFeat算法解读

论文&#xff1a;OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks 作者&#xff1a;Pierre Sermanet, David Eigen, Xiang Zhang, Michael Mathieu, Rob Fergus, Yann LeCun 链接&#xff1a;https://arxiv.org/abs/1312.6229 文章…

actitivi自定义属性(二)

声明&#xff1a;此处activiti版本为6.0 此文章介绍后端自定义属性解析&#xff0c;前端添加自定义属性方法连接&#xff1a;activiti自定义属性&#xff08;一&#xff09;_ruoyi activiti自定义标题-CSDN博客 1、涉及到的类如下&#xff1a; 简介&#xff1a;DefaultXmlPar…

2023年江西省“振兴杯”网络信息行业(信息安全测试员)职业技能竞赛 Write UP

文章目录 一、2023csy-web1二、2023csy-web2三、2023csy-web3四、2023csy-web4五、2023csy-misc1六、2023csy-misc2七、2023csy-crypto1八、2023csy-re1 一、2023csy-web1 该题提供一个web靶场&#xff0c;《伟大的挑战者》&#xff0c;分值&#xff1a;5分 web页面一直在播放c…

nodejs+vue+微信小程序+python+PHP的智能停车系统-计算机毕业设计推荐django

随着网络技术的不断发展&#xff0c;多媒体技术应用渐渐的出现在教育领域中&#xff0c;智能停车算法研究管理已经成为社会的一个热门话题。互联网应用在全球范围内日益普及&#xff0c;在许多的网络服务中&#xff0c;Web给人耳目一新的感觉。在这其中&#xff0c;网络平台开展…

unity 2d 入门 飞翔小鸟 小鸟碰撞 及死亡(九)

1、给地面&#xff0c;柱体这种添加2d盒装碰撞器&#xff0c;小鸟移动碰到就不会动了 2、修改小鸟的脚本&#xff08;脚本命名不规范&#xff0c;不要在意&#xff09; using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : Mo…