
数据结构与算法
爱吃萝卜的猪
这个作者很懒,什么都没留下…
展开
-
二叉树层次遍历详解
二叉树层次遍历原创 2022-06-30 22:07:48 · 990 阅读 · 1 评论 -
删除不带头结点的单链表L中所有值为x的结点(递归实现)
为什么这段代码在执行 ls = ls->next 会误以为有断链的感觉原创 2022-06-10 00:59:09 · 1099 阅读 · 1 评论 -
合并两个单链表
1.以下是基于带头结点的单链表的合并(并且两个链表都是有序的链表)p1 ,p2两个指针分别指向两个链表的第一个元素申请head结点作为新链表的头结点,申请pre指针指向头结点 第一次: 对p1,p2指针指向位置的元素进行比对,将较小的元素挂在head结点之后,调整更小的元素的对应结点的指针,调整pre指针,以便之后将元素依次挂在后面。之后重复此操作第二次:重复第一次的操作...原创 2022-02-16 19:29:44 · 13188 阅读 · 1 评论 -
单链表的所有操作
1.结构体定义typedef struct LNode{ int data; LNode* next;}*LinkList,LNode;LinkList 强调它是一个单链表,LNode强调是一个结点 。以下是带头结点的单链表的所有操作2.基本操作2.1 初始化//带头结点的初始化bool InitList(LinkList& L) { L = (LNode*)malloc(sizeof(LNode)); if (L == NULL) { ...原创 2022-02-16 01:11:29 · 352 阅读 · 0 评论 -
二叉树的非递遍历
一.前序非递归遍历1.前序非递归遍历原理二叉树的非递归遍历需要借助栈来实现,将根节点压栈,再出栈顶元素,再将这个元素的左右孩子压栈(次序,右孩子先进入,左孩子后进入),重复上述操作,直至遍历结束。2.图解3.代码实现定义栈结构,操作://链栈结构typedef struct SNode { struct TNode * node; struct SNode* next;}*Link...原创 2022-02-12 16:01:35 · 987 阅读 · 0 评论 -
详解二叉排序树非递归与递归建立和插入
1.非递归建立先看一下一个结点是如何插入如图:p指针用来查找要插入的位置,q指针记录插入位置的父节点,之后用于连接孩子结点第一次比较后调整p,q第二次比较第三次第四次,插入对应的关键字对应排序树的结构体:typedef int ElemType;typedef struct BSTNode { ElemType key; struct BSTNode *lchild, *rchild;}*BSTree,BSTNode;非...原创 2022-02-09 19:03:52 · 4064 阅读 · 1 评论 -
详解线索二叉树
1.了解线索二叉树之前要知道为什么需要线索二叉树typedef struct BiTNode{ // Node structure ElemType data; // node data struct BiTNode *lchild; // left child struct BiTNode *rchild; // right child}BiTNode, *BiTree;//线索二叉树的定义普通的链式存储的二叉树只有数据域,左,右孩子原创 2022-02-09 01:08:56 · 1586 阅读 · 0 评论 -
利用栈实现括号匹配问题
1.原理步骤从头开始扫描字符串,如果是左括号,入栈 如果是右括号,检查栈是否为空,如果为空,说明没有左括号与当前的右括号相匹配。如果栈不为空且栈顶元素与当前符号相匹配,继续检查下一元素 重复以上过程,直至扫描完最后一个元素 检查栈是否为空,如果不为空,说明栈中还存有左括号没有与之对应的右括号相匹配。如果为空,说明匹配成功2.代码实现#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#define MaxSize 50typed原创 2022-02-07 00:20:28 · 4687 阅读 · 2 评论 -
详解kmp算法
1.朴素模式匹配1.1基本思想:从主串test 和子串pattern 的第一个字符开始,将两字符串的字符一一比对,如果出现某个字符不匹配,主串回溯到第二个字符,子串回溯到第一个字符再进行一一比对。如果出现某个字符不匹配,主串回溯到第三个字符,子串回溯到第一个字符再进行一一比对…循环一直到子串字符全部匹配成功。1.2例如:第一次:不匹配第二次:主串从第2个字符,模式串从头开始,直到b与c不匹配第三次:主串从第3个位置开始,模式串从头开始,a与c...原创 2022-02-05 13:31:53 · 6690 阅读 · 0 评论 -
详解折半查找
1.顺序查找顺序查找是从线性表的一端,依次对比 每个元素,直到找到要查找的元素,或者没有找到。代码实现:int SqSearch(int arr[],int length,int x) { for (int i = 0; i < length; i++) { if (arr[i] == x) { return i; //找到返回元素的下标 } } return -1; //没找到返回一个-1}2.折半查找折半查找又称二分查找,它仅适用于有序的顺序表。原创 2022-02-01 20:57:02 · 3139 阅读 · 0 评论 -
对称矩阵的压缩
1.定义若一个方阵A [1...n] [1...n]中的一个任意元素都有a [ i,j ] =a [ j,i ] (1<=i,j<=n),则称其为对称矩阵。对于一个n阶方阵,可以划分为三个区域,即上三角区,主对角线,下三角区。2.压缩原因因为对称矩阵上三角区和下三角区对应的元素相同,如果都存储会造成空间的极大浪费,因此只需要把下三角区(或上三角区)和对角线上的元素进行存储即可。3.实现原理对于方阵A [1...n] [1...n]下三角区和主对角线每行元素为(且i>.原创 2022-01-31 22:25:25 · 1889 阅读 · 0 评论 -
详解堆排序
1.堆排序定义堆排序是一种树形选择排序方法,特点是在排序的时候,可以将拥有n个关键字的数组或其他结构看做一个完全二叉树。如图:堆的定义:n个关键字序列L(1...n)称为堆,当满足:L(i) <= L(2i) 且 L(i) <= L(2i+1) ( 1 <= i <= [n/2] ) 也就是说小于左右孩子 ,称之为小顶堆 L(i) >= L(2i) 且 L(i) >= L(2i+1) ( 1 <= i <= [n/2] ) 也就是...原创 2022-01-25 00:59:38 · 4833 阅读 · 5 评论 -
详解归并排序
1.归并排序归并排序使用了分治和递归的思想,将具有n的元素的无序序列划分为n个每个含有一个元素的序列,再将n个有序序列采用二路归并等合并方法进行合并排序成一个有序的序列。2.归并实现步骤2.1.划分划分左半部分后,合并排序左半部分 2.1.1递归划分左半部分如图:从中间划分,之后再从左半部分划分,递归划分左边部分...... 直至划分为一个子序列2.1.2合并左半部分的子序列,后面同理2.1.划分右半部分后,合并排序右...原创 2022-01-27 16:54:45 · 958 阅读 · 0 评论 -
链式队列的定义与实现
1.链式队列链式队列是一种同时带有队头指针和队尾指针的单链表,头指针指向队头结点,尾指针指向队尾结点。如图:2.队列的存储结构类型可以描述为:typedef struct Node{ int data; struct Node* next;}LinkNode;typedef struct Queue{ LinkNode* rear; //头指针 LinkNode* front; //尾指针 int count; //用于记录队列的元素个数}LinkQueue;原创 2022-01-27 00:09:02 · 4313 阅读 · 1 评论 -
顺序栈与链栈
1.栈栈是一种只允许在一端插入和删除操作,元素先进后出的受限线性表2.常用操作initStack :初始化一个空栈 Pop:若栈未空,元素出栈 Push:若栈未满,元素进栈 getTopEle:获取栈顶元素 isEmpty: 判断此时栈是否为空3.栈的实现 3.1栈的顺序存储结构#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>//定义最大容量为4#define MaxSize 4typedef st...原创 2022-01-26 00:37:28 · 972 阅读 · 0 评论 -
详解基数排序
1.基数排序基数排序是一种特殊的排序方式,不是基于比较进行排序,而是基于关键字的各个位置大小进行"分配"和"收集"两种操作对关键字序列进行排序的一种排序方式。基数排序可以分为:最高位优先(MSD)和最低位优先(LSD)2.基数排序原理1.观察排序字段最大的数字,它有几位决定了需要分配和收集的次数2.按照元素每一位的大小分配入对应容器(如数组,链表,队列等)3.按照容器的次序依次收集数据4.重复前两步,直至每一位都分配,收集完毕例如:3.代码实现本算法使用链表作原创 2022-01-28 17:52:36 · 3132 阅读 · 0 评论