408数据结构备考代码整理和算法思想归纳

一 线性表

(1)顺序表

1 顺序表的定义

typedef struct{int length;//记录当前长度int array[MAX];//表示最大长度为MAX
}

2插入操作:先判断插入的位序合不合法以及存储空间有没有满。而后插入的位序的后面的所有数相后
移动一位,而后插入,length++;
3删除操作:把删除的对应位序之后的所有元素向前移动一位,length--;
4把顺序表逆置的算法:设置双指针i和j,一个指向头部一个指向尾部,每次都把i和j所对应的元素进行对换,而后i++,j--直到i>=j为止
5 删除线性表当中所有值为x的元素的方法:
①扫描线性表以后得到所有“值为x”的元素的位序
②另外开辟一个数组,把“不是①的位序”的元素复制到辅助数组上面去。
6把一个数组中存放的两个线性表(a1,a2,a3…am,b1,b2…bn)进行互换变成(b1,b2…bn,a1,a2,a3…am)的方法:先把整个线性表逆置,而后分别对两个子表进行逆值

(2)链表

1 一些常见的代码

1定义某个单链表节点
typedef struct Node{int value;struct Node*next;//指向下一个节点
}Lnode,*Linklist;2申请一个Node空间:L=(Linklist)malloc(sizeof(Lnode));(注意前面的(Linklist)malloc函数的意思就是申请一个大小为参数所指的大小的内存区域并将地址返回,而且返回地址要强制转换
3为链表内某个节点赋值:L——>value=1;访问结构体内的某个元素也是这样
4删除某个节点并回收空间:free(q)

2头插法(不断在头结点进行后插)构建的单链表顺序是反的;
尾插法(不断在为尾结点进行后插)构建的单链表顺序值正的
3递归算法的步骤演示:设置递归算法不断删除单链表L中所有值为x的节点:

  void delete (Linklist &L,ElemType x)   &是引用的意思,表示可以被修改{Lnode *p;if(L==NULL) return;//递归出口是当前L已经是NULL,任何递归都要有出口else if(L——>data==x){p=L;L=L——>next;free(p);//让L指向下一个节点并删除当前节点delete(L,x);}else delete(L——>next,x);}

4链表的逆置:
(1)再次利用头插法构建单链表
(2)设置3个指针pre,p,q(pre指向p的前一个节点,q指向p的后一个节点),而后依次进行如下操作

             pre=q;  q=r;  r=r——>next; (所有指针往后移动一格)q——>next=pre;//修改链条//这个操作的前提是pre和pre前面的的操作已经调整完毕

5让单链表有序的方法:头插法+直接插入排序的思想
6合并两个有序单链表的方法:设Linklist1指向链表A,Linklist2指向链表B
①对比Linklist1和Linklist2的元素哪一个符合,把它选出来
②选的是Linklist1的话就把Linklist1向前移动一个元素
7判断两个链表的公共节点:
①统计出两个链表的长度差k,把长度较长的那个线性表向前移动k个位置
②两个链表同时移动,如果二个链表的“尾结点”都不同,说明根本就么有公共节点
如果有的话,顺便查一下“第一个相同的节点”,这是公共节点的第一个节点
8 判断单链表有环的方法:快慢指针法+龟兔赛跑判环法

二 树

1 二叉树的二叉链表存储结构

typedef struct Treenode {Elemtype x;struct Treenode*left,right;
}Binode,*Bitree;

2 二叉树的三种遍历
以先序遍历为例子

递归形式:
void Preorder(Bitree T){if(T!=NULL){visit(T);Preorder(T——>left);Preorder(T——>right);}
}
非递归形式:
(1)从根节点开始,一路向着“左”走,不断把节点入栈,直到找到最左的节点 
(2)找到“最左的节点”之后对栈顶元素进行出栈,而后访问“出栈后的栈顶元素”的右子树,对右子树也来一遍这样的操作,如果没有右子树的话就直接跳过
(3)先序遍历:入栈的同时访问元素中序遍历:栈顶元素出栈的时候访问后序遍历:

3层次遍历:借助队列实现

借助C++容器queue
void Levelorder(Bitree root)
{queue <Treenode> Q;Q.push<root>while(Q.length!=0)//只要队列内部还有元素就不能停止{Treenode node=Q.front();//访问第一个队头元素,pop只会出队并不会返回Q.pop();//出队if(node——>left!=NULL) Q.push(node——>left);if(node——>right!=NULL) Q.push(node——>right);//如果左右节点不为空,就让左右节点入队列}
}

4 求二叉树高度的办法:
①递归的方法:具体的递归函数是int high=max(left,right)+1
②非递归的方法:level记录层数,采用层次遍历的算法,并且在根节点入队列的时候要初始化两个值:一个是当前层次的“最右节点”now,一个是“下一层的最右节点”next“,
PS:next=now——>left;或者next=now——>right
并且不断更新,并且每次层序便利出队的时候都和“now比较一下,如果相等的话level++

5 判断一个二叉树是否为完全二叉树:层次遍历+入队列的时候把空节点一块入队列+判断队头元素是否为空节点,不是的话照常,是的话判断空节点后面还有没有非空节点,如果空节点后面还有非空节点的话说明该树不是完全二叉树

6把二叉树左右节点交换的算法:递归算法,具体步骤如下所示:
(1)先对根节点的左子树进行左右节点交换
(2)而后对根节点的右子树进行左右节点交换
(3)最后交换左右子树
代码如下所示:

void swap(Treenode* T)
{if(T!=NULL){swap(T——>left);swap(T——>right);Treenode *link=T——>left;T——>left=T——>right;T——>right=link;}}

7删除以p为根节点的二叉树:使用递归算法,先删除左右子树,而后删除节点p

void delete(Treenode* T)
{if(T!=NULL){delete(T——>left);delete(T——>right);free(T);}}

8 使用非递归后序遍历的时候,当要访问x元素的时候,栈里面所有的元素都是x的祖先
9 层次遍历可以确定某个节点的高度:根节点是0,根节点的子节点是1…高度为x的子节点高度位x+1。具体处理方法是:访问队头元素Q的时候把它的在孩子节点的值存起来(存到自己定义的某个结构体或者哈希表上去,后面要用就自己取出来就行)

三 图

(1)判断是否为树:如果一次DFS可以把所有的点和边都遍历那就是树
(2)广度优先遍历:层次遍历+用一个数组标记该节点是否已经被访问
(3)DFS:递归法和非递归法(借助栈来实现)

(4)迪杰斯特拉算法
  迪杰斯特拉算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。Dijkstra算法可以理解为是一种贪心算法。
  算法流程如下:
             ( 1 ) 算法术语: P n , S n , W n , d i s t [ N ]                          P n : 已标记的点集合                          S n : 未标记的点集合                          W n : 已标记的边集                          d i s t [ i ] : P n 与 W n 组成图中源点 a m 到 a i 最短路的距离 , i ≠ 1              (

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

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

相关文章

在jupyter notebook中修改其他文件的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【C/PTA】结构体进阶练习

本文结合PTA专项练习带领读者掌握结构体&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 目录 7-1 一帮一7-2 考试座位号7-3 新键表输出7-4 可怕的素质7-5 找出同龄者7-6 排队7-7 军训7-8 双链表 7-1 一帮一 “一帮一学习小组”是中…

力扣题:数字与字符串间转换-12.8

力扣题-12.8 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;299. 猜数字游戏 解题思想&#xff1a;进行遍历&#xff0c;统计完全相同的数字和不相同的数字即可&#xff0c;然后统计不相同的数字在秘密数字和猜测数字中共同出现的次数 class Sol…

Kubernetes(K8s 1.27.x) 快速上手+实践,无废话纯享版(视频笔记)

视频源&#xff1a;1.03-k8s是什么&#xff1f;_哔哩哔哩_bilibili 1 基础知识 1.1 K8s 有用么&#xff1f; K8s有没有用 K8s要不要学&#xff1f; 参考资料: https://www.infoq.com/articles/devops-and-cloud-trends-2022/?itm_sourcearticles_about_InfoQ-trends-report…

SSL证书代理

众所周知&#xff0c;SSL证书已经成为当下网络安全中不可或缺的一个环节&#xff0c;对于很多开发公司来说&#xff0c;给自己的客户提供SSL证书安全服务也是最为基础的。 但是目前市面上像阿里云之类的证书服务商对于开发公司需要的证书并没有太大的一个优惠政策&#xff0c;给…

《每天一个Linux命令》 -- (3) touch命令

欢迎阅读《每天一个Linux命令》系列&#xff01;在本篇文章中&#xff0c;将说明touch命令用法。 每天一个Linux命令 – (2) touch命令 在Linux系统中&#xff0c;touch命令是一个非常常用的命令&#xff0c;用于创建空文件或修改文件的时间戳。本文将详细介绍touch命令的使用方…

MySQL老是卸载不干净,不会删除注册表,安装总是报错

给大家推荐一款非常使用的工具 geek点击官网下载。 安装完成主页就长这样&#xff1a; 右键点击你要删除的MySQL卸载即可。自动帮你清空注册表等信息。 谁用谁知道&#xff01;&#xff01;&#xff01; 用了感觉不错的话记得回来给我点赞加评论哦&#xff01;&#xff01;&…

c 语言常用的加密算法——MD5

在C语言中&#xff0c;常用的加密算法包括以下几种&#xff1a; AES加密算法&#xff1a;这是一种对称加密算法&#xff0c;广泛用于数据加密。在C语言中&#xff0c;可以使用openssl库来实现AES加密。RSA加密算法&#xff1a;这是一种非对称加密算法&#xff0c;即加密和解密…

JVM 运行时参数

面试题 JVM的参数&#xff0c;你知道的说一下 (百度) 说说你知道的几种主要的JVM参数&#xff08;京东&#xff09; JVM调优调的哪些参数&#xff1f;在哪里写这些参数&#xff1f; &#xff08;亚信&#xff09; 内存调优参数都有什么&#xff1f;&am…

MTU TCP-MSS(转载)

MTU MTU 最大传输单元&#xff08;Maximum Transmission Unit&#xff0c;MTU&#xff09;用来通知对方所能接受数据服务单元的最大尺寸&#xff0c;说明发送方能够接受的有效载荷大小。 是包或帧的最大长度&#xff0c;一般以字节记。如果MTU过大&#xff0c;在碰到路由器时…

介绍java spring 提供的默认数据库持久化技术 JdbcTemplate基本演示

之前 我们说过spring贴心的内嵌了三种数据源形式 其中默认为HikariCP 其实 spring 也提供了持久化数据库连接技术 这个技术其实大部分都接触过 那就是 JDBC 随着时代的发展 用他的人也越来越少了 那么 我们要演示 JdbcTemplate 导入 mybatis 或 mybatis-plus 的片段 就要注掉了…

【从零开始学习JVM | 第五篇】快速了解运行时数据区

前言&#xff1a; 当谈论 Java 程序的运行机制时&#xff0c;JVM&#xff08;Java 虚拟机&#xff09;的运行时数据区是一个必不可少的话题。JVM 运行时数据区是 Java 程序在运行过程中分配内存和管理数据的重要区域&#xff0c;它包括了方法区、堆、虚拟机栈、程序计数器和本地…

Linux---日志管理

本章主要介绍Linux中的日志管理 了解rsyslog是如何管理日志的查看日志的方法 日志管理简介 工作当中的日志&#xff0c;特指硬件和软件的日志&#xff0c;管理员可以通过它来检查错误发生的原因&#xff0c;或者寻找受到攻击时攻击者留下的痕迹。日志管理包括管理系统日志、应…

智能外呼常见场景有哪些?

智能外呼常见场景是什么&#xff1f; 智能外呼在各种场景下都有应用&#xff0c;以下是一些常见的场景&#xff1a; 营销推广 通过智能外呼向潜在客户进行产品或服务的宣传和推广&#xff0c;收集客户对产品或服务的反馈。根据客户的反馈自动调整宣传策略&#xff0c;从而提…

2023年全国职业院校技能大赛“ 信息安全管理与评估” 测试题3

一、 单选题 &#xff08; 每题 2 2 分&#xff0c;共 共 5 35 题&#xff0c;共 共 0 70 分&#xff09; 1、脏数据是指&#xff08; &#xff09;。 A、 不健康的数据 B、 缺失的数据 C、 多余的数据 D、 被撤销的事务曾写入库中的数据 2、滥发各种广告和虚假信息传播计…

mac本地部署stable-diffusion

下载Homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" ①输入“1”选择中科大版本&#xff0c;然后输入Y(YES)&#xff0c;直接输入开机密码&#xff08;不显示&#xff09;然后回车确认&#xff0c;开始下载 ②…

LeeCode每日刷题12.7

移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出…

小航助学2023年6月GESP_Scratch二级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号 单选题3.00分 删除编辑附件图文 答案:D 第1题高级语言编写的程序需要经过以下&#xff08; &#xff09;操作&#xff0c;可以生成在计算机上运行的可执行代码。 A、编辑B、…

关于popen执行命令无效,但是手动命令行执行有效的问题

问题&#xff1a;今天通过sshpass和scp拷贝其他芯片文件的时候发现代码里面通过popen执行的命令并没有把文件拷贝过来&#xff0c;然后手动执行相同的命令可以拷贝过来。 原因&#xff1a; popen和system可能检测不到用户的环境变量&#xff0c;导致找不到sshpass和scp命令&am…

2008.出租车的最大盈利

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2008. 出租车的最大盈利 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 哈希表动态规划。根据终点区分不同的路线&#xff0c;然后进行动态规划。dp[i] 表示以当前节点为终点时的最大盈利。…