数据结构 单链表的模拟实现

devtools/2025/2/12 17:42:47/

一、链表的定义


线性表的链式存储就是链表。
它是将元素存储在物理上任意的存储单元中,由于⽆法像顺序表⼀样通过下标保证数据元素之间的逻辑关系,链式存储除了要保存数据元素外,还需额外维护数据元素之间的逻辑关系,这两部分信息合称结点(node)。即结点有两个域:保存数据元素的数据域和存储逻辑关系的指针域。

二、定义-创建-初始化


1. 两个⾜够⼤的数组,⼀个⽤来存数据,⼀个⽤来存下⼀个结点的位置
2. 变量h ,充当头指针,表⽰头结点的位置
3. 变量id ,为新来的结点分位置

const int N = 1e5 + 10;
int h; // 头指针 
int id; // 下⼀个元素分配的位置 
int e[N], ne[N]; // 数据域和指针域 
// 下标 0 位置作为哨兵位 
// 其中 ne 数组全部初始化为 0,其中 ne[i] = 0 就表⽰空指针,后续没有结点

三、头插

// 头插 
void push_front(int x)
{// 先把 x 放在⼀个格⼦⾥⾯ id++;e[id] = x;// 修改指针,顺序不能颠倒! // 1. x 的右指针指向哨兵位的后继 // 2. 哨兵位的右指针指向 x ne[id] = ne[h];ne[h] = id;
}

四、遍历链表

// 打印链表 
void print()
{// 定义⼀个指针从头结点开始 // 通过 ne 数组逐渐向后移动 // 直到遇到空指针 for(int i = ne[h]; i; i = ne[i]){cout << e[i] << " ";}cout << endl << endl;
}

通过i是否等于0来判断。

五、按值查找

解法⼀:遍历整个链表即可。
解法⼆:如果存储的值数据范围不⼤,可以⽤哈希表优化。(不知道哈希表是什么没有关系,只要知道mp数组的作⽤,把它当成⼀个标记数组即可。)

int mp[N]; // mp[i] 表⽰ i 在这个元素存放的位置 
/*push_front 和 insert 的时候,打上标记 mp[x] = id; // x 这个元素存放的位置是 id erase 的时候,消除标记 mp[x] = 0;
*/
// 查询值为 x 的元素存储的位置 
int find(int x) // 注意,这⾥传⼊的是元素的值 
{// 策略⼀:先找到 x,然后返回 x 后⾯的元素 for(int i = ne[h]; i; i = ne[i]) // 遍历链表 {if(e[i] == x) // 如果找到 x {return i;}}// 找不到就返回 0 return 0;// // 策略⼆:使⽤哈希表优化 return mp[x]; // mp[x] ⾥⾯就存着 x 这个元素存储的位置下标 
}

如果运用map操作,那么在头插中应该这样写

    id++;
    e[id] = x;
    mp[x] = id; 
    ne[id] = ne[h];
    ne[h] = id;

六、在任意位置之后插⼊元素

// 在存储位置为 p 的元素后⾯,插⼊⼀个元素 x 
void insert(int p, int x) // ⼀定要注意,这⾥的 p 是位置,不是元素 
{id++; // x 这个元素分配的位置 e[id] = x; // 将 x 放在 id 位置处 ne[id] = ne[p]; // x 指向 p 的后⾯ ne[p] = id; // p 指向 x 
}

和头插操作差不多。

就是把ne[h]换成了ne[p]。

若使用mp数组,应该

    id++;e[id] = x;mp[x] = id;ne[id] = ne[p];ne[p] = id;

七、删除任意位置之后的元素

// 删除存储位置为 p 后⾯的元素 
void erase(int p) // 注意 p 表⽰元素的位置 
{if(ne[p]) {mp[e[ne[p]]] = 0; // 将 p 后⾯的元素从 mp 中删除 ne[p] = ne[ne[p]]; // 指向下⼀个元素的下⼀个元素 }
}

所有测试代码:

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
// 创建 
int e[N], ne[N], h, id;
int mp[N]; // mp[i] 表⽰ i 这个数存储的位置 
// 遍历链表 
void print()
{for(int i = ne[h]; i; i = ne[i]){cout << e[i] << " ";}cout << endl << endl;
}
// 头插 
void push_front(int x)
{id++;e[id] = x;mp[x] = id; // 标记 x 存储的位置 // 先让新结点指向头结点的下⼀个位置 // 然后让头结点指向新来的结点 ne[id] = ne[h];ne[h] = id;
}
// 按值查找 
int find(int x)
{// // 解法⼀:遍历链表 // for(int i = ne[h]; i; i = ne[i])// {// if(e[i] == x) return i;// }// return 0;// 解法⼆:⽤ mp 数组优化 return mp[x];
}
// 在任意位置 p 之后,插⼊⼀个新的元素 x 
void insert(int p, int x)
{id++;e[id] = x;mp[x] = id;ne[id] = ne[p];ne[p] = id;
}
// 删除任意位置 p 后⾯的元素 
void erase(int p)
{if(ne[p]) // 当 p 不是最后⼀个元素的时候 {mp[e[ne[p]]] = 0; // 把标记清空 ne[p] = ne[ne[p]];}
}
int main()
{for(int i = 1; i <= 5; i++){push_front(i);print();}//cout << find(1) << endl;//cout << find(5) << endl;//cout << find(6) << endl;// insert(1, 10);// print();// insert(2, 100);// print();erase(2);print();erase(4);print();return 0;
}


http://www.ppmy.cn/devtools/158270.html

相关文章

VideoWorld技术在智能货柜商品识别与数量统计的总结

&#x1f31f; “VideoWorld” 模型仅凭视觉信息即可实现知识学习&#xff0c;不依赖语言模型。 &#x1f916; 模型在围棋和机器人模拟任务中展现出卓越的推理和规划能力。 一、技术实现核心 生成式数据增强 功能&#xff1a;通过VideoWorld生成多样化的合成数据&#xff08;…

【C语言】球球大作战游戏

目录 1. 前期准备 2. 玩家操作 3. 生成地图 4. 敌人移动 5. 吃掉小球 6. 完整代码 1. 前期准备 游戏设定:小球的位置、小球的半径、以及小球的颜色 这里我们可以用一个结构体数组来存放这些要素,以方便初始化小球的信息。 struct Ball {int x;int y;float r;DWORD c…

【CubeMX+STM32】SD卡 U盘文件系统 USB+FATFS

本篇&#xff0c;将使用CubeMXKeil, 创建一个 USBTF卡存储FatFS 的虚拟U盘读写工程。 目录 一、简述 二、CubeMX 配置 SDIO DMA FatFs USB 三、Keil 编辑代码 四、实验效果 串口助手&#xff0c;实现效果&#xff1a; U盘&#xff0c;识别效果&#xff1a; 一、简述 上…

FlinkCDC 实现 MySQL 数据变更实时同步

文章目录 1、基本介绍2、代码实战 2.1、数据源准备2.2、代码实战2.3、数据格式 1、基本介绍 Flink CDC 是 Apache Flink 提供的一个功能强大的组件&#xff0c;用于实时捕获和处理数据库中的数据变更。可以实时地从各种数据库&#xff08;如MySQL、PostgreSQL、Oracle、Mon…

和鲸科技上线 DeepSeek 系列模型服务,助力数智企业 AI 业务创新!

近日&#xff0c;和鲸科技团队宣布旗下数据科学协同平台 ModelWhale 实现对 DeepSeek 全系列大模型的深度支持&#xff0c;旨在帮助更多数智化转型企业提供从算力基建到业务融合的全栈式解决方案&#xff0c;快速搭建自主可控的云端智能服务体系&#xff0c;实现大模型与业务系…

基于Spring Boot的网上宠物店系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

旅游全域体验系统(源码+文档+部署+讲解)

引言 随着旅游业的快速发展&#xff0c;全域旅游平台作为一种数字化创新&#xff0c;为游客提供了一站式的旅游服务体验。该平台整合了旅游信息、预订服务、客户互动等功能&#xff0c;极大地提升了旅游规划和体验的便捷性。 系统概述 全域旅游平台采用前后端分离的架构设计…

日志2025.2.9

日志2025.2.9 1.增加了敌人挥砍类型 2.增加了敌人的死亡状态 在敌人身上添加Ragdoll&#xff0c;死后激活布偶模式 public class EnemyRagdoll : MonoBehaviour { private Rigidbody[] rigidbodies; private Collider[] colliders; private void Awake() { rigidbodi…