当前位置: 首页 > news >正文

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.dtcms.com/a/306785.html

相关文章:

  • laravel计划任务和异步队列任务,拆分成不同队列,减少计划任务系统压力
  • Redis知识点(1)
  • vulhub-ica1靶场攻略
  • 基于C语言实现的KV存储引擎(一)
  • 串行化:MYSQL事务隔离级别中的终极防护
  • VMware16安装Ubuntu-22.04.X版本(并使用桥接模式实现局域网下使用ssh远程操作Ubuntu系统)
  • JVM对象创建与内存分配机制深度剖析
  • 打靶日记-RCE-labs
  • 把Java程序部署到本地Docker
  • Python奇幻之旅:从零开始的编程冒险
  • 编程算法:从理论基石到产业变革的核心驱动力
  • 如何保障项目上线质量?核心策略分析
  • “古法编程”到“vibe coding”的第一步:Zread助力一键生成项目说明书
  • 潇洒郎: Vim使用技巧总结
  • 鸿蒙(HarmonyOS)模拟(Mock)数据技术
  • 【2025/07/30】GitHub 今日热门项目
  • 【git】GitHub 的专用代理地址
  • 磁盘IO优先级控制对美国服务器存储子系统的调优验证
  • 2023 年 NOI 最后一题题解
  • 机器学习项目从零到一:加州房价预测模型(PART 1)
  • electron开发桌面应用入门
  • 一句话指令实现“2D转3D”、“图片提取线稿”
  • 北京-4年功能测试2年空窗-报培训班学测开-第六十四天-准备面试项目(焦虑)-同学开始面试
  • 如何设计一个限流器?
  • 【35】C# WinForm入门到精通 —— label 控件 不能 鼠标调整大小,解决办法
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——8. AI赋能(下):在Qt中部署YOLOv8模型
  • WD8001 专为小功率风扇供电及控制而生,低成本,为小风扇生产厂商寻求创新解决方案
  • day065-ALB负载均衡与云盘扩容
  • conda 安装prokka教程
  • PyCharm功能及安装使用教程