0730 数据结构重点整理

Part 1.梳理数据结构重点

一.宏

        1.简单宏

                a. #define 宏名 宏体

                b. #if 宏(#ifndef)

                c.#endif

        2.多语句宏

                a. define 宏函数名(参数1,参数2......)({C语句1,C语句2......})

                b. define 宏函数名(参数1,参数2......)do(C语句1,C语句2......)while(0)

二.头文件的引用

        1.#include<头文件>

        2.#include"头文件"

        3.二者区别

1:头文件是直接访问系统头文件库继续寻找头文件

2:头文件的寻找是先在本目录下寻找有没有适配的头文件,再去系统头文件库寻找。

三.typedef

        1.意义:将类型重定义(起别名)

        2.用法:typedef int myint(可以用myint来使用int)

                      #define myint int//将int替换为myint

        3.define和typedef的区别

1.define是在预处理阶段处理的文件,typedef得编译才能运行。

2.define只是替换,而typedef是起别名

3.define只能做基本类型的替换,而typedef可以做复杂类型的起别名

四.解构类型

        1.逻辑结构

                a.线性结构(顺序表,链表)

                b.树形结构(二叉树)

                c.图形结构

                d.集合结构

        2.存储结构

                a.顺序存储(顺序表)

                b.链式存储(链表)

                c.索引存储(哈希表)

                d.散列存储

五.顺序表

        1.定义

                a.逻辑

需要定义一个连续的结构体空间,data数组用来存储数据,len记录长度,相当于在普通节点数据域插入一个数组用来存储。

                  b.代码

typedef struct sqlist
{int data[你需要的数据个数];//普通节点数据int len;//长度节点
}*sqlist;sqlist list = (sqlist)malloc(sizeof(struct sqlist));//申请堆区空间

        2.插入

                a.逻辑

判断结构满了没有,没有则可以在list->len位置插入数据(尾插逻辑)

头插需要先将每一位数据后移一位for循环从len到1进行反向后移一位,在0的位置进行插入(头插逻辑)

                b.代码(尾插)

void insert (sqlist list,int element)
{if(list == NULL, list->len == maxsize)//没有链表或者链表满了不能插入return;list->data[list->len] = element;//在最后一位插入list->len++;
}

        3.删除

                a.逻辑

直接len--就行,因为数据不用清除,循环遍历只从0到len-1(尾删逻辑)

删除第一位,并从1开始到len-1位,循环前移(头删逻辑)

                b.代码(尾删)

int delete_rear(sqlist list)
{if(NULL == list || list->len == 0){	printf("顺序表为空\n");return Faluse;}list->len--;return Success;
}

六.链表

        1.单向链表

                a.初始化

需要一个节点包含数据域和指针域,指针用来指向下一个,数据域又分头节点和普通节点,所以需要共用体。

typedef struct Node
{//结构体嵌套共用体union{//普通节点数据域datatype data;//头结点数据域:链表长度int len;};//指针域struct Node *next;
}*linklist;linklist create_node(int flag)
{linklist s = (linklist)malloc(sizeof(struct Node));if(NULL == s){return NULL;}if(flag == 1)//头节点s->len = 0;else if(flag == 0)//普通节点s->data = 0;s->next = NULL;return s;
}

        2.单向循环链表

        3.双向链表

        4.双向循环链表

七.顺序表和链表的区别

1.顺序表是连续存储的空间,而链表是分开的空间

2.顺序表是固定的空间,定义好了就不能改变,链表是可以增加空间的。

八.栈

1.栈是先进后出的顺序,进入abc,出来就是cba;也可以进a出a,进b出b,进c出c;出栈的顺序很多。

2.栈也是需要定义maxsize的,栈满条件就是top == maxsize-1

3.栈的top开始指向的是-1,插入一个数据+1,

4.栈的数据从0开始到 maxsize-1

5.出栈顺序的个数(卡特兰数):1/n+1(2n n)         (n m) = n!/m!(n-m)!

九.队列

1.队列是先进先出的一个线性结构,会定义两个指针front和rear指向0,当插入一个数据时,rear++,当删除一个数据时front++,所以队列只能先进先出,当队列已经插入最大值的数据了,并且将所有数据都删除了,此时front == rear == maxsize,此时就会产生假溢出

2.将队列定义成循环队列,即最后走完不指向NULL,指向头,再人工空出一个节点方便循环,就可以解决假溢出问题

3.循环链表的队满条件:front == (rear+1)%maxsize

4.队列空条件:front == rear

5.插入逻辑:data[rear] = element; rear = (rear+1)%maxsize

6.删除逻辑:front = (front+1)%maxsize

7.计算长度:len = (maxsize+rear-front)%maxsize

十.哈希表

1.哈希算法:得出m(m为原数组长度的4/3),再得出m的最大质数p,然后原数组位置除以p,得到哈希算法后的位置、

2.哈希列表:因为哈希算法后可能有些数会位置相同,所以创建链表就行存储

十一.排序

        1.插入排序

将数组第一个设为有序数列,后面为无序数列,每次循环都将无序数列的的第一个值给他按大小排到有序数列里。

void insert_sort(int *p,int len)
{int j;for(int i = 1; i < len; i++){int temp = p[i];//记录无序数组第一个for(j = i-1;j > 0; j++)//从有序数组最后一个开始循环比较{if(p[j] > temp)//由于是升序,每找到一个比要插入大的数,就将这个数循环后移p[j+1] = p[j]//后移elsebreak;}p[j+1] = temp;//将要插入数插入到空的有序数列中}
}

        2.快速排序

将第一个元素设为基准值,每次循环把大于基准值的放基准值右边,把小于基准值的放左边(升序),即完成了一个数的排序,然后利用递归算法循环调用自己则完成排序。

int once_sort(int *p,int low,int high)
{int key = p[low];while(low < high){while(p[high] >= key && low < high)//右循环找右边比key小的数,没有左移{high--;}p[low] = p[high];while(p[low] >= key && low < high)//左循环找左边比key大的数,没有右移{low++;}p[high] = p[low];}
}void quick_sort(int *p,int low,int high)
{int mid = once_sort(p,low,high);//一轮比较quick_sort(p,low,mid-1);//递归完成左部分排序quick_sort(p,mid+1,high);//递归完成右部分排序
}   

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

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

相关文章

免费版酒店押金原路退回系统之【房费押金计算器】实践——仙盟创梦IDE

代码<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>未来之窗——费用计算器</title><s…

Windows下基于 SenseVoice模型的本地语音转文字工具

Windows下基于 SenseVoice模型的本地语音转文字工具 前言&#xff1a; ​ 现在很流行Vibe Coding但是指挥大模型写代码其实也是一件非常累的事情&#xff0c;经常需要输入大段的文字去描述问题的现象以及具体的解决方案。刚好看到有一些博主通过本地部署语音大模型实现了语音转…

OWSM v4 语音识别学习笔记

目录 OWSM v4 简介 卡内基梅隆大学 这个代码不知道干嘛的 tokenizer CTC分割算法 yodas2数据集 依赖性安装&#xff1a; 数据集下载地址&#xff1b; 模型下载地址&#xff1a; docker安装&#xff08;适用于多数 Linux 系统&#xff09;测试ok 推理demo OWSM v4 简介…

机器学习线性回归:从基础到实践的入门指南

目录 一、线性回归的基本概念 二、线性回归的核心原理 三、线性回归的实现步骤 1.数据准备与预处理 2.模型训练 3.模型评估 &#xff08;四&#xff09;模型优化与应用 四、线性回归的应用场景 五、线性回归的进阶方向 在机器学习的广阔领域中&#xff0c;线性回归是入…

6.Linux 系统启动过程,破解root密码与故障修复

Linux :系统启动过程&#xff0c;破解root密码与故障修复 一、标准启动流程 开机自检 (BIOS/UEFI POST) 硬件初始化与检测 MBR引导 读取硬盘主引导记录&#xff08;512字节&#xff09; GRUB2菜单 加载 /boot/grub2/grub.cfg 显示启动菜单 加载Linux内核 载入Linux 内核文件 内…

特产|基于SSM+vue的南阳特产销售平台(源码+数据库+文档)

南阳特产销售平台 基于SSMvue的南阳特产销售平台 一、前言 二、系统设计 三、系统功能设计 平台功能模块 管理员功能模块 商家功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

线性代数常见的解题方法

一.行列式 1.利用行列式的性质进行简化 (1)重要行列式 主对角线,副对角线(不要忘了-1的次数),拉普拉斯展开(副对角线是m*n),范德蒙 (2)行列式展开定理 每一行/列的元素乘以它对应的代数余子式 扩展:拉普拉斯展开定理,可以按照任意行和列数进行展开,行列式的值=|A|*…

Websocket实时行情接口 (2025最新使用教程)

本教程将指导您如何使用Java Websocket客户端连接实时行情接口&#xff0c;并订阅相关数据。 步骤1&#xff1a;配置您的项目 确保您的项目已引入以下依赖&#xff1a; jakarta.websocket-apijakarta.websocket-client-apifastjson2lombokspring-context (如果使用Spring框架) …

【JEECG】JVxeTable表格拖拽排序功能

功能说明&#xff1a; 实现JVxeTable表格拖拽排序功能 解决子表拖拽排序后&#xff0c;点击保存数据&#xff0c;未实现拖拽排序后效果 参数配置&#xff1a; 提示&#xff1a; 1.开启 dragSort 属性之后即可实现上下拖拽排序。 2.使用 sortKey 属性可以自定义排序保存的 key&…

【腾讯云】EdgeOne网站安全防护的配置方法 防范盗刷流量 附恶意IP和UA黑名单

经过上个月的前车之鉴&#xff0c;我摸索出一套针对腾讯云EdgeOne《付费版》的安全配置模板&#xff0c;仅供各位站长参考 配置方法 一、在EdgeOne控制面板页面&#xff0c;点击要配置的域名。 二、进入后&#xff0c;点击安全防护-WEB防护-自定义规则&#xff0c;按图所示添加…

白玩 一 记录retrofit+okhttp+flow 及 kts的全局配置

先回忆下flow吧&#xff01; flow是啥 Flow 是 Kotlin 协程框架中的一个异步数据流处理组件&#xff0c;专为响应式编程设计&#xff0c;适用于需要连续或异步返回多个值的场景&#xff0c;如网络请求、数据库查询、传感器数据等 1 ‌异步流&#xff08;Asynchronous Stream…

犯罪现场三维还原:科技助力刑侦变革

在刑侦领域&#xff0c;犯罪现场的准确还原对于案件侦破起着至关重要的作用。传统的现场记录方式&#xff0c;如拍照、绘图等&#xff0c;虽然能获取一定信息&#xff0c;但难以全面、直观地呈现现场全貌&#xff0c;容易遗漏关键细节&#xff0c;且在后期分析和信息传达上存在…

go-admin 构建arm镜像

目录 1、 go-admin Dockerfile 2、docker build go-admin 3、settings.yml 4、go-admin-ui Dockerfile 5、docker build go-admin-ui 6、go-admin.yaml 7、go-admin-ui.yaml 1、 go-admin Dockerfile # 构建阶段:使用 Go 1.24 版本(支持远程调试) FROM golang:1.24-…

深入浅出:C++ STL简介与学习指南

目录 前言 STL的版本演变 STL六大组件 STL的重要性 如何学习STL STL的缺陷 总结 前言 什么是STL&#xff1f; STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;是C标准库的核心组成部分&#xff0c;它不仅是一个可复用的组件库&#xff0c;更是一…

Mysql事务原理

脏读(Dirty Read) 某个事务已更新一份数据&#xff0c;另一个事务在此时读取了同一份数据&#xff0c;由于某些原因&#xff0c;前一个进行了RollBack&#xff0c;则后一个事务所读取的数据就会是不正确的。 不可重复读(Non-repeatable read) 在一个事务的两次查询之中数据不一…

小红书笔记详情API指南

一、引言小红书作为中国领先的社交电商平台&#xff0c;拥有超过4.8亿用户(2025年Q2数据)&#xff0c;其开放平台已成为品牌营销与数据挖掘的重要渠道‌1。通过笔记详情API获取数据&#xff0c;可以帮助商家、品牌方和数据分析人员了解用户反馈、市场趋势和消费需求‌。这些数据…

VS+Qt中使用QCustomPlot绘制曲线标签(附源码)

在qt中我们常常会使用数据来绘制曲线&#xff0c;常用的的绘制方法用QCutomPlot、QChart和QPrinter。有时我们会根据需要在曲线进行二次绘制&#xff0c;包括对曲线打标签&#xff0c;显示某个点的值等功能。本文主要为大家介绍在QCustomPlot中使用QCPItemTracer和QCPItemText绘…

Spring Boot项目生产环境部署完整指南

在Spring Boot应用开发完成后&#xff0c;如何将其稳定、高效地部署到生产环境是每个开发者都需要掌握的关键技能。本文将详细介绍Spring Boot项目的多种部署方案&#xff0c;从传统部署到现代化容器部署&#xff0c;选择最适合的部署策略。 1. 部署前的准备工作 1.1 项目打包优…

微信小程序中实现页面跳转的方法

微信小程序中页面跳转主要有两种方式&#xff1a;声明式导航&#xff08;通过组件实现&#xff09;和编程式导航&#xff08;通过API实现&#xff09;。两种方式适用于不同场景&#xff0c;以下详细说明。一、声明式导航&#xff08;navigator组件&#xff09;通过小程序内置的…

从0开始学linux韦东山教程Linux驱动入门实验班(7)

本人从0开始学习linux&#xff0c;使用的是韦东山的教程&#xff0c;在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。本人将前几章的内容大致学完之后&#xff0c;考虑到后续驱动方面得更多的开始实操&#xff0c;后续的内容将以韦东山教程Linux驱动入门实…