单链表实现和数组模拟单链表

news2024/11/20 11:43:46

现在有一个排好序的若干个元素(升序),现在要插入一个元素啊,请你输入插入该元素后的序列(升序)

请分别用单链表实现,和数组模拟单链表实现

为什么要用数组模拟单链表

1.内存局部性:数组在内存中是连续存储的,因此在访问元素时可以充分利用缓存,提升访问效率。而链表由于节点不连续,可能导致更多的缓存未命中。
2.减少内存碎片:链表的节点分散在内存中,可能会导致内存碎片,而使用数组可以保证内存的有效利用。
3.简化实现:在某些情况下,使用数组来模拟链表的操作(如插入、删除等)可以简化代码逻辑,因为数组的索引可以直接用于访问和修改元素。
固定大小的结构:如果知道链表的最大大小,可以预先定义一个足够大的数组,避免在运行时频繁分配和释放内存,这样可以提高效率。
4.特定应用场景:在某些特定的应用场景中,比如实现队列或栈等数据结构,使用数组可能更为合适。
在这里插入图片描述

在我们构建单链表的时候我们应该如何插入新的节点呢?
在这里插入图片描述
此时链表已经构建好了我们怎么插入新节点呢?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

单链表实现代码如下:

#include<iostream>
using namespace std;

// 定义链表节点结构体
struct node {
	int data;           // 节点数据
	struct node* next;  // 指向下一个节点的指针
};

struct node* head, * p, * r;

int main() {
	int n;
	cin >> n;
	head = new node;  // 创建头节点
	head->next = NULL; // 头节点的 next 初始为空
	r = head;

	// 创建 n 个元素的链表
	for (int i = 1; i <= n; i++) {
		p = new node;  // 分配新节点
		cin >> p->data;  // 输入节点数据
		p->next = NULL;  // 新节点的 next 设为 NULL
		r->next = p;     // 将新节点接到前一个节点的 next
		r = p;           // r 前移到新节点
	}

	int t;
	cin >> t;  // 读取要插入的数值
	struct node* q = new node;
	q->data = t;
	q->next = NULL;

	// 插入操作,处理链表为空或插入到头部的情况
	if (head->next == NULL || head->next->data > t) {
		// 如果链表为空,或者要插入的值比第一个节点的值小,则插入到头节点后
		q->next = head->next;  // q 的 next 指向头节点的下一个节点
		head->next = q;        // 头节点的 next 指向 q
	}
	else {
		// 遍历链表找到合适的位置进行插入
		p = head->next;  // p 指向第一个有效节点
		while (p->next != NULL && p->next->data <= t) {
			p = p->next;  // 找到第一个比 t 大的节点
		}
		// 将 q 插入到 p 之后
		q->next = p->next;
		p->next = q;
	}

	// 输出链表中的所有元素
	p = head->next;  // 从第一个有效节点开始遍历
	while (p != NULL) {
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;

	return 0;
}

数组模拟单链表

在这里插入图片描述

数组模拟单链表代码如下:

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;

int main() {
    // 存储数据值的数组
    int data[101];
    // 存储链表结构的“右指针”数组
    int right[101];
    int n, len, t;

    // 将“右指针”数组初始化为 -1
    memset(right, -1, sizeof(right));

    // 读取元素个数
    cin >> n;

    // 将初始的有序数据读取到 data 数组中
    for (int i = 1; i <= n; i++) {
        cin >> data[i];
    }

    // 将长度设置为读取的元素个数
    len = n;

    // 设置链表的“右指针”
    for (int i = 0; i < n; i++) {
        right[i] = i + 1;  // 将每个索引连接到下一个索引
    }
    right[n] = -1;  // 最后一个元素指向 -1,表示结束

    // 输入要插入的新元素
    len++;  // 增加长度以考虑新元素
    cin >> data[len];

    // 找到正确的插入位置
    t = 0;  // 从链表的头部开始

    // 遍历链表以找到插入点
    while (true) {
        // 检查是否应该在当前节点后插入新元素
        if (right[t] == -1 || data[right[t]] > data[len]) {
            // 设置新元素的右指针
            right[len] = right[t];
            right[t] = len;  // 将当前节点连接到新元素
            break;  // 插入完成,退出循环
        }
        t = right[t];  // 移动到下一个节点
    }

    // 输出包含新插入元素的有序链表
    t = right[0];  // 从链表的头部开始
    while (t != -1) {
        cout << data[t] << " ";  // 打印当前元素
        t = right[t];  // 移动到下一个元素
    }

    return 0;  // 程序结束
}

单链表和数组模拟单链表gitee源码

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

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

相关文章

了解针对基座大语言模型(类似 ChatGPT 的架构,Decoder-only)的重头预训练和微调训练

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 随着自然语言处理&#xff08;NLP&#xff09;技术的飞速进步&#xff0c;基于 Transformer 架构的大语言模型在众多任务中取得了显著成就。特别是 Decoder-only 架构&#xff0c;如 GPT 系列模型&…

“警警”有条:zCloud告警中心的告警与处置实践

ENMOTECH 随着金融行业数字化转型步伐的加快&#xff0c;海量数据处理成为常态&#xff0c;而作为数据存储和管理的核心——数据库的稳定性与效率直接影响着企业的运营成效。某金融科技企业使用了近10个品类、300余套数据库来承载业务&#xff0c;在专业运维、集中管理等方面都…

【操作系统】速成3

Linux内核和windows内核 原来鸿蒙是微内核 windows混合内核 参考&#xff1a;xiaolincoding.com

5种强大的方式:AI在临终关怀中提升护理质量,改善生活

目录 什么是临终关怀中的AI&#xff1f;AI如何个性化临终关怀&#xff1f;AI如何改善临终关怀患者的生活质量&#xff1f; 疼痛管理症状管理的预测分析情感和心理支持高效的资源分配减轻家庭压力 临终关怀中AI的未来 近年来&#xff0c;医疗保健行业在人工智能&#xff08;AI…

MySQL --事务(上)

文章目录 1.什么是事务1.1为什么会出现事务1.2 事务的版本支持1.3 事务提交方式1.4事务常见操作方式1.4.1正常演示 - 证明事务的开始与回滚1.4.2非正常演示1 - 证明未commit&#xff0c;客户端崩溃&#xff0c;MySQL自动会回滚&#xff08;隔离级别设置为读未提交&#xff09;1…

Ubuntu环境切换到服务器某个用户后source等命令和Tab快捷补全都用不了了,提示没找到,但root用户可以

以escs用户为例&#xff1a; 输入以下命令 grep root /etc/passwd grep escs /etc/passwd 对比发现&#xff0c;root用户配的是bash&#xff0c;而escs却是sh&#xff0c; 所以把escs的sh改成和root一样的bash&#xff0c;命令为 usermod -s /bin/bash escs 改好后就可以了。 …

Win11 安装 PostgreSQL 数据库,两种方式详细步骤

文章目录 一、exe文件安装 &#xff08;推荐&#xff09;下载安装包1. 选择操作系统2. 跳转到EDB&#xff08;PostgreSQL 的安装包托管在 EDB上&#xff09;3. 选择版本点击下载按钮 安装1. 管理员打开安装包2. 选择安装目录3. 勾选安装项4. 设置数据存储目录5. 设置管理员密码…

C语言线程编程深度解析

文章目录 前言一、线程基础概念1. 什么是线程&#xff1f;2. 线程与进程的区别 二、POSIX线程库&#xff08;pthread&#xff09;1. pthread简介2. 编译与链接3. 创建线程示例代码&#xff1a; 4. 线程同步互斥锁&#xff08;Mutex&#xff09;示例代码&#xff1a; 条件变量&a…

SpringBoot代码实战(MyBatis-Plus+Thymeleaf)

构建项目 修改pom.xml文件&#xff0c;添加其他依赖以及设置 <!--MyBatis-Plus依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.6</version><…

智源研究院与百度达成战略合作 共建AI产研协同生态

2024年9月24日&#xff0c;北京智源人工智能研究院&#xff08;简称“智源研究院”&#xff09;与北京百度网讯科技有限公司&#xff08;简称“百度”&#xff09;正式签署战略合作协议&#xff0c;双方将充分发挥互补优势&#xff0c;在大模型等领域展开深度合作&#xff0c;共…

共享打印机无法创建打印作业原因分析及解决方法

在日常办公和生活中&#xff0c;打印机是不可或缺的重要设备。然而&#xff0c;有时在添加打印机的过程中&#xff0c;经常会遇各种问题。今天有个小伙伴问我在访问共享打印机时提示“无法创建打印作业”怎么回事&#xff1f;今天小编就教大家共享打印机无法创建打印作业原因分…

多表查询。

一、多表查询 select * from 表名,表名; select * from 表名,表名 where 条件; 二、内连接 隐式 select 字段列表 from 表1,表2 where 条件; 显示 select 字段列表 from 表1 INNER JOIN 表2 on 条件; 三、外连接 1.左外连接 select 字段列表 from 表1 left [outer] join 表…

接口自动化测试框架详解(pytest+allure+aiohttp+ 用例自动生成)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 近期准备优先做接口测试的覆盖&#xff0c;为此需要开发一个测试框架&#xff0c;经过思考&#xff0c;这次依然想做点儿不一样的东西。 接口测试是比较讲究效…

【C++】STL--string(下)

1.string类对象的修改操作 erase&#xff1a;指定位置删除 int main() {string str1("hello world");str1.push_back(c);//尾插一个ccout << str1 << endl;string str2;str2.append("hello"); // 在str后追加一个字符"hello"cout…

openwrt固件选择推荐一:kwrt

前言 本文将推荐第一个openwrt固件Kwrt&#xff0c;帮助openwrt新手用户快速构建自己固件。下篇会推荐第二个Openwrt优秀固件。 一.openwrt定制系统&#xff1a;Kwrt github项目地址&#xff1a;点击跳转 支持300设备 1.提供在线定制页面&#xff0c;定制预装软件 固件在…

如何在 Windows 台式机或笔记本电脑上恢复未保存的 Excel 文件

您的汗水很容易化为灰烬&#xff0c;如果您没有保存长时间编写的项目报告或电子表格&#xff0c;这可能会令人心碎。丢失 Windows PC 上未保存的 Excel 文件可能是导致这种情况的原因。但您不应该惊慌。仍然有机会恢复未保存的 Excel 文件。 在本指南中&#xff0c;我们将向您…

failed to load steamui.dll的多种处理方法,steamui.dll的作用

在使用Steam平台时&#xff0c;不少玩家可能会遇到“failed to load steamui.dll”这样令人头疼的错误提示。这个错误会阻碍Steam客户端的正常运行&#xff0c;影响我们享受游戏和Steam平台的各种服务。不过&#xff0c;不必过于担心&#xff0c;因为有多种方法可以尝试解决这个…

车位租赁系统的设计与实现

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;车位信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

3d gaussian splatting公式推导

1. 离散公式推导 nerf中连续的积分渲染公式是&#xff1a; 其中被遮挡率&#xff1a; 那么转换为离散公式后有&#xff1a; 其中&#xff0c;代表j时刻的时间差&#xff0c;将其带入渲染公式&#xff1a; 设透明度 则被遮挡率 有 而gaussian-splating的公式与ner…

CNN-LSTM预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测

CNN-LSTM预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测 目录 CNN-LSTM预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 本次运行测试环境MATLAB2020b 提出一种包含卷积神经网络和长短…