我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++怎么用数组模拟链表

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++怎么用数组模拟链表

这篇文章的内容主要围绕C++怎么用数组模拟链表进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!

前言

链表是指由一系列储存在非连续储存空间 结点组成的储存结构。每个结点由两部分组成:一是储存元素的数据域,一是储存下一个节点地址的指针域。用数组模拟链表可以十分清晰明了地理解这一定义。

在这里,我们简单地介绍一下单链表和双链表两种链表以及用数组模拟实现它们的方式。

1.单链表

单链表是指针方向单向的链表,即a结点的指针域储存着b结点的地址,而b结点的指针域内没有储存a结点的地址。在访问时,可以由a到b访问,而不能由b到a访问。

C++怎么用数组模拟链表

如图可以清晰地看到,各个结点的指向都是单向的。

Q: 那么,如何用数组来实现它呢?

A: 方法如下

在k结点右侧插入元素x。先将x赋值给该节点的数据域(e[idx]),然后将k结点的指针域赋值给该结点的指针域,最后将k结点的指针域储存的地址改为该节点的地址。

void add(int k, int x){    e[idx] = x;    ne[idx] = ne[k];    ne[k] = idx++;}
删除k结点指向的结点。这里所指的删除,是将k的指向改为该结点的指向。原本为a -> b -> c,改为a -> c,b结点依然存在,只是没有其他结点指向它,也就无法通过链表访问它,我们认为它就再链表上被删除了。
void remove(int k){    ne[k] = ne[ne[k]];}

读取链表。读取链表只用注意一点,在用单指针扫描时不是将指针位置右移,而是将指针移动到该结点指向的位置。

for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';cout << endl;

主要的操作就是如此,下边看看完整代码:

这是较为经典的写法,我个人认为有些麻烦,head不必单独拿出来写一个函数。但是有助于理解。

#include<iostream>using namespace std;const int M = 1e5 + 10;int m, k, x, idx, head;int e[M], ne[M];void init(){    head = -1, idx = 0;}void add_head(int x){    e[idx] = x;    ne[idx] = head;    head = idx++;}void remove(int k){    ne[k] = ne[ne[k]];}void add(int k, int x){    e[idx] = x;    ne[idx] = ne[k];    ne[k] = idx++;}int main(){    init();    cin >> m;    while (m--)    {        char op;        cin >> op;        if (op == 'H')        {            cin >> x;            add_head(x);        }        else if (op == 'D')        {            cin >> k;            if (!k) head = ne[head];            remove(k - 1);        }        else        {            cin >> k >> x;            add(k - 1, x);        }    }    for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';    cout << endl;    return 0;}

这种写法稍微简便一些,用a[0]替代head。

#include<iostream>using namespace std;const int M = 1e5 + 10;int m, k, x, idx, head;int e[M], ne[M];void init(){    ne[0] = -1, idx = 1;}void remove(int k){    ne[k] = ne[ne[k]];}void add(int k, int x){    e[idx] = x;    ne[idx] = ne[k];    ne[k] = idx++;}int main(){    init();    cin >> m;    while (m--)    {        char op;        cin >> op;        if (op == 'H')        {            cin >> x;            add(0, x);        }        else if (op == 'D')        {            cin >> k;            if (!k) head = ne[head];            remove(k);        }        else        {            cin >> k >> x;            add(k, x);        }    }    for (int i = ne[0]; i != -1; i = ne[i]) cout << e[i] << ' ';    cout << endl;    return 0;}

2.双链表

双链表顾名思义就是指针方向双向的链表。

C++怎么用数组模拟链表

可以看到除了头尾他们的指针都是双向的。

它的实现方法如下:

创建开始和结束结点。0表示开始,1表示结束,互相指向,在插入时直接往中间插入即可。

void init(){r[0] = 1, l[1] = 0;idx = 2;}

插入结点。双链表插入结点的方法与单链表相同,但是操作要稍微复杂一些,这是在k结点右边插入一结点的代码。它要顾及结点左右的结点指向,对于两边都要操作。面临在k结点左边插入一结点时,不必单独在写一个函数,而改成在l[k]结点的右边插入一个结点。

void add(int k, int x){a[idx] = x;r[idx] = r[k], l[idx] = l[r[k]];l[r[k]] = idx, r[k] = idx;idx++;}

删除节点。删除结点与插入结点同理,我就不多赘述了。

void remove(int k){r[l[k]] = r[k];l[r[k]] = l[k];}

输出链表。可以选择输出方向,这里是从左往右输出。

for (int i = r[0]; i != 1; i = r[i])cout << a[i] << ' ';cout << endl;

以下是完整代码:

#include<iostream>using namespace std;const int N = 1e5 + 10;int a[N], l[N], r[N];int idx;int m;void init(){r[0] = 1, l[1] = 0;idx = 2;}void add(int k, int x){a[idx] = x;r[idx] = r[k], l[idx] = l[r[k]];l[r[k]] = idx, r[k] = idx;idx++;}void remove(int k){r[l[k]] = r[k];l[r[k]] = l[k];}int main(){init();cin >> m;while (m--){int k, x;string op;cin >> op;if (op == "L"){cin >> x;add(0, x);}else if (op == "R"){cin >> x;add(l[1], x);}else if (op == "D"){cin >> k;remove(k + 1);}else if (op == "IL"){cin >> k >> x;add(l[k + 1], x);}else if (op == "IR"){cin >> k >> x;add(k + 1, x);}}for (int i = r[0]; i != 1; i = r[i])cout << a[i] << ' ';cout << endl;return 0;}

感谢你的阅读,相信你对“C++怎么用数组模拟链表”这一问题有一定的了解,快去动手实践吧,如果想了解更多相关知识点,可以关注编程网网站!小编会继续为大家带来更好的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++怎么用数组模拟链表

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++怎么用数组模拟链表

这篇文章的内容主要围绕C++怎么用数组模拟链表进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!前言链表是指由一系列储存在非连续储存空间 结点组成的储存
2023-06-26

C++数组模拟之单链表与双链表和栈和队列的实现过程

这篇文章主要介绍了C++数组模拟之单链表与双链表和栈和队列的实现过程,了解内部原理是为了帮助我们做扩展,同时也是验证了一个人的学习能力,如果你想让自己的职业道路更上一层楼,这些底层的东西你是必须要会的,跟随下文来具体了解吧
2023-02-13

C#中的数组怎么转化成链表

在C#中,可以使用`LinkedList`类来将数组转换为链表。`LinkedList`类是C#中的一个内置泛型类,用于表示双向链表。要将数组转换为链表,可以按照以下步骤进行:1. 创建一个`LinkedList`对象,其中`T`是数组元素
2023-09-09

PHP中怎么利用数组实现单链表

本篇文章为大家展示了PHP中怎么利用数组实现单链表,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。PHP数组实现单链表结构此类主要是依靠PHP强大的数组系统来模拟出单链表类型的数据结构。 本人完全凭借
2023-06-17

C#集合的链表怎么用

这篇文章主要介绍了C#集合的链表怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#集合的链表怎么用文章都会有所收获,下面我们一起来看看吧。LinkedList是一个双向链表,其元素会指向它前面和后面
2023-06-30

web数组与链表到单链表的反转怎么理解

本篇内容主要讲解“web数组与链表到单链表的反转怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web数组与链表到单链表的反转怎么理解”吧!数组与链表数组最大的一个特点就是,需要一块连续的
2023-06-16

c++中数组怎么表示

c++ 中数组是一种用于存储具有相同数据类型的一组连续内存单元的数据结构。数组的元素使用下标运算符访问,其下标从 0 开始。数组的属性包括尺寸(存储的元素数量)、数据类型(元素的数据类型)和地址(数组第一个元素的内存地址)。C++ 中数组的
c++中数组怎么表示
2024-04-26

C++怎么实现每k个一组翻转链表

本篇内容主要讲解“C++怎么实现每k个一组翻转链表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么实现每k个一组翻转链表”吧!Reverse Nodes in k-Group 每k个一组
2023-06-20

C语言中单链表怎么用

这篇文章将为大家详细讲解有关C语言中单链表怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、单链表概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序
2023-06-29

php数组怎么进行堆栈的模拟

这篇文章给大家分享的是有关php数组怎么进行堆栈的模拟的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境。二、WampServer,Wa
2023-06-14

怎么用C++实现L2-002链表去重

本篇内容介绍了“怎么用C++实现L2-002链表去重”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!给定一个带整数键值的链表 L,你需要把其中
2023-06-20

怎么在Java中利用数组模拟循环队列

怎么在Java中利用数组模拟循环队列?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、
2023-06-14

怎么用C语言数组实现顺序表

这篇文章主要讲解了“怎么用C语言数组实现顺序表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用C语言数组实现顺序表”吧!线性表和顺序表线性表线性表(linear list)是n个具有相同
2023-06-25

C语言怎么模拟实现strlen函数

这篇文章主要讲解了“C语言怎么模拟实现strlen函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言怎么模拟实现strlen函数”吧!一.strlen函数的介绍1.strlen函数的声
2023-06-29

怎么用C++模拟实现STL容器

这篇文章主要介绍了怎么用C++模拟实现STL容器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用C++模拟实现STL容器文章都会有所收获,下面我们一起来看看吧。一、list的介绍列表是一种顺序容器,它允许在
2023-07-04

怎么用C++实现万花模拟器

本篇内容介绍了“怎么用C++实现万花模拟器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!还记得小时候玩的万花尺么?好好玩,各种不同的点距能画
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录