初试数据结构学习
备考南师大时所做的数据结构笔记
爱吃柚子的梨
自勉联:
有志者事竟成破釜沉舟百二秦关终属楚
苦心人天不负卧薪尝胆三千越甲可吞吴
展开
-
【2015.8】验证四色定理的有效性
【原理】回溯法【核心代码】void Draw(AGraph* g, int v){ if (v == g->n) { ColorPrint(g); count++; } else { int i; for (i = 1; i <= 4; ++i)//四个循环其实就是四叉树,类似于四皇后问题 { //先序遍历状态树,因此先进行着色 g...原创 2020-06-02 15:05:04 · 374 阅读 · 0 评论 -
基数排序
【原理】Y286【代码】#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>#include <ctype.h>#define maxSize 100#define RADIX 10 //关键字基的个数typedef...原创 2020-05-31 22:56:03 · 104 阅读 · 0 评论 -
前缀表达式的计算
【原理】前缀表达式计算算法补充:(前缀计算易错在于循环变量是--i不是++i)从后往前扫描表达式 如果遇到操作数则入栈 如果遇到操作符则连续出栈两个元素,进行运算,并将运算结果存入栈中 返回栈顶元素值小结:前缀表达式的计算与后缀类似,唯一区别是前缀要从后往前读,且应当是先取a再取b。【代码】#include <stdio.h>#include <std...原创 2020-06-02 15:02:18 · 3188 阅读 · 0 评论 -
DFS非递归算法
【原理】【数据源】T188【核心代码】//非递归DFS遍历算法void NonRecurDFS(AGraph* g, int v0){ int stack[maxSize], top = -1; ArcNode* p = NULL; int j; Initialize(g->n);//初始化访问数组 //将起始点入栈并访问 stack[++top] = ...原创 2020-06-02 15:03:19 · 2150 阅读 · 0 评论 -
严版教材Y53页 中值表达式的计算
【反思】1.输入的值必须为0~92.OPND必须为int,因为操作得到的结果的值可能超过char类型的取值范围3.在计算完c值后,用continue跳出本层循环,这是由于exp[i]还没有入栈,不可以++i4.将top1 == -1和栈顶优先级小的情况放在一起会使得代码更加简洁5.因为没有##表达式求值完毕符号,所以必须要再写一个while循环将OPTR中的运算符都出栈后再返回...原创 2020-06-02 15:04:15 · 201 阅读 · 0 评论 -
汉诺塔
【C版代码】#include <stdio.h>void move(char s1,int n, char s2){ printf("move disk %d from %c to %c\n",n, s1, s2);}//X表示原始柱,Y为辅助柱,Z为目标注void Hanoi(int n, char X, char Y, char Z){ if (n == ...原创 2019-12-09 14:51:38 · 75 阅读 · 0 评论 -
【真题】【2003 二、4】进制转换Y48(严版教材48页)
【核心代码】//十进制转换为任意进制,n为十进制数,base为要转换的进制void Conversion(char exp[], int n, int base){ int stack[maxSize], top = -1; char b[17] = "0123456789ABCDEF"; while (n) { stack[++top] = n % base; n ...原创 2020-06-02 15:04:39 · 130 阅读 · 0 评论 -
回溯法:八皇后问题(此题涉及一个疑惑,考完研以后再研究)
疑惑见文末【核心代码】void Trial(int i, int n){ if (i == n) { ChessPrint(); printf("\n"); ++c; } else { int j; for (j = 0; j < n; ++j) { Chess[i][j] = 1; if (IsLegitimate(i, j))...原创 2020-05-31 22:57:37 · 180 阅读 · 0 评论 -
求含n个元素的幂集
【原理】Y150先取一个元素,如果决定要它就进入做分支,如果决定舍弃它就进入右分支,当取的元素个数要超过n时就输出。【核心代码】void GetPowerSet(int i,char A[],char B[])//i表示A中第几个字符,i从1开始{ int k, n; n = strlen(A); if (i > n) { puts(B); } else ...原创 2020-06-02 15:05:14 · 391 阅读 · 0 评论 -
构建深度遍历优先生成树
【核心代码】int visited[maxSize];void DFSTree(AGraph* G, int v, CSNode* T){ ArcNode* p; int j; int first = TRUE; visited[v] = 1; p = G->adjlist[v].firstarc; CSNode* cs = NULL, *q = NULL; whi...原创 2020-06-02 15:05:35 · 1016 阅读 · 0 评论 -
将二叉树的所有结点的左右子树交换
【核心代码】//将结点的左右子树交换void swap(BTNode* root){ BTNode* tmp; tmp = root->lchild; root->lchild = root->rchild; root->rchild = tmp;}void TreeSwap(BTNode* root){ if (root == NULL)//易...原创 2020-06-02 15:05:43 · 6723 阅读 · 1 评论 -
层次遍历和中序遍历序列创建二叉树
【数据来源】T143【代码】#include <stdio.h>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <string.h>#define maxSize 100typedef char ElementType;typedef ...原创 2020-06-02 15:06:34 · 3635 阅读 · 0 评论 -
AVL平衡二叉树
原创 2020-06-02 15:09:47 · 97 阅读 · 0 评论 -
二叉排序树删除操作
尤其关注一下当结点只有一个子树或者为空时的代码,这段代码的意思是先用变量TmpCell存放T中结点地址,然后令T指向T的孩子结点,最后释放TmpCell中的结点空间(删除该结点),并返回孩子结点的地址(给其双亲结点的存放子树地址的指针域)。...原创 2020-06-02 15:09:55 · 231 阅读 · 0 评论 -
求一棵二叉树的结点深度
【核心代码】int L = 0, max = 0;void Depth(BTNode* bt){ if (bt != NULL) { L++; if (L > max) { max = L; } Depth(bt->lchild); Depth(bt->rchild); L--; }}【测试代码】#incl...原创 2020-06-02 15:10:29 · 607 阅读 · 0 评论 -
后缀转中缀
【代码】char* comtoin(char* exp){ char* stack[maxSize]; char* a,*b; int top = -1; int i = 0,j; char* s; char op; while (exp[i] != '\0') { if (exp[i] >= '0' && exp[i] <= '9') ...原创 2020-06-02 15:10:36 · 200 阅读 · 0 评论 -
后缀表达式转前缀表达式
【原理】仿照后缀表达式的计算过程,把用字符数组来保存计算结果。【代码】#include <stdio.h>#include <stdlib.h>#include <string.h>#define maxSize 100typedef struct BTNode{ char data; struct BTNode* lchild, ...原创 2020-06-02 15:02:06 · 789 阅读 · 0 评论 -
由中缀、后缀确定前缀表达式
【代码】#include <stdio.h>#include <stdlib.h>#include <string.h>#define maxSize 100typedef struct BTNode{ char data; struct BTNode* lchild, *rchild;}BTNode;//后序和中序确定一棵二叉树B...原创 2020-06-02 15:10:44 · 187 阅读 · 0 评论 -
由中缀、后缀确定前缀表达式
【代码】#include <stdio.h>#include <stdlib.h>#include <string.h>#define maxSize 100typedef struct BTNode{ char data; struct BTNode* lchild, *rchild;}BTNode;//后序和中序确定一棵二叉树B...原创 2020-06-02 15:06:00 · 357 阅读 · 0 评论 -
后序和先序序列确定一棵二叉树以及二叉树的非递归先序遍历算法
【代码】#include <stdio.h>#include <stdlib.h>#include <string.h>#define maxSize 100typedef struct BTNode{ char data; struct BTNode* lchild, *rchild;}BTNode;//后序和中序确定一棵二叉树B...原创 2020-06-02 15:10:51 · 177 阅读 · 0 评论 -
稀疏矩阵的链式存储——十字链表法
【创建】CrossList* Create(int A[][maxSize], int m, int n){ CrossList* cl = (CrossList*)malloc(sizeof(CrossList)); cl->m = m; cl->n = n; cl->k = 0; int i, j, k; OLNode* r, *p; //申请头结点...原创 2020-06-02 15:10:59 · 956 阅读 · 0 评论 -
删除str中值为ch的所有字符
代码#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct{ char* ch; int length;}Str;void Delete(Str* str, char ch){ int i, count; count = 0; for (i ...原创 2020-06-02 15:11:09 · 1579 阅读 · 0 评论 -
链表建立与初始化
【代码】#include <stdio.h>#include <stdlib.h>typedef struct LNode{ int data; struct LNode *next;} LNode;void Print(LNode *L)///输出函数{ LNode *p; p = L; while ((p->next) != NU...转载 2019-10-16 16:35:50 · 900 阅读 · 0 评论 -
不为空的递增单链表,删除重复结点
【代码】//依次将原序列中每个连续相等的子序列中的第一个元素移动到表的前端,然后将剩余元素删除void Delete(LNode* L){ LNode* p, *q; p = L->next; q = p->next; while (q != NULL) { while (q != NULL && q->data == p->dat...原创 2020-06-02 15:12:33 · 245 阅读 · 0 评论 -
一些优质算法解析
动态规划之 KMP 算法详解https://mp.weixin.qq.com/s/djtiucGJ4Sn_rxmPaHc0hA一些常用的算法技巧总结https://mp.weixin.qq.com/s/6JJdV9oXJznkGt4gSOlR9g经典面试题:最长回文子串https://mp.weixin.qq.com/s/iSVr5M0GNXzqmUHR-hGgAQ什么是并...原创 2020-06-02 15:12:46 · 152 阅读 · 0 评论 -
【数据结构&】静态链表解析
【前言】关于静态链表的使用有两种方式,对于天勤书上采用0号单元作为头结点,-1表示空指针的方式。而严蔚敏版,将0号单元作为备用链表的头结点,0表示空指针。若需创建一个结点采用分配空间的方式获取结点地址。下面详细介绍严蔚敏版的静态链表:【基本概念】1.关于0号单元的使用:1)直接将0号单元用作要创建的链表的头结点2)将0号单元用作备用空间链表的头结点,要创建的链表的头结点从备用空...原创 2019-09-15 18:30:11 · 380 阅读 · 0 评论 -
【C语言链地址法】散列表/哈希表的创建、插入、查找、删除
1.链地址法#include <stdio.h>#include <stdlib.h>#include <math.h>#define maxSize 100typedef struct ListNode{ int element; struct ListNode* next;}ListNode;typedef ListNode* Li...原创 2019-08-13 19:19:45 · 5928 阅读 · 4 评论 -
希尔排序(C语言,严蔚敏教材改编)
原理:严版教材 P271-P272天勤 P238-P239代码:#include <stdio.h>#include <stdlib.h>#define maxSize 100void ShellInsert(int r[], int n, int dk){ int i, j, temp; for (i = dk; i < n; ++i...原创 2019-08-06 17:42:49 · 519 阅读 · 0 评论 -
【天勤第六章】树与二叉树算法总结
1.二叉树的遍历算法(1)前中后序遍历递归算法:递归模版非递归算法:利用栈来实现,具体如下前序:根先入栈,然后做一个循环,出栈,再将右子树入栈,然后是左子树入栈,栈为空结束循环。中序:当前结点指向根节点,大循环:栈不为空且当前访问结点不为空,小循环:如果有左孩子则将其入栈,直到左孩子为空(遍历左子树),再判断栈是否为空,不为空的话就出栈,使指针指向栈顶元素并对其访问(访问根结点...原创 2019-08-02 15:04:29 · 669 阅读 · 0 评论 -
串算法犯过的错误
有一句话说的非常好:学习不在于你学习了多少知识,而在于你做了多少总结。只有总结了才是自己的东西。加油!犯过的错误:1. 在求子串、串的连接时,有一行代码: if(str.ch) { free(str.ch); }这要求在main函数中初始化str的时候,要将str.ch初始化为NULL,否则在经过这一语句时,系统会出现打不开对应内存地址的报错...原创 2019-07-31 15:34:05 · 379 阅读 · 0 评论 -
折半插入排序(C语言,严蔚敏教材改编)
原理:严版教材P266-P277天勤P237代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>void BInsertSort(int r[], int n){ int i, j, low,high, m, temp...原创 2019-08-06 16:39:04 · 272 阅读 · 0 评论 -
【C语言】二路归并排序
原理:天勤P247代码1(改编数据结构与算法分析):#include <stdio.h>#include <stdlib.h>void Merge(int A[], int TmpArray[], int Lpos, int Rpos, int RightEnd){ int i,LeftEnd, NumberElems, TmpPos; TmpPos...原创 2019-08-08 15:33:58 · 1430 阅读 · 0 评论 -
邻接矩阵创建(纯C)
原理:天勤P185-P189算法说明:(1)定义邻接矩阵的数据结构,分两部分:邻接矩阵顶点类型(用来存储顶点信息比如编号、字符数据。不常用,因为编号信息意义不大,字符数据按题目要求来); 邻接矩阵表(包含一个二维数组,顶点个数,边个数);(2)先读取顶点个数n和边数e。然后对邻接矩阵的初始化,对于无权图,全部初始化为0,对于有权图的时候在循环里加一句判断,如果i==j,就赋值为0;...原创 2019-08-01 15:48:02 · 2174 阅读 · 0 评论 -
Kruskal算法总结
1.构建Kruskal函数,形参为图的邻接矩阵MGraph g,图的边的集合Road road[],生成数最后的权值int * sum2.定义变量:并查集数组vset[maxSize](用来判断图中是否存在回路)、循环变量i、图的顶点数n、图的边数e、两个根节点变量a和b(边的两个顶点所在生成树的根结点)3.将并查集数组初始化:将每个结点看做一棵独立的树,其根节点为自身4.将边的集合按...原创 2019-08-03 16:26:39 · 498 阅读 · 0 评论 -
【C语言】哈夫曼树建立与编码
原理:严版教材p144,真题册P163算法步骤:(1) 赫夫曼树的创建1)定义赫夫曼树的存储结构,包含指向双亲结点、左右孩子结点的指针、和权值信息;2)定义一个返回HTNode*类型的函数,用来创建赫夫曼树,闯入的参数为叶子结点n,和权值数组w;3)根据叶子结点个数确定赫夫曼树结点的个数m,然后定义一个结点指针数组HTNode* HT,作为赫夫曼树;4)将赫夫曼树初始化...原创 2019-07-30 20:36:56 · 2016 阅读 · 8 评论 -
【C语言】普里姆算法详解:计算最少成本和路径输出
【应用背景】连通图中各顶点所需要的最少成本。(1)普里姆算法1)根据需求构造返回类型,比如求最少成本,则定义返回类型为int型的函数,传入参数为邻接矩阵g,和出发点v0;2)定义变量:lowcost[]数组(存储图中还未并入树的各顶点到当前生成树最短边的权值),vset[]数组(标记顶点是否被并入生成树中,1为真,0为假),循环变量i,j,整型变量min,k和sum,min表示生成树到...原创 2019-08-18 16:20:18 · 1537 阅读 · 1 评论 -
【天勤第七章】 图算法总结
框架:1.图的结构(1)邻接矩阵(1)定义邻接矩阵的数据结构,分两部分:邻接矩阵顶点类型(用来存储顶点信息比如编号、字符数据。不常用,因为编号信息意义不大,字符数据按题目要求来); 邻接矩阵表(包含一个二维数组,顶点个数,边个数);(2)先读取顶点个数n和边数e。然后对邻接矩阵的初始化,对于无权图,全部初始化为0,对于有权图的时候在循环里加一句判断,如果i==j,就...原创 2019-08-14 15:31:45 · 1857 阅读 · 0 评论 -
【数据结构】二叉排序树
【基本操作】【代码】原创 2019-09-15 17:51:59 · 439 阅读 · 0 评论 -
【天勤例6-3】查找data域值等于key的结点是否存在
书:T140采用C语言书写,不用引用型:【核心代码】btnode* search(btnode* root, int key){ if (root == NULL) return NULL; else { btnode* q = NULL; if (root->data == key) { q = root; } else { ...原创 2019-09-05 17:27:04 · 341 阅读 · 0 评论 -
【C语言】AOE网路径算法详解
【算法图例】待更...【算法核心思想】【算法步骤】【核心代码】/*利用拓扑排序算法求图的逆拓扑排序和时间最早发生时间*/int TopSort(AGraph* g, int ve[], Stack* s1){ int i, j, k, n; int s2[maxSize], top2 = -1; ArcNode* p; s1->top = -1;...原创 2019-08-27 16:34:09 · 1177 阅读 · 0 评论