深入理解数据结构——模拟链表

2023-11-08

#include <iostream>
#include <string>

using namespace std;

typedef int Etype;     // 自定义链表的数据元素为整数。
//定义数据元素节点结构
typedef struct SimNode
{
	Etype data;          // 存放结点的数据元素。
	int next;           // 存放下一个元素地址。
};

typedef string HeadEtype;     // 自定义表头的数据元素为整数。
//定义表头结构
typedef struct SimChainList
{
	SimNode *node;       //用于指向数组的指针
	int maxsize;		//用于指定存储值大小
	int first;          //指向第一个节点
};

//模拟链表初始化
void CreatSimChainList(SimChainList &L,int MaxSpaceSize) {

	L.maxsize = MaxSpaceSize;
	L.node = new SimNode[L.maxsize];//新建一个结构体数组
	for (int i = 0; i < L.maxsize-1; i++) {
		L.node[i].next = i + 1;//使得每个元素的地址为序号
	}
	L.node[L.maxsize - 1].next = -1;//最后一个元素的后驱地址设为-1;
	L.first = 0;//第一个数据点的地址定义为0
}

//模拟链表中节点空间的分配
int GetNode(SimChainList&L) {
	if (L.first == -1) return -1;//如果为空表
	int i = L.first;//表头指向的第一个元素未必是1,可能是10
	L.first = L.node[i].next;//表头指针指向链表下一节点
	return i;
}

//模拟链表中节点空间的释放
void FreeNode(SimChainList &L,int i) {
	L.node[i].next = L.first;
	L.first = i;
}

//模拟链表的第k个节点后面插入节点
bool InsertSimChainList(SimChainList& L, int& first, int k, Etype& x) {
	if (k < 0) return false;//如果插入节点小于0

	int current = first;//第一个元素的序号
	for (int index = 1; index < k && current != -1; index++){//找到第k个元素
		current = L.node[current].next;
	}
	if (k > 0 && current == -1) return false;//当前节点为内存空间的最后一个节点,所以不能插入了
	int q = GetNode(L);//获取一个节点空间
	L.node[q].data = x;//将x存入q空间
	if (k) {
		L.node[current].next = q;//将q插到k节点后面
		L.node[q].next = L.node[current].next;//将k+1节点后移
	}
	else {
		//k插入第一个节点,作为链表的首节点		
		L.node[q].next = first;//把q插在第一个节点前面,q后面的节点就是first
		q = first;//再把q节点的序号,改为第一个节点。
	}
	return true;
}

//在first指向的链表中删除第k个节点
bool DeleteSimChainList(SimChainList &L,int &first,int k) {
	if (k < 1 || first == -1) return false;
	int current = first;//指向链表第一个元素
	if (k == 1)//删除第一个节点
	{
		first = L.node[first].next;//将第一个元素更换为第二个元素
	}
	else {
		int q = first;
		for (int index = 1; index < k - 1 && q != -1;index++) {
			q = L.node[q].next;
		}
		current = q;//
		if (q == -1 || L.node[q].next == -1) return false;//当前元素为空,或者下一个元素为空

		q = L.node[q].next;//把第k个元素替换成k+1个元素
		L.node[q].next = L.node[current].next;//q当前指向k+1;qnext就是k+2的节点,q的下一个节点换成原表k的下一个节点


	}
	FreeNode(L, current);//释放k节点空间
	return true;
}

//模拟链表的输出
void OutputSimChainList(SimChainList& L, int& first) {
	int current = first;
	while (current != -1) {
		cout << L.node[current].data << endl;
		current = L.node[current].next;
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解数据结构——模拟链表 的相关文章

  • 如何在 Caliburn.Micro 中使用 Conductor 的依赖注入

    我有时用Caliburn Micro http caliburnmicro com创建应用程序 使用最简单的 BootStrapper 我可以像这样使用 IoC 容器 SimpleContainer private SimpleContai
  • 为什么在 lambda 内部引发异常是 C# 7 的一项功能? [复制]

    这个问题在这里已经有答案了 该语句在 VS2015 中无法编译 但在 VS2017 中可以编译 var example new Action gt throw new Exception 为了支持在 lambda 表达式内抛出异常 必须对
  • 将 ARGB 拆分为字节值

    我有一个 ARGB 值存储为 int 类型 它是通过调用 ToArgb 来存储的 我现在想要来自 int 值的各个颜色通道的字节值 例如 int mycolor 16744448 byte r g b a GetBytesFromColor
  • 如何创建语法突出显示文本框[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 C Net 创建语法突出显示文本框 Take 闪烁网 http scintillanet codeplex com 并采取其
  • 为什么使用数组索引循环数组比指针访问慢?

    我正在读Kochan的书 Programming in C 在第 14 页的 指针和数组 部分中 264 他说 一般来说 索引数组的过程比执行索引过程花费更多的时间 访问指针内容的过程 其实这也是主要原因之一 为什么使用指针来访问数组的元素
  • Monitor.Pulse & Wait - 意外行为

    http www codeproject com Articles 28785 Thread synchronization Wait and Pulse demystified http www codeproject com Artic
  • 提取单花括号内的值

    我想要一个收藏 value 一个字符串使用正则表达式 例如 lorem ipsum field1 lorem ipsum field2 lorem ipsum field1 lorem ipsum field2 field3 我会得到 fi
  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不
  • 将视频上传/保存到数据库或文件系统

    我以前从未尝试过保存视频 所以我对此了解不多 我知道如果视频很小 我可以转换为字节数组并保存到数据库 但是为了提高效率 我想了解如何将任何上传的视频保存到我的服务器文件中 然后只保存该文件的文件路径我的数据库表中的视频 我完全不知道如何开始
  • 编译器消息“警告:格式‘%s’需要类型‘char *’,但参数 2 具有类型‘char (*)’”

    我正在尝试运行一个简单的 C 程序 但收到此错误 警告 格式 s 需要类型 char 但参数 2 的类型为 char 20 我在跑步Mac OS X v10 8 https en wikipedia org wiki OS X Mounta
  • 是否自初始化 'A a = a;'允许吗?

    此代码在运行时在复制构造函数中失败 但编译器 MSVS2008 没有发出警告 您能解释一下 最好引用标准 这段代码是否非法或什么 我理解 A a a 永远不应该写在第一位 但我正在寻找理论背景 class A public A p new
  • 在 Linq 查询中使用动态列名称

    foreach Dimension dimensions in Enum GetValues typeof Dimension var r new ReferenceTable dimensions referenceItems List
  • 如何将输出重定向到 boost 日志?

    我有一个使用boost log的C 程序 我加载了用户提供的动态链接库 我想将 stderr 重定向到 boost 日志 以便用户的库随时执行以下操作 std cerr lt lt Some stuff 它产生相同的结果 BOOST LOG
  • 当分配返回 0 时,具有空异常规范的运算符 new 调用构造函数

    我有以下声明 void operator new size t s PersistentMemory m throw return m gt allocatePersistentMemory s 我正在测试启动时的内存耗尽 这会导致m gt
  • WCF 服务中的缓冲区大小

    我们有一个 WCF 服务 它执行某些存储过程并将结果返回给 silverlight 客户端 某些存储过程最多返回 80K 行 下面给出的是 web config 中服务的设置
  • 当一对迭代器初始化时,向量是否知道先保留?

    考虑以下代码 struct MyData MyData const BYTE pData size t uSize bucket pData pData uSize std vector
  • 如何在realm-dotnet中存储System.Collections.Generic.Dictionary

    我正在尝试将 Realm NET 集成到我的 uwp 项目中 我想知道是否有任何方法可以在 Realm dotnet 库中存储 System Collections Generic Dictionary 我试过这个 public class
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • 小数精度

    我使用小数类型进行高精度计算 货币 但我今天遇到了这个简单的划分 1 1 37 这应该再次得到 37 http www wolframalpha com input i 1 2F 281 2F37 29 http www wolframal
  • Selenium - 模式对话框存在 - 如何接受信息?

    我有以下问题 在页面上提交一些日期后 我有一个如图所示的模式对话框 我想单击 ENTER 来浏览该模式 但它不起作用 我有以下代码 driver FindElement By CssSelector input submit Click A

随机推荐

  • 《effective c++》总结

    文章目录 前言 条款02 尽量以const enum inline替换 define 条款03 尽可能使用const 条款04 确定对象被使用前已先被初始化 条款05 了解c 默默编写并调用哪些函数 条款06 若不想使用编译器自动生成的函数
  • Android开发下遇到的一些奇葩问题处理

    环境 MAC Android Studio Q1 Gradle Home not found 网上查到的解决方案比较少一些 如 gradle wrapper properties 配置错误等等 Solution 我的解决是 无意中点了Run
  • 希沃展台如何使用_视频展台的操作步骤

    键盘控制 1 开启展示台及外围设备 按select键选择信号源 当body指示灯亮时 输出信号为摄像头 当external指示灯亮时 输出信号为外部信号源 开机时默认为摄像头 2 将被演示物放置在展台上 调整摄像头对准被摄物体 3 根据镜头
  • K8S单master部署四:Kubelet+kube-proxy

    服务器角色分配 角色 地址 安装组件 master 192 168 142 220 kube apiserver kube controller manager kube scheduler etcd node1 192 168 142 1
  • 创新实训(21)——推荐算法的评估

    前言 昨天使用Mohout推荐引擎实现了用户的协同过滤算法 今天使用昨天实现的算法计算一下推荐的准确率以及查全率 查准率 算法评判标准 召回率 recall 与查准率 precision A 检索到的 相关的 搜到的也想要的 B 未检索到的
  • uni-app onBackPress 小程序 解决方案 uni-app返回

    onBackPress 只支持APP和H5 但不支持小程序 可以用onUnload生命周期解决 页面销毁的时候执行方法
  • 史上最简单的 SpringCloud 教程

    转载请标明出处 原文首发于 https www fangzhipeng com springcloud 2018 08 30 sc f1 eureka 本文出自方志朋的博客 一 spring cloud简介 鉴于 史上最简单的Spring
  • 2PC算法

    概述 2PC 是Two Phase Commit的缩写 即二阶段提交 主要解决的问题是让基于分布式架构下的所有节点在进行事务处理过程中能够保证原子性和一致性 它的核心思想是 一票否决 提交过程 正如它的名字 它的提交分为两个阶段 第一阶段
  • 测试操作xml文件

    先查出所有的时间 并转换为时间戳 time SELECT ROW NUMBER OVER ORDER BY a SERIAL AS row num a SERIAL a COMMANDID a CELLID a USERID a LIBTI
  • Redis 数据类型 (完整版)

    Redis 数据类型 Redis支持五种数据类型 string 字符串 hash 哈希 list 列表 set 无序集合 zset 有序集合 1 String 字符串 set key value 赋值 get key 取值 127 0 0
  • 十大经典排序算法最强总结

    点击上方 我要学编程 选择 置顶 星标公众号 福利干货 第一时间送达 排序算法属于经典基础算法基本功 笔试面试基本都会涉及和考察的 有原题也有变化 不过基础的几大排序算法还是得尽可能熟悉 能在思路熟悉的前提下手写出代码就更好了 为了防止不提
  • 开源中国 2018 年度榜单之国产新秀榜

    回看 2018 年 无论是国内外 科技公司对 开源 投入的巨大资本不仅令人咋舌 更重要的是 伴随着资本的强势注入 有理由相信 开源 将会有更光明且清晰可见的未来 而开源软件作为其中最重要的一环 除了充分展示 开源 的生态丰富之外 还在某种程
  • Java并发编程学习4-线程封闭和安全发布

    Java并发编程学习系列 线程封闭和安全发布 1 线程封闭 1 1 Ad hoc 线程封闭 1 2 栈封闭 1 3 ThreadLocal 类 2 不变性 2 1 Final 域 2 2 不可变对象的简单示例 3 安全发布 3 1 不正确的
  • 全方位解读Web3域名:DID基石、NFT新增长点

    1 Web3域名在NFT市场整体低迷的背景下表现出色 2 Web3域名有庞大的用户群体和巨大的上升空间 3 Web3域名是用户重要的Web3身份凭证 可使用域名访问全链应用 4 Web3域名长期来看使用大于炒作 今年下半年 Web3域名在N
  • gitlab配置https方式访问

    1 mkdir etc gitlab ssl 创建ssl证书目录 2 上传证书 3 配置gitlab vim etc gitlab gitlab rb external url https cloud cn nginx enable tru
  • hisi Camera 开发--HiMPP媒体处理软件开发基本概念

    1 HIMPP平台架构简介 海思提供的媒体处理软件平台 Media Process Platform 简称 MPP 可支持应用软件快速开发 该平台对应用软件屏蔽了芯片相关的复杂的底层处理 并对应用软件直接提供 MPI MPP Program
  • 基于gensim的Doc2Vec简析,以及用python 实现简要代码

    Doc2Vec 原理 Doc2Vec 或者叫做 paragraph2vec sentence embeddings 是一种非监督式算法 可以获得sentences paragraphs documents 的向量表达 是 word2vec
  • c++基础练习题四

    1 编程实现以下功能 矩形有长a和宽b 现有2个矩形 要求实现矩形相加时可以得到一个新的矩形 它的长为两个矩形的长a相加 宽为两个矩形的宽b和b相加 要求定义类实现 自己设计 可以输出新矩形的长和宽 矩形相加要求使用运算符 重载实现 inc
  • 分布式链路追踪之Spring Cloud Sleuth+Zipkin最全教程

    今天这篇文章陈某介绍一下链路追踪相关的知识 以Spring Cloud Sleuth和zipkin这两个组件为主 后续文章介绍另外一种 文章的目录如下 为什么需要链路追踪 大型分布式微服务系统中 一个系统被拆分成N多个模块 这些模块负责不同
  • 深入理解数据结构——模拟链表

    include