7.21 复习数据结构相关知识【主链表】

顺序表 链表 栈 队列之间的关系

  1. 顺序表:array list---->基于数组实现的线性表,元素在内存中是连续存储的。
  2. 链表:linked list ---->通过指针将一系列节点连接起来的线性表
    • 单链表:next指针
    • 双链表:prior+next指针 //430扁平化多级双向链表
  3. 栈:stack---->线性数据结构,先进后出,实现方式:链表/顺序表 pop push top
  4. 队列:queue---->线性数据结构,先进先出,实现方式:顺序表/链表 enqueue dequeue

顺序表 和 链表 都是线性表,前者基于数组实现,后者基于指针实现。
栈 和 队列 是两种特殊的线性表,它们可以基于顺序表或链表实现,但在操作原则上有所不同,栈是LIFO,队列是FIFO。

//单链表
typedef struct LNode{ElemType data;struct LNode* next;
}LNode;
//双链表
typedef struct DLNode{ElemType data;struct DLNode* next;struct DLNode* prior;
}DLNode;
//顺序表
typedef struct Sqlist{ElemType data[maxsize];int length;
}Sqlist;

练习题(手写代码内容)

【说明】由于考试中通常更注重基本概念和传统方法,理解链表的基本操作会帮助掌握这些概念。建议掌握不使用哑节点的方法,以便在考试中灵活应对各种问题。

  1. A和B是两个带头节点的元素递增有序的单链表。设计一个算法将A 和B 合并成非递减有序的单链表C。【21 合并两个有序链表】
void Merge(LNode *& A,LNode *&B,LNode *&C){//排除AorB为空链表的情况,不令C=A orB来获取相同的头节点。C = (LNode*)malloc(sizeof(LNode));C->next = NULL;LNode *p = A->next;LNode *q = B->next;LNode *r;r = C;while(p&&q){if(p->data <= q->data){r->next = p;p = p->next;}else{r->next = q;q = q->next;}r = r->next;}if(p){r->next = p;}else{r->next = q;}//如果二者同时结束,r->next = NULL;就刚好
}
  1. 尾插法建立单链表
typedef int ElemType;
typedef struct LNode{ElemType data;struct LNode* next;
}LNode;
void Createl(LNode *&L,ElemType a[],int n){L = (LNode*)malloc(sizeof(LNode));//增加内存分配失败检查if(L == NULL){printf("Memory allocation failed\n");return;}L->next = NULL;LNode *r = L;//尾指针初始化为头节点for(int i = 0 ; i < n ; i++){LNode *s = (LNode*)malloc(sizeof(LNode));if(s == NULL){printf("Memory allocation failed\n");return;}s->data = a[i];s->next = NULL;r->next = s;//将新节点连接到链表的尾部r = s;//更新尾指针为新节点}
}
  1. 头插法建立单链表
void CreateH(LNode *&L, Elemtype a[],int n){L = (LNode*)malloc(sizeof(LNode));if(L == NULL){printf("Memory allocation failed.\n");return;}L->next = NULL;for(int i = 0; i < n ; i++){LNode* s = (LNode*)malloc(sizeof(LNode));if(s == NULL){printf("Memory allocation failed.\n");return;}s->data = a[i];s->next = L->next;L->next = s;}
}

头插法不需要新建LNode* r;令r = L;r一般做尾指针,在尾插法中才会需要。

  1. 查找带头节点的单链表L中是否存在节点x如果存在则删除x节点。【237 删除链表中的节点】前提:只存在一个这样的节点
int SearchDel(LNode *&L, ElemType x) {LNode *prev = L, *curr = L->next;while (curr) {if (curr->data == x) {prev->next = curr->next;free(curr);return 1;} else {prev = curr;curr = curr->next;}}return 0;
}
  1. 利用尾插法建立双链表
void CreateDL(DLNode *&L, ElemType a[], int n) {L = (DLNode*)malloc(sizeof(DLNode));if (L == NULL) {printf("Memory allocation failed.\n");return;}L->prior = NULL;L->next = NULL;DLNode* r = L; // 尾指针for (int i = 0; i < n; i++) {DLNode* s = (DLNode*)malloc(sizeof(DLNode));if (s == NULL) {printf("Memory allocation failed.\n");return;}s->data = a[i];s->prior = r;s->next = NULL;r->next = s;r = s;}
}
  1. 双链表查找值x
DLNode *Search(DLNode *L, ElemType x){DLNode *s = L->next;while(s){if(s->data == x){return s;}s = s->next;}return NULL;
}
  1. 双链表在节点p后插入s
void InsertAfter(DLNode *p, DLNode *s) {s->next = p->next;      s->prior = p;          if (p->next != NULL) {  // 如果p的next不为空,将p的next的prior指向sp->next->prior = s;}p->next = s;            // 将p的next指向s
}
  1. 双链表删除p的next节点
void DeleteNext(DLNode *p) {DLNode *q = p->next;   if (q != NULL) {       // 如果q不为空,继续删除操作p->next = q->next; if (q->next != NULL) { // 如果q的next不为空,将q的next的prior指向pq->next->prior = p;}free(q); // 释放q节点}
}

7 8 两个注释部分容易遗忘

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

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

相关文章

JS中的File(五):node.js中的file模块使用

详情阅读官方文档&#xff1a; File system | Node.js v22.5.1 Documentation Node.js fs.write() Method - GeeksforGeeks 这里暂时仅提供一些简单的梳理和阅读小tips&#xff08;偷懒一下 0.基本认知 对文件系统的操作可以主要分为几个主要部分&#xff1a;打开文件、新建文…

一文搞懂 Java 基础:新手入门必备

目录 &#x1f4dd; Java基础Java起源第一个Java程序基础语法Java标识符Java变量Java注释Java数据类型Java运算符Java流程控制语句 &#x1f4dd; Java基础 Java起源 Java programming language具有大部分编程语言所共有的一些特征&#xff0c;被特意设计用于互联网的分布式环…

《算法笔记》总结No.10——链表

从第10期破例插叙一期单链表的实现&#xff0c;这个东东相当重要&#xff01;考研的同学也可以看&#xff1a;相较于王道考研的伪码不太相同&#xff0c;专注于可以运行。如果是笔试中的伪码&#xff0c;意思正确即可~ 注&#xff1a;博主之前写过一个版本的顺序表和单链表的C实…

Jolt路线图

1. 引言 a16z crypto团队2024年7月更新了其Jolt路线图&#xff1a; 主要分为3大维度&#xff1a; 1&#xff09;链上验证维度&#xff1a; 1.1&#xff09;Zeromorph&#xff1a;见Aztec Labs团队2023年论文 Zeromorph: Zero-Knowledge Multilinear-Evaluation Proofs from…

视觉巡线小车——STM32+OpenMV

系列文章目录 第一章&#xff1a;视觉巡线小车——STM32OpenMV&#xff08;一&#xff09; 第二章&#xff1a;视觉巡线小车——STM32OpenMV&#xff08;二&#xff09; 第三章&#xff1a;视觉巡线小车——STM32OpenMV&#xff08;三&#xff09; 第四章&#xff1a;视觉巡…

【过题记录】 7.21

Mad MAD Sum 算法&#xff1a;思维&#xff0c;前缀最大值 模拟一下他的运行过程就会发现&#xff0c;两次之后整个数组就固定了&#xff0c;之后每次都是每个数往后移动一位&#xff0c;可以模拟两次之后计算每个数的存活轮数&#xff0c;计算贡献。 #include<bits/stdc.h…

JavaSE 知识梳理(下)

1.继承 继承是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特 性 的基础上进行扩展&#xff0c;增加新功能&#xff0c;这样产生新的类&#xff0c;称派生类。 继承主要解决的问题是&#xff1a;共性的抽取&#xff0c;实现代码复用&a…

【D3.js in Action 3 精译_018】2.4 向选择集添加元素

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可视化最佳实践&#xff08;下&#xff09;1.4 本章小结 第二章…

【PyTorch】图像二分类项目-部署

【PyTorch】图像二分类项目 【PyTorch】图像二分类项目-部署 在独立于训练脚本的新脚本中部署用于推理的模型&#xff0c;需要构造一个模型类的对象&#xff0c;并将权重加载到模型中。操作流程为&#xff1a;定义模型--加载权重--在验证和测试数据集上部署模型。 import torch…

基于PSO算法优化PID参数的一些问题

目录 前言 Q1&#xff1a;惯性权重ω如何设置比较好&#xff1f;学习因子C1和C2如何设置&#xff1f; Q2&#xff1a;迭代速度边界设定一定能够遍历&#xff08;/覆盖&#xff09;整个PID参数二维空间范围吗&#xff1f;还是说需要与迭代次数相关&#xff1f;迭代次数越高&a…

MATLAB图像处理分析基础(一)

一、引言 MATLAB软件得到许多数字图像处理学生、老师和科研工作者的喜爱&#xff0c;成为数字图像处理领域不可或缺的工具之一&#xff0c;其与其他软件相比有以下诸多显著优点。首先&#xff0c;MATLAB 拥有强大的内置函数库&#xff0c;涵盖了图像读取、显示、处理及分析的全…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(九)-无人机区域地面探测与避让(DAA)

引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及A2X&#xff08;Aircraft-to-Everything&#xff09;服务的支持。 3GPP TS 23.256 技术规范&#xff1a; 【免费】3GPPTS23.256技术报告-无人机系…

星火模型大体验简单实现一个LLM Chat平台

星火文档 利用axios封装 星火模型 API 请求 为了管理好的key,需要把对应的环境放置env.json文件中。 源码 const axios = require(axios); const ENV = require(../env.json); /*** * @param {*} messages 数组* @returns */ function request(messages) {return new Pro…

Unity UI 开发:代码与示例全解析

在 Unity 游戏开发中&#xff0c;用户界面&#xff08;UI&#xff09;的设计和实现是至关重要的一部分。一个直观、美观且功能完善的 UI 能够极大地提升玩家的游戏体验。本文将为您介绍一些 Unity UI 相关的代码和示例&#xff0c;帮助您更好地掌握 UI 开发。 一、创建基本 UI…

《昇思 25 天学习打卡营第 14 天 | 基于MindSpore的红酒分类实验 》

《昇思 25 天学习打卡营第 14 天 | 基于MindSpore的红酒分类实验 》 活动地址&#xff1a;https://xihe.mindspore.cn/events/mindspore-training-camp 签名&#xff1a;Sam9029 使用MindSpore实现K近邻&#xff08;KNN&#xff09;红酒聚类 实验目的和KNN算法概述 本次实验的…

gfsk调制相对于FSK调制优点

GFSK调制相对于FSK调制主要有以下优点&#xff1a; 抗噪声性能&#xff1a;GFSK调制采用高斯滤波器&#xff0c;这使得其抗噪声性能较好。在同样的信噪比下&#xff0c;GFSK调制能够实现更高的误码率性能。 频带利用率&#xff1a;GFSK调制的频带利用率相对较高。由于其带外衰…

ESP8266模块(2)

实例1 查看附近的WiFi 步骤1&#xff1a;进入AT指令模式 使用USB转串口适配器将ESP8266模块连接到电脑。打开串口终端软件&#xff0c;并设置正确的串口和波特率&#xff08;通常为115200&#xff09;。输入以下命令并按回车确认&#xff1a; AT如果模块响应OK&#xff0c;…

微信小程序:自定义 tabBar 效果

自定义 tabBar 效果 自定义 tabBar 在 app.json 中的 tabBar 里设置 custom 为 true 就可以关闭原生 tabBar。 开启自定义 tabBar 原生的 tabBar 内容不删除&#xff0c;兼容低版本。 {// 注册vant组件"usingComponents": {"van-tabbar": "vant/weapp…

【计算机网络】0 课程主要内容(自顶向下方法,中科大郑烇、杨坚)(待)

1 教学目标 掌握计算机网络 基本概念 工作原理 常用技术 为将来学习、应用和研究计算机网络打下坚实基础 2 课程主要内容 1 计算机网络和互联网2 应用层3 传输层4 网络层&#xff1a;数据平面5 网络层&#xff1a;控制平面6 数据链路层和局域网7 网络安全8 无线和移动网络9 多…

构建gitlab远端服务器(check->build->test->deploy)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言构建gitlab远端服务器一、步骤一:搭建gitlab的运行服务器【运维】1. 第一步:硬件服务器准备工作(1)选择合适的硬件和操作系统linux(2)安装必…