数据结构与算法
Sany 何灿
这个作者很懒,什么都没留下…
展开
-
散列查找(哈希表)| 计算位置 & 解决冲突
#define MAXTABLESIZE 100000 // 允许开辟的最大散列表长度typedef int ElementType; // 关键词类型用整型typedef int Index; // 散列地址类型typedef Index Position; // 数据所在位置与散列地址是同一类型// 散列单元状态类型,分别对应:有合法元素、空单元、有已删除元素typedef enum { Legitimate,...原创 2021-05-19 22:15:41 · 378 阅读 · 0 评论 -
串的模式匹配 | KMP算法
当j增加1时,j的match值有两种情况#include <stdio.h>#include <string.h>#include <stdlib.h>typedef int Position;#define NotFound -1void BuildMatch(char *pattern, int *match){ // 为pattern建立相应的match值 Position i, j; int m = str...原创 2021-05-15 10:56:43 · 198 阅读 · 0 评论 -
基数排序 | 主位优先 & 次位优先 | C语言
一、桶排序二、基数排序原创 2021-03-25 10:39:39 · 525 阅读 · 0 评论 -
快速排序 | 分而治之 |C语言
ElementType Median3(ElementType A[], int Left, int Right){ int Center = (Left+Right) / 2; if (A[Left] > A[Center]) { Swap(&A[Left], &A[Center]); } if (A[Left] > A[Right]) { Swap(&A[Left], &A[Right]...原创 2021-03-21 15:12:51 · 180 阅读 · 0 评论 -
归并排序 | 递归 & 非递归 |C语言
// L = 左边起始位置,R = 右边起始位置,RightEnd = 右边终点位置void Merge(ElementType A[], ElementType TmpA[], int L, int R, int RightEnd){ // 将有序的A[L]~A[R-1]和A[R]~A[RightEnd]归并成一个有序序列 int LeftEnd, NumElements, Tmp; int i; LeftEnd = R - 1; // 左边终点位置 ...原创 2021-03-17 17:50:12 · 205 阅读 · 0 评论 -
希尔排序 | 增量序列 + 插入排序实现 | C语言
一、插入排序void Insertion_Sort(ElementType A[], int N){ for (P = 1; p < N; P++) { Tmp = A[P]; // 取出未排序序列中的第一个元素 for (i = p; i > 0 && A[i-1] > Tmp; i--) { A[i] = A[i-1]; // 依次与已排序序列中元素比较并右移 } ...原创 2021-03-13 15:10:03 · 366 阅读 · 0 评论 -
拓扑排序 | 队列实现 | C语言
bool TopSort(LGraph Graph, Vertex TopOrder[]){ // 对Graph进行拓扑排序,TopOrder[]顺序存储排序后的顶点下标 int Indegree[MaxVertexNum], cnt; Vertex V; PtrToAdjVNode W; Queue Q = CreateQueue(Graph->Nv); // 初始化Indegree[] for (V=0; V<...原创 2021-03-09 12:48:54 · 607 阅读 · 0 评论 -
最小生成树 | Prim算法 & Kruskal算法 |C语言
一、Prim算法MST收集的是顶点;这里的dist[]是指结点V到最小生成树的最小距离;当dist[V] = 0 时,表明结点V被收录到最小生成树中, 如果dist[W] != 0,表明结点W还没被收录;使用parent[s]来存储树,记录当前结点的父结点位置;图 | 邻接矩阵表示 & 邻接表表示 | C语言Vertex FindMinDist(MGraph Graph, WeightType dist[]){ // 返回未被收录顶点中dist最小者 Verte..原创 2021-03-08 21:44:47 · 474 阅读 · 0 评论 -
哈利波特的考试 | Floyd算法(邻接矩阵实现)|C语言
题目:先找到各顶点(某种动物)到(变化到)其他顶点(动物)所需路径的最大值(所念咒语的长度),再从所有最大值中找到最小值。#include "harry_exam.h"#define MAxVertexNum 100 // 最大顶点数设为#define INFINITY 65535 // 正无穷设为双字节无符号整数的最大值65535typedef int Vertex; // 用顶点下标表示顶点,为整型typedef int WeightType; // 边的权值设为原创 2021-03-06 15:40:18 · 721 阅读 · 0 评论 -
最短路径 | 单源(Dijkstra算法)& 多源(Floyd算法) |C语言
一、无权图的单源最短路算法void Unweighted(LGraph Graph, int dist[], int path[], Vertex S){ Queue Q; Vertex V; PtrToAdjVNode W; Q = CreateQueue(Graph->Nv); // 创建空队列,MaxSize为外部定义的常数 dist[S] = 0; // 初始化源点 AddQ(Q, S); whil...原创 2021-03-05 12:27:03 · 808 阅读 · 2 评论 -
完全二叉搜索树 | 排序 & 层序遍历(数组实现)| C语言
void solve(int ALeft, int ARight, int TRoot){ // 初始调用为 solve(0, N-1, 0) // ALeft是排序后的输入序列A的左端点数组下标,ARight是右端点数组下标 // TRoot是结果树序列的数组下标 n = ARight - ALeft + 1; if (n==0) return; L = GetLeftLength(n); // 计算出n个结点的树其左子树有多少个结点 T[T...原创 2021-02-27 11:37:43 · 295 阅读 · 0 评论 -
图的遍历 | 深度优先搜索 & 广度优先搜索 | C语言
图 | 邻接矩阵表示 & 邻接表表示 | C语言// 用邻接表实现深度优先搜索void Visit(Vertex V){ printf("正在访问顶点%d\n", V);}// Visited[]为全局变量,已经初始化为falsevoid DFS(LGraph Graph, Vertex V, void (*Visit)(Vertex)){ // 以V为出发点对领接表存储的图Graph进行DFS搜索 PtrToAdjVNode W; Vi..原创 2021-02-22 15:48:43 · 426 阅读 · 1 评论 -
图 | 邻接矩阵表示 & 邻接表表示 | C语言
一、邻接矩阵#define MaxVerNum 100 // 最大顶点数设为100#define INFINITY 65535 // 正无穷设为双字节无符号整数的最大值65535typedef int Vertex; // 用顶点下标表示顶点,为整型typedef int WeightType; // 边的权值设为整型typedef char DataType; // 顶点存储的数据类型设为字符型// 边的定义typedef struct ENode *PtrTo..原创 2021-02-22 12:50:37 · 515 阅读 · 0 评论 -
集合 | 并查集(树结构表示,数组存储)| C语言
查找某个元素所在集合(用根结点表示)int Find(SetType S[], ElementType X){ // 在数组S中查找值为X的元素所属的集合 // MaxSize是全局变量,为数组S的最大长度 int i; for (i = 0; i < MaxSize && S[i].Data != X; i++); if (i >= MaxSize) return -1; // 未找到X,返回-1 for (; S[i...原创 2021-02-20 20:24:37 · 387 阅读 · 0 评论 -
哈夫曼树 | 最小堆实现 |C语言
typedef struct TreeNode *HuffmanTree;struct TreeNode { int Weight; HuffmanTree Left, Right;}HuffmanTree Huffman(MinHeap H){ // 假设H->Size个权值已经存在H->Elements[]->Weight里 int i; HuffmanTree T; BuildMinHeap(H); // 将H->E...原创 2021-02-19 17:10:20 · 445 阅读 · 0 评论 -
最大堆 | 完全二叉树构建,顺序存储(数组)| C语言
最大堆创建将MaxData换成MinData,同样适用于最小堆;typedef struct HeapStruct *MaxHeap;struct HeapStruct { ElementType *Data; // 存储堆元素的数组 int Size; // 堆的当前元素个数 int Capacity; // 堆的最大容量};MaxHeap Create(int MaxSize){ // 创建容量为M...原创 2021-02-19 13:23:28 · 542 阅读 · 0 评论 -
单链表的逆转 | C语言
typedef struct lNode *Ptrstruct lNode { int data; Ptr next;};Ptr Reverse(Ptr head, int K){ Ptr new, old; cnt = 1; new = head->next; old = new->next; while (cnt < K) { // 逆转K个节点 tmp = old->next; ...原创 2021-02-18 16:05:17 · 192 阅读 · 0 评论 -
判别是否是同一棵二叉树 | C语言
第三种判别方法步骤一:搜索树表示步骤二:建搜索树T步骤三:判别一序列是否与搜索树T一致(1)框架搭建int main(){ int N, L, i; Tree T; scanf("%d", &N); while (N) { scanf("%d", &L); T = MakeTree(N); for (i=0; i<L; i++) { if (Judge..原创 2021-02-18 14:44:55 · 377 阅读 · 0 评论 -
平衡二叉树的调整与插入 | RR & LL & LR & RL | C语言
typedef struct AVLNode *Position;typedef Position AVLTree; // ALV树模型struct AVLNode { ElementType Data; // 结点数据 AVLTree Left; // 指向左子树 AVLTree Right; // 指向右子树 int Height; // 树高};int Max(int a, int b){ return.原创 2021-02-17 22:08:08 · 280 阅读 · 0 评论 -
二叉搜索树 | 查找 & 插入 & 删除 (链表实现)| C语言
一、查找尾递归,执行效率低Position Find(ElementType X, BinTree BST){ if (!BST) return NULL; // 查找失败 if (X > BST->Data) return Find(X, BST->Right); // 在右子树中继续查找 else if (X < BST->Data) return Find(X, BST->Left); //..原创 2021-02-17 18:26:55 · 205 阅读 · 2 评论 -
二叉树 | 层序遍历(队列实现)| C语言
二叉树表示typedef struct TNode *Position;typedef Position BinTree; // 二叉树类型struct TNode { // 树的定义 ElementType Data; // 结点数据 BinTree Left; // 指向左子树 BinTree Right; // 指向右子树};void LevelorderTraversal(BinTree BT){ Queue Q;原创 2021-02-17 10:22:32 · 572 阅读 · 1 评论 -
二叉树的遍历(先序、中序、后序)| 递归 & 非递归(堆栈实现) | C语言
二叉树表示typedef struct TNode *Position;typedef Position BinTree; // 二叉树类型struct TNode { // 树的定义 ElementType Data; // 结点数据 BinTree Left; // 指向左子树 BinTree Right; // 指向右子树};一、中序遍历void InorderTraversal(BinTree BT){ if (BT原创 2021-02-17 10:08:05 · 644 阅读 · 4 评论 -
队列 | 数组实现 & 链表实现 | C语言
一、数组实现注意:front和rear的初始位置typedef int Position;struct QNode { ElementType *Data; // 存储元素的数组 Position Front, Rear; // 队列的头、尾指针 int MaxSize; // 队列最大容量}typedef struct QNode *Queue;Queue CreateQueue(int MaxSize){ Que...原创 2021-02-16 14:45:48 · 157 阅读 · 0 评论 -
堆栈 | 数组实现 & 链表实现 | C语言
一、数组实现#include "stacking.h"typedef int Position;typedef struct SNode *Stack;struct SNode { ElementType *Data; // 存储元素的数组 Position Top; // 栈顶指针 int MaxSize; // 堆栈最大容量};Stack CreateStack(int MaxSize){ Stack S = (Sta...原创 2021-02-16 11:33:37 · 256 阅读 · 0 评论 -
静态查找 | 顺序查找 & 二分查找 | C语言
(1)顺序查找时间复杂度为O(n)O(n)O(n)#include <stdio.h>typedef struct LNode *StaticTable;struct LNode{ ElementType Element[MAXSIZE]; int Length;};int SequentialSearch(StaticTable Tbl, ElementType K){ // 在表Tbl[1]~Tb1[n]中查找关键字为K的数据元素 int i;.原创 2021-02-08 21:57:36 · 194 阅读 · 0 评论 -
线性表 | 数组实现 & 链表实现 | C语言
一、数组实现(1)初始化(建立空的顺序表)struct LNode L;List PtrL;List MakeEmpty(){ List PtrL; PtrL = (List)malloc(sizeof(struct LNode)); PtrL->Last = -1; return PtrL;}(2)查找int Find(ElementType X, List PtrL){ int i = 0; while ( i <= .原创 2021-02-06 21:04:22 · 249 阅读 · 0 评论 -
一元多项式实现 | 数组 & 链表 | C语言
方法:一维数组缺点:浪费空间和时间,因为要考虑到非零项之外的项数。方法:结构数组缺点:节省空间原创 2021-02-06 14:18:25 · 436 阅读 · 0 评论 -
可变数组的实现 | C语言
实现功能根据指定长度,创建数组检查数组的大小查询数组某一位置的值增大数组释放空间注意点创建结构变量文件main.c#include <stdio.h>#include "array.h"#include <stdlib.h>//typedef struct {// int *array;// int size;//} Array;const BLOCK_SIZE = 20;Array array_create(int原创 2021-02-04 15:16:49 · 370 阅读 · 0 评论 -
循环与递归区别 | C语言
递归程序对空间占用率高,如果值很大,会吃掉所有能用的空间,导致程序非正常终止。// for循环void PrintN(int N){ int i; for (i=1; i<=N; i++){ printf("%d\n", i); } return;}int main(){ PrintN(1000000);}// 递归void PrintN(int N){ if (N){ PrintN(N - 1);原创 2020-07-17 10:28:06 · 530 阅读 · 0 评论 -
算法时间复杂度的渐进表示法 + 分析窍门
算法时间一般只算乘法次数,因为计算机计算加减法很快,可忽略。时间复杂度的渐进表示法T(n)=O(f(n))T(n)=O(f(n))T(n)=O(f(n))表示存在常数C>0C>0C>0,n0>0n_0>0n0>0使得当n>geqn0n>geq n_0n>geqn0时有T(n)≤C⋅f(n)T(n)\leq C·f(n)T(n)≤C⋅f(n)T(n)=Ω(g(n))T(n)=\Omega(g(n))T(n)=Ω(g(n))表示存在常数C>原创 2020-07-17 10:24:31 · 3139 阅读 · 0 评论