![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
基础数据结构
文章平均质量分 53
继续冲呀
只是想涨点知识呀
展开
-
2022.8.9 高级数据结构——图
图相关知识以及代码实现原创 2022-08-09 22:16:13 · 357 阅读 · 1 评论 -
2022.4.24 BF和KMP算法
1. 字符串中的真子串和子串概念字符串:“abcd”真子串:“a”,“b”,“c”,“d”,“ab”,“bc”,“cd”,“abc”,“bcd”子串:" ",“a”,“b”,“c”,“d”,“ab”,“bc”,“cd”,“abc”,“bcd”,“abcd”真子串:n*(n+1)/2 ; 子串:n*(n+1)/2 +12. BF算法BF算法(暴力求解)也叫男朋友算法主串:“ababcabcdabcde”子串:“abcd”要在主串里面找子串,如果当前光标在主串的0号位置所指,那么就是原创 2022-04-24 22:05:59 · 687 阅读 · 0 评论 -
2022.4.19 冒泡排序和堆排序
1. 冒泡排序定义冒泡排序也叫沉石排序,每一趟循环两两比较,大(小)的向后挪动,最终最大(小)值放在最后。假设现在有n个数据,需要跑n-1趟即可冒泡排序图如下:有6个数据,只需要跑5趟就行代码实现#include<stdio.h>void Buddlesort(int* arr, int len){ for (int i = 0; i < len; i++) { for (int j = 0; j + 1 < len - i; j++)//控制两两比较,j指原创 2022-04-19 15:32:08 · 199 阅读 · 0 评论 -
2022.4.13 链式队列
1. 栈和循环队列栈:不管用什么方式去实现,都可以保证入栈和出栈的时间复杂度为O(1)循环队列:顺序表实现的队列,入队时间复杂度为O(1),出队时间复杂度为O(n)队列中的三个难点以及解决方案:① 如何保证顺序表实现的队列的入队和出队时间复杂度为O(1)答:出队的时候,不再挪动数据向前覆盖,而是数据不动,队头指针向后移动(臆想成一个环)② 臆想成环之后,判空和判满条件冲突了?答:1)设计成一个计数器;2)队尾浪费一个空间,不再存储数据,而是作为一个标记③ 循环队列的求长度公式:length原创 2022-04-13 12:16:47 · 856 阅读 · 0 评论 -
2022.4.12 循环队列
1. 队列栈: 受到限制的线性表,先进后出队列:受到限制的线性表,在一端进行入队(插入),在另一端进行出队(删除);入队的一端一般称为队尾,出队的一端称为队头;队列中没有元素的话称为空队。队列特点:先进先出2. 顺序表实现的队列为什么叫做循环队列?遇到循环队列,需要懂得其三个难点第一个难点:怎么让队列也可以实现入队和出队时间复杂度都是O(1)入队不需要挪动元素,时间复杂度为O(1);出队需要挪动数据,时间复杂度为O(n);注意:既然栈的出栈和入栈时间复杂度都为O(1),那么队列的入队和出原创 2022-04-12 11:21:49 · 323 阅读 · 0 评论 -
2022.4.11 链表相关面试题
逆置① 借助头结点② 不借助头结点判断两个单链表是否存在交点,如果存在交点,则找到相交的第一个点① 如果面试官没有让找相交的点,只是问是否相交(可以用一个非常简单的方法)② 如果面试官既要判断是否相交,还要问相交点在那(另外一种解题思路)任意删除一个节点(要求时间复杂度为O(1),给的这个节点的地址不能是尾结点)判断一个单链表是否存在环?如果确实存在环,则找到入环点确定一个单链表是否回文(12321 123321)找到单链表倒数第K个节点...原创 2022-04-10 22:21:41 · 821 阅读 · 0 评论 -
2022.4.9 链栈
链栈链栈:是在单链表的基础上进行操作用单链表的头插和头删代替表尾进行插入和删除链栈结构体设计typedef int ELEM_TYPE;typedef struct LStack{ ELEM_TYPE data; struct LStack* next;}LStack,*PLStack;list-stack.h文件//链栈可执行函数声明//初始化void Init_LStack(struct LStack* ps);//入栈(插入)bool Push(PLStack .原创 2022-04-09 22:28:11 · 301 阅读 · 0 评论 -
2022.3.1 飞机订票系统
飞机订票系统原创 2022-04-09 11:32:34 · 963 阅读 · 0 评论 -
2022.4.5 栈
栈的概念只能在表尾进行插入(入栈)和删除(出栈)的数据结构,也就是表头和中间不能插入和删除(受到限制的线性表);其表尾比较特殊,我们一般把这个表尾叫做栈顶,表头端叫栈底,没有数据节点,则叫空栈。特点:后进先出(先进后出)栈的表现形式因为栈只能在表尾进行插入(入栈)和删除(出栈),因此在写可操作函数时,没有头删头插等结构体设计struct Stack{ 第一个数据成员:ELEM_TYPE *base (指针类型,用来接收malloc从堆里申请的一整块连续的空 间) .原创 2022-04-05 20:35:33 · 664 阅读 · 0 评论 -
2022.4.4 循环链表
1. 循环链表(单循环链表)和单链表相比,尾结点的next域不在指向NULL,而是指向头节点2. 单链表和循环链表的区别(图)单链表:单循环链表:3. 可操作函数注意① 初始化只有一个头结点(没有有效数据节点),所以将自身指向自身,即其next域保存头结点自己的地址;② 删除:头删,尾删,按位置删前两步,有两种方式去实现:第一种:先让p通过标志指向待删除节点,再让q通过p来指向p的前一个节点;第二种:因为我们很明确q的下一个节点是p,所以我们可以一步到位,原创 2022-04-04 21:21:07 · 1208 阅读 · 0 评论 -
2022.3.30 归并排序和快速排序
1. 归并排序归并排序也叫二路归并排序,将所有数据单独给每个数据每个组(每个数据单独看,就是有序的),其实也就是将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。这个概念还是有点难理解,可以根据下面这个图来详细了解:代码:#include<stdio.h>#include<stdlib.h>void Merge(int arr[], int len, int gap){ int low1 = 0; int high1 =原创 2022-03-30 10:18:02 · 202 阅读 · 0 评论 -
2022.3.25 选择排序和基数排序
1. 选择排序每一趟从待排序系列中找出最小值(下标)和待排序序列的第一个值(下标),然后将两个交换,直到待排序序列中只剩下一个值(每一次都找出一个最小值放到前面,len-1趟,与冒泡相反)如图:...原创 2022-03-25 21:17:43 · 446 阅读 · 0 评论 -
2022.3.22 双向链表
1. 双向链表与单链表相比,双向链表有两个指针域,既可以保存右边节点的地址(后继),也可以保存左边的节点地址(前驱)。2. 双向链表图其中:next指针域,保存下一个节点的地址(后继), prior指针域, 保存上一个节点的地址(前驱)3. 双向链表可执行函数注意:头插:① 插入新节点时,一般情况下,需要修改4给我指针域:自身的next和prior;上一个节点的next;下一个节点的prior;如调整规则:③④②①第一次:先修改pnewnode自身的next域和pr.原创 2022-03-22 12:19:35 · 1472 阅读 · 0 评论 -
2022.3.21 八大排序2---希尔排序
1. 希尔排序2. 看如下的图更详细了解希尔排序这个一眼看过去好像没有顺序,但仔细看过后,数据比原来的数据有了顺序,希尔排序就是这种思想,一般我们运用增量是素数的进行分组,比如上述这个就按照 5,3,1,那么就有3. 代码实现#include <stdio.h>#include <stdlib.h>#include <assert.h>void Shell(int arr[], int len, int gap)//一趟希尔排.原创 2022-03-21 22:00:49 · 233 阅读 · 0 评论 -
2022.3.18 八大排序1---直接插入排序
1. 八大排序冒泡排序;选择排序;直接插入排序;希尔排序;堆排序;归并排序;快速排序;基数排序(桶排序)、先写直接插入排序,希尔排序是直接插入排序的优化2. 直接插入排序一开始将数据分成两部分,初始数据都看作无序,每一次从待排序队列中取出一个值,放到我们已经排序好的队列中,然后将其调整有序,然后再从待排序队列中取一个值,直到待排序队列中没有值。特点:1.直接插入排序的时间复杂度过大,但是有其合适的使用场景:n比较小的话,n^2不会很大,这就可以使用直接排序法 2.数据...原创 2022-03-18 21:46:14 · 560 阅读 · 2 评论 -
2022.3.17 不带头结点的单链表
主要掌握带头结点的,不带头结点的偏难!!!1. 不带头结点的单链表如下图2. 结构体设计no_head_list.h文件#pragma once //防止头文件重复typedef int ELEM_TYPE;typedef struct Node{ ELEM_TYPE data;//数据域(1.头结点:不保存任何数据 2.有效数据节点:保存有效值) struct Node* next;//指针域(1.保存第一个元素的地址 2.有效数据节点:保存下一个有效数据节点.原创 2022-03-17 17:27:45 · 1924 阅读 · 0 评论 -
2022.3.15 带头结点的单链表
带头结点的单链表的形式:有效数据结点堆里面申请来的,也就是malloc,头结点,系统开放的,不需要free。2. 头结点没有单独的结构体设计,直接使用的是有效数据结点的结构体设计,这是因为头结点里面数据成员只需要一个成员---指针域,而有效数据结点里面的数据成员不仅有数据域还有指针域,所以直接都用有效数据结点的设计。3. 实现如果单独设计头结点结构体和数据结点结构体,有 #pragma once //防止头文件重复 typedef int ELEM_TYPE...原创 2022-03-15 22:07:53 · 1013 阅读 · 0 评论 -
2022.3.14 哈希2
1. 一致性哈希2. 虚拟节点3. 布隆过滤器例如1:现在需要判断以下250在不在?首先先将250通过ABC这三个哈希函数去计算,可以得到三个值,假设结果是3,9, 19分析:如果250已经存在,则3,9,19的格子里应该都是1,反过来说,如果这三个格子只要有一个不是1,而是0,那么250肯定不在其中存储。所以,得到的结果就是250不存在。例如2:需要判断一下,50在不在?首先先将50通过ABC这三个哈希函数去计算,可以得到三个值,假设结果是6,9,...原创 2022-03-14 20:51:44 · 429 阅读 · 0 评论 -
2022.3.11 哈希1
1. 哈希根据设定好的哈希函数和处理发生哈希冲突的解决方法,将一组数据的关键字用过哈希函数可以映射到一组连续有限的地址集(区间)内,可以将映射到的像记录在表中,这个表就是我们所说的哈希表,这个映射过程一般叫做哈希造表或者叫散列,这个映射关系一般叫做哈希函数或者散列函数。哈希冲突:对不同的关键字可能得到同一哈希地址2.散列散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到定值key的映射f(k原创 2022-03-11 21:45:02 · 568 阅读 · 0 评论 -
2022.2.28 不定长顺序表
3结构体设计为:其中,typedef将基础数据类型int 等可以定义为ELEM_TYPE。这块写错了,是typedef1. .h文件中的代码,其中#pragma once是防止头文件重复#pragma oncetypedef int ELEM_TYPE;#define INIT_SIZE 10//不定长顺序表的结构体设计:typedef struct Dsqlist{ ELEM_TYPE *elem;//指针,用来接收malloc返回值 int lengt...原创 2022-02-28 17:02:08 · 77 阅读 · 0 评论 -
2022.1.14 基础数据结构开始啦,时间空间复杂度和定长顺序表
1. 数据结构一些定义数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。结构:在任何问题中,数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构。数据元素之间关系的不同特性:集合:结构中元素之间除了“同属于一个集合”的关系外,别无其他关系。线性结构:结构中的数据元素之间存在一个对一个的关系。树形结构:结构中的数据元素之间存在一个对多个的关系。图状结构或网状结构:结构中的数据元素之间存在多个对多个的关系。2. 时间空间复杂度原创 2022-01-14 14:05:43 · 152 阅读 · 0 评论