数据结构——链表

因为教材是用的C++,所以今天的代码是用C++实现的

//单链表的定义
typedef struct LNode
{ElemType data;struct LNode *next;
}LNode,*LinkList;//初始化
Status InitList(LinkList &L)
{L=new LNode;L->next=NULL;return OK;
}//取值
Status GetElem(LinkList L ,int i,ElemType &e){p=L->next;;j=1;while(p&&j<i){p=p->next;++j;}if(!p||j>i)return ERRPR;e=p->data;return OK;}//查找
LNode *LocateElem(LinkList L,ElemType e){p=L->next;while(p && p->data!=e)p=p->next;return p;
}//插入
Status ListInsert(LinkList &L,int i,ElemType e){p=L;j=0;while(p && (j<i-1)){p=p->next;++j;}if(!p||j>i-1) return ERROR;s=new LNode;s->data=e;s->next=p->next;p->next=s;return OK;
}//删除
Status ListDelete(LinkList &L,int i){p=L;j=0;while((p->next) && (j<i-1)){j++;p=p->next;}if(!(p->next)||j>i-1) return ERROR;q=p->next;p->next=q->next;delete q;return OK;
}//前插法创建单链表
void CreateList_H(LinkList &L,int n){L=new LNode;L->next=NULL;for(i=0;i<n;++i){p=new LNode;cin>>p->data;p->next=L->next;L->next=p;}
}//后插法创建单链表
void CreateList_R(LinkList &L,int n){L=new Lnode;L->next=NULL;r=L;for(i=0;i<n;i++){p=new LNode;cin>>p->data;p->next=NULL;r->next=p;r=p;}
}//循环链表的定义及初始化
typedef struct LNode
{ElemType data;struct LNode *next;
}LNode,*LinkList;Status InitList(LinkList &L)
{L=new LNode;L->next=L;    //只有这里跟单链表不同,其余地方都一样return OK;
}//双向链表的定义及初始化
typedef struct DuLNode{ElemType data;struct DuLNode *prior;struct DuLNode *next;
}DuLNode,*DuLinkList;Status InitList(DuLinkList &L){L=new DuLNode;L->next=L;L->prior=L;return OK;
}//双向链表的插入
Status ListInsert_DuL(DuLinkList &L,int i,ElemType e){if(!(p=GetElem_Dul(L,i)))return ERROR;s=new DuLinkList;s->data=e;a=p->prior;p->prior=s;s->prior=a;a->next=s;s->next=p;return OK;
}//双向链表的删除
Status ListDelete_DuL(DuLinkList &L,int i){if(!(p=GetElem_Dul(L,i)))return ERROR;p->next->prior=p->prior;p->prior->next=p->next;delete p;return OK;
}

链表的工作原理

在一个链表中,每个节点都有一个 next 指针,指向下一个节点。例如,假设有两个节点:

LNode *node1 = new LNode;
LNode *node2 = new LNode;node1->next = node2; // node1 的 next 指向 node2

在这个例子中,node1next 指向 node2,表示链表中的第一个节点指向第二个节点。通过这种方式,节点可以连接起来,形成一个链表。

动态创建新的节点

这行代码 LNode *node1 = new LNode; 的意思是动态创建一个新的 LNode 类型的节点,并将其地址赋值给指针 node1

new LNode

  • new 是一个运算符,用于在堆上动态分配内存。
  • LNode 表示你要创建一个新的 LNode 结构体实例。这段代码会在堆上分配足够的内存来存储一个 LNode 的数据,并返回这个新创建对象的地址

初始化

  • 函数定义:​​​​​​

    • ​​​​Status InitList(LinkList &L): 这是函数的声明,函数名为 InitList,返回类型为 Status(表示操作的状态,如成功或失败),接受一个引用类型的参数 LinkList &L。这里的 LinkList 是指向 LNode 的指针类型。

  • 创建新的节点

    • L=new LNode;: 这一行代码使用 new 关键字在堆上动态分配一个新的 LNode 结构的内存,并将这个新节点的地址赋值给 L。这意味着 L 现在指向一个新的链表节点。

  • 初始化 next 指针

    • L->next=NULL;: 将新节点的 next 指针设置为 NULL,表示当前链表中只有一个节点(头节点),而且没有后继节点。链表的末尾通常用 NULL 来表示。

  • 返回状态

    • return OK;: 函数结束时返回一个状态值 OK,表示链表成功初始化。

引用类型

  1. LinkList:这是一个指向 LNode 类型的指针(即 LNode* 的别名)。
  2. &L:表示 LLinkList 类型的引用。这意味着 L 引用的是一个指向 LNode 的指针。

在 C++ 中,引用是一种特殊的变量,它允许你直接访问另一个变量的内存,而不是创建该变量的副本。当你使用引用作为参数时,函数可以直接操作传入的变量,而不需要返回值来修改它。(可以对比上个笔记C语言的访问创建副本)

举个例子

假设你有一个函数:

void modify(int &x) {x = 10; // 修改了引用变量 x
}

void modify(int &x) 中,x 是一个 int 类型的引用。这意味着:

  1. 引用的性质x 并不是一个新的变量,而是直接引用了传入的整型变量。换句话说,x 是传入整型变量的别名。

  2. 改变引用的值:当你在 modify 函数中对 x 进行修改时,实际上是在修改传入的那个整型变量。因此,任何对 x 的改变都会直接影响到原始的变量。

如果你调用这个函数:

int a = 5;
modify(a); // a 现在变为 10
C++的引用相较于C语言指针的一些优势:
1. 语法简洁

引用的语法更简洁,因为你不需要使用解引用操作符(*)来访问引用的变量。

2. 避免空指针

引用必须在定义时初始化,并且不能为 NULL(或 nullptr)。这意味着引用始终指向一个有效的对象,而指针可能指向 NULL,从而引发潜在的空指针异常。

3. 更自然的语义

引用更像是对变量的别名,能够更清晰地表达意图。在许多情况下,使用引用的代码更易读,更容易理解。

4. 简化参数传递

在函数参数中使用引用,可以直接修改传入的变量,而不需要返回值。

取值

关于 L 的含义

在代码中:

  • L 是整个链表的“入口”,也就是头指针。
  • 头指针 L 通常指向一个特殊的 头节点(dummy node)。头节点本身不存储实际的数据,只是为了方便操作整个链表,比如插入、删除和遍历等。
  • L->next 指向链表的第一个有效节点(首元节点)。
  • 如果链表为空,L->next == NULL

e = p->data 的意义

假设 p 当前指向第 i 个节点:

  • p->data 表示这个节点中存储的 数据部分
  • 赋值语句 e = p->data 将该节点的数据部分赋值给变量 e

为什么 p->data 可以访问数据?

这是因为 p 是一个指向节点的指针,p->data 表示指针所指向节点的 data 成员。

查找 

LNode *LocateElem

LNode *LocateElem(LinkList L, ElemType e)

LNode * 表示LocateElem函数返回的是一个指向链表节点的指针。

前插法创建单链表

cin>>p->data;

>> 是 C++ 中的输入运算符。它是从标准输入(通常是键盘)中读取数据的方式之一。

  • 在 C++ 中,>>流提取运算符(stream extraction operator)。
  • 它用于从输入流中提取数据,并将数据存储到指定的变量中。
  • cin 是 C++ 的标准输入流对象,通常用于从键盘获取输入。

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

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

相关文章

前端面试笔试(三)

目录 一、数据结构算法等综合篇 二、代码输出篇 1.yield与生成器函数 2.this指向有关 3.instanceof 与Array.isArray 4.继承class cls extends Array&#xff0c;调用里面的sum方法 三、css、html、JavaScript篇 1.哪项不能提高dom元素操作效率&#xff1f; 2.contente…

7.高可用集群架构Keepalived双主热备原理

一. 高可用集群架构Keepalived双主热备原理 (1)主机+备机keepalived配置(192.168.1.171) ! Configuration File for keepalivedglobal_defs {# 路由id:当前安装keepalived节点主机的标识符,全局唯一router_id keep_101 } #计算机节点(主机配置) vrrp_instance VI_1 {</

IntelliJ IDEA 2023.2x——图文配置

IntelliJ IDEA 2023.2——配置说明 界面如下图所示 : 绿泡泡查找 “码猿趣事” 查找【idea99】 IntelliJ IDEA 的官方下载地址 IntelliJ IDEA 官网下载地址 一路上NEXT 到结尾&#xff1a; 继续NEXT 下一步:

Linux网络:守护进程

Linux网络&#xff1a;守护进程 会话进程组会话终端 守护进程setsiddaemon 在创建一个网络服务后&#xff0c;往往这个服务进程是一直运行的。但是对于大部分进程来说&#xff0c;如果退出终端&#xff0c;这个终端上创建的所有进程都会退出&#xff0c;这就导致进程的生命周期…

Linux Android 正点原子RK3568替换开机Logo完整教程

0.这CSDN是有BUG吗?大家注意:表示路径的2个点号全都变成3个点号啦! 接下来的后文中,应该是2个点都被CSDN变成了3个点: 1.将这两个 bmp 图片文件720x1280_8bit拷贝到内核源码目录下,替换内核源码中默认的 logo 图片。注意:此时还缺少电量显示图片 2.编译内核 make d…

安卓开发作业

整体效果: 安卓小作业 [TOC](页面配置) 整体框架有4个fragment页面,聊天,朋友,发现,设置. 配置如下: bash <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android" xm…

2024-ISCTF WP

Web 25时晓山瑞希生日会 经典 HTTP 头伪造&#xff0c;伪造流程如下&#xff1a; User-Agent: Project Sekai //伪造UA头 X-Forwarded-For:127.0.0.1 //伪造本地用户 伪造日期是本题最大的坑点&#xff0c;一直在想怎么伪造 25 时&#xff0c;没想到是二刺螈 搜索得知 …

VSCode+ESP-IDF开发ESP32-S3-DevKitC-1(1)开发环境搭建

VSCodeESP-IDF开发ESP32-S3-DevKitC-1&#xff08;1&#xff09;开发环境搭建 1.开发环境搭建&#xff08;安装ESP-IDF&#xff09;2.开发环境搭建&#xff08;安装VS Code&#xff09;3.开发环境搭建&#xff08;VSCode中安装ESP-IDF插件及配置&#xff09; 1.开发环境搭建&am…

二维数组操作

代码结构 main.c #include <stdio.h> #include <stdlib.h>#define LEN 100int main() {//通过指针引用多维数组# if 1//定义多维数组int a[3][5] {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};int row sizeof(a) /sizeof(a[0]);int colum sizeof(a[0]) / sizeof(a[0…

使用Service Worker实现离线优先的Web应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Service Worker实现离线优先的Web应用 使用Service Worker实现离线优先的Web应用 使用Service Worker实现离线优先的Web应用…

算法编程题-区间最小数乘区间和的最大值,基于数组中的数字拼接可得的小于目标值的最大数

算法编程题-区间最小数乘区间和的最大值&#xff0c;基于数组中的数字拼接可得的小于目标值的最大数 区间最小数乘区间和的最大值原题描述思路简述代码实现复杂度分析 基于数组中的数字拼接可得的小于目标值的最大数原题描述思路简述代码实现复杂度分析 参考 这里分享两道字节面…

华为Ensp模拟器配置RIP路由协议

目录 RIP路由详解&#xff1a;另一种视角解读 1. RIP简介&#xff1a;轻松理解基础概念 2. RIP的核心机制&#xff1a;距离向量的魅力 3. RIP的实用与局限 RIP配置实验 实验图 ​编辑 PC的ip配置 RIP配置步骤 测试 结语&#xff1a;RIP的今天与明天 RIP路由详解&…

数字化那点事:一文读懂物联网

一、物联网是什么&#xff1f; 物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;是指通过网络将各种物理设备连接起来&#xff0c;使它们可以互相通信并进行数据交换的技术系统。通过在物理对象中嵌入传感器、处理器、通信模块等硬件&#xff0c;IoT将“…

GoFly框架使用vue flow流程图组件说明

Vue Flow组件库是个高度可定制化的流程图组件&#xff0c;可用于工作流设计、流程图及图表编辑器、系统架构展示。可以根据自己的需求&#xff0c;设计独特的节点和边&#xff0c;实现个性化的流程图展示。这不仅增强了应用的视觉效果&#xff0c;也使得用户交互更为直观和流畅…

VS2022-创建智能酒店门锁DLL动态链接库——develop hotel smart locker dynamic

一、自主生产酒店智能门锁 1. 定制化能力&#xff1a;自主生产的品牌能够根据酒店的特定需求进行定制&#xff0c;例如特殊的外观设计、功能模块的选择等&#xff0c;更好地满足酒店的个性化要求。 2. 成本控制&#xff1a;自主生产可以更有效地控制成本&#xff0c;从原材料…

免费开源的Koodo Reader:轻松管理电子书并实现远程访问

文章目录 前言1. Koodo Reader 功能特点1.1 开源免费1.2 支持众多格式1.3 多平台兼容1.4 多端数据备份同步1.5 多功能阅读体验1.6 界面简洁直观 2. Koodo Reader安装流程2.1 安装Git2.2 安装Node.js2.3 下载koodo reader 3. 安装Cpolar内网穿透3.1 配置公网地址3.2 配置固定公网…

进程池的子进程的清理工作问题

首先进程池看看代码怎么写的 https://gitee.com/ljh0617/linux_test/blob/master/11-17/3.pipe_use/ProcessPool.cc 我们对子进程分配到的管道读文件描述符进行了重定向&#xff0c;让他改为从0读&#xff0c;这和清理工作无关&#xff0c;只是这么设计让子进程不再有键盘输入…

Java 多线程详细介绍

Java 多线程详细介绍 线程是多线程的支柱。我们生活在一个现实世界中&#xff0c;这个世界本身就被大量应用程序包围着。随着技术的进步&#xff0c;除非我们有效地引入多任务处理的概念&#xff0c;否则我们无法达到同时运行它们所需的速度。这是通过线程的概念实现的。 Java…

二叉树+树的OJ题讲解

求第K层节点个数 思路:走到K1就不走了,一次传回得到的值 #include<stdio.h> #include<stdlib.h> //树的定义 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right; }BTNode;//手…

Android kotlin之配置kapt编译器插件

配置项目目录下的gradle/libs.versions.toml文件&#xff0c;添加kapt配置项&#xff1a; 在模块目录下build.gradle.kt中增加 plugins {alias(libs.plugins.android.application)alias(libs.plugins.jetbrains.kotlin.android)// 增加该行alias(libs.plugins.jetbrains.kotl…