数据结构
解除
世界很精彩!
展开
-
无向图的邻接表表示法
总结:1、邻接表表示由表头结点、邻接结点组成;2、为了方便插入边(即将两个结点连起来)的操作,定义边(两个邻接点下标+边权重);3、表头结点的权重存放的是结点的权重,邻接点的权重存放的是边权重!//无向图的邻接表表示法#include <stdio.h>#include <stdlib.h>#define MaxVertexNum 100typedef int Vertex;typedef int WeightType;typedef char DataType.原创 2021-04-19 21:23:19 · 3158 阅读 · 2 评论 -
图的邻接矩阵表示法
很简单,两部分。图GNode包含:1、二维矩阵G[][]2、顶点数3、边数4、结点的数据(可选)边ENode包含:1、是那两个结点的边(边的位置)2、边的权重weight通过Insert函数把边ENode插入图GNode中。//图的邻接矩阵表示法 #include <stdio.h>#include <stdlib.h>#define MaxVertexNum 100#define Infinity 65535typedef int Vertex;t原创 2021-04-11 22:09:59 · 269 阅读 · 0 评论 -
05-树8 File Transfer (25 分) 按秩归并
#include <stdio.h>typedef int ElementType;typedef int SetName;typedef ElementType SetType[10003];SetName Find(SetType S,ElementType X){ while(S[X]>=0) X=S[X]; return X;}void Union(SetType S,SetName Root1,SetName Root2){原创 2021-04-09 21:19:07 · 68 阅读 · 0 评论 -
并查集及其运算
要点:集合的查找与并中,下标可理解为结点元素的地址,Parent可理解为指向下一个地址的指针。//集合及运算 #include <stdio.h>#include <stdlib.h>typedef int ElementType;typedef struct{ ElementType Data; int Parent;}SetType;int MaxSize;//MaxSize为最大的下标 int Find(SetType S[],ElementType X).原创 2021-04-09 14:47:41 · 114 阅读 · 0 评论 -
(完整版C语言代码)哈夫曼树的构造
图:最终构成的哈夫曼树//哈夫曼树的构造#include <stdio.h>#include <stdlib.h>#define MinSize -1000typedef struct HTNode *HuffmanTree;struct HTNode{ int Weight; HuffmanTree Left; HuffmanTree Right;};typedef HuffmanTree ElementType;typedef struct HeapNo.原创 2021-04-09 00:32:34 · 1657 阅读 · 0 评论 -
05-树7 堆中的路径 (25 分)+插入误解成最大堆的建立
//通过Insert函数建最大堆#include <stdio.h>#include <stdlib.h>#define MinSize -10001typedef struct HeapNode *MinHeap;struct HeapNode{ int *Elements; int Size; int Capacity;};MinHeap Create(int N){ MinHeap H=(MinHeap)malloc(sizeof原创 2021-04-08 16:54:57 · 64 阅读 · 0 评论 -
最大堆的基本操作
关于最大堆的DeleteMax函数,运行其中for循环步骤:1、判断条件: root的孩子是否存在2、若存在,找到最大的孩子3、判断最大孩子与item的大小4、若item大 break,此次没改变root的地址,结束for循环,将root结点赋值5、若item小,把大孩子赋给root结点。循环末尾赋值: root改为大孩子的下标,进行下次循环6、循环到4的情况,或:root的孩子不存在,结束循环, root结点赋值。//最大堆的基本操作#include <stdio.h>#in原创 2021-04-07 16:28:31 · 191 阅读 · 0 评论 -
04-树4 是否同一棵二叉搜索树+bug总结
看完小白专场,感觉也没啥难的。就自己开始写了。但是“最大N,多组合”的测试点一直通过不了,debug了一下午,一直找不到错误,都快崩溃了。于是逐一得把自己的代码换成老师的代码,寻找bug在哪里(下面注释的代码为老师的函数代码)。我常见的bug总结:1、敲代码时,字母经常敲错。2、if(T)、while(!T)之类的经常弄反了这个题目bug总结:1、漏了ResetTree函数2、鬼使神差地if(i=0;i<=N;i++),其实只要输入N个数据3、需要用scanf输入N个数据,提前retur原创 2021-04-06 18:27:39 · 315 阅读 · 3 评论 -
AVL树的插入函数+CSDN去水印办法+04-树5 Root of AVL Tree (25 分)
该图是把i=0,1,2,3,4依次插入空树所形成的AVL树,前序遍历结果是1 0 3 2 4。//AVL树的插入函数 #include <stdio.h>#include <stdlib.h>typedef int ElementType;typedef struct AVLNode *Position;typedef Position AVLTree;struct AVLNode{ ElementType Data; AVLTree Left; AVLTree.原创 2021-04-06 11:09:28 · 130 阅读 · 0 评论 -
二叉搜索树的插入与删除+递归的数学原理
之前一直不太会用递归,想知道递归对应的数学原理。现在大概明白了。递归的数学原理是:数学归纳法。以下面二叉搜索树的插入为例:Insert(X,BST)的作用:是创建一个存储X数据的结点,并按二叉搜索树的规则插入,并返还二叉搜索树的根结点(简洁地说就是插入元素,返回根结点)。1、二叉树有0个结点,即BST为空,Insert函数代码成立。2、二叉树有一个结点时,Insert函数代码成立。3、假设Insert函数对小于等于n个结点的二叉树都成立。根据假设,则Insert函数对于有n+1个结点的二叉树成立原创 2021-04-05 11:23:27 · 237 阅读 · 1 评论 -
基本的非递归后序遍历+根据层序遍历改写的非递归前、中、后序遍历
讨论3.4 如何用堆栈实现后序遍历的非递归程序(来源与慕课陈越姥姥的《数据结构》)参考要点:(1) 借助堆栈实现前序遍历、中序遍历非递归程序的本质是利用堆栈模拟递归函数调用时的入栈和出栈过程。而前序遍历、中序遍历和后序遍历在递归函数执行时,结点(作为函数参数)的入栈和出栈过程是完全一样的。(2) 前序遍历是在结点入栈时输出结点信息,然后开始分别对该结点左右子树的遍历;而在中序遍历中,结点出栈时表明刚完成对该结点左子树的遍历,此时可输出该结点信息。(3) 后序遍历必须在左右子树均输出原创 2021-04-05 08:47:54 · 323 阅读 · 0 评论 -
03-树3 Tree Traversals Again (scanf的思考与递归不熟练)
#include <stdio.h>#include <stdlib.h>typedef int Tree;struct TNode{ int Data; Tree Left; Tree Right;}T[30];int *PreorderQ,P=-1;int *InorderQ,I=-1;int N,check=0;void GetPreQandInQ(){ scanf("%d",&N); PreorderQ=(int*)malloc(sizeo原创 2021-04-04 16:06:30 · 71 阅读 · 0 评论 -
03-树2 List Leaves (25 分)
#include <stdio.h>#define Null -1typedef int Tree;struct TNode{ Tree Left; Tree Right;}T[10];//全局变量,在定义的函数内部也可以调用 Tree BuildTree(struct TNode T[]){ int N; Tree Root=Null; char cl,cr; scanf("%d",&N); int check[N]; for(int i=0;i<N;原创 2021-04-03 17:09:03 · 45 阅读 · 0 评论 -
03-树1 树的同构 判断树是否同构的略简单方法
如何判断树的同构?分情况讨论:1、两颗树都为空,同构。2、两棵树有一颗为空,不同构。3、两棵树都不为空。(a) 根结点数据不相同(b) 根结点数据相同。要是r1的左子树与r2的左子树同构&&r1的右子树与r2的右子树同构,或r1的左子树与r2的右子树同构&&r1的右子树与r2的左子树同构,则同构。即:return (Ismorphic(T1[r1].Left,T2[r2].Right)&&Ismorphic(T1[r1].Right,T2[r2]原创 2021-04-03 14:21:56 · 1615 阅读 · 0 评论 -
Pop Sequence
#include<stdio.h> int main() { int N,M,K; int i,j,a[1000]; scanf("%d %d %d",&M,&N,&K); for(i=0;i<K;i++){ for(j=0;j<N;j++)scanf("%d",&a[j]); int stack[1000]={0},top=0;//创建一个栈 int num=1; j=0,stack[0]=num; while(j原创 2021-04-01 16:32:56 · 82 阅读 · 0 评论 -
(完整版代码)二叉树的层次生成、递归和非递归遍历、队列和堆栈层次遍历及基本操作
Talk is cheap, show me your code!#include <stdio.h>#include <stdlib.h>#define NoInfo 0typedef int ElementType;typedef struct TNode *Position; typedef Position BinTree;struct TNode{ ElementType Data; BinTree Left; BinTree Right;};ty原创 2021-03-31 22:50:50 · 194 阅读 · 0 评论 -
02-线性结构3 Reversing Linked List及踩的坑
踩过的坑:1、可能会出现输入的数据不在链表节点上。2、看错题目成翻转前K个元素。正确的题意:每隔k个节点翻转一下,输出翻转结果。我把翻转前K个元素的函数进行改编,写成一个独立的函数。一次又一次地输出翻转后的K个元素,直到剩余元素小于K个。我方法应该不好,只能不断地调试,直到AC。#include <stdio.h>#define MaxSize 100003typedef int ElementType;typedef int Ptr;typedef struct node{原创 2021-03-31 00:08:20 · 98 阅读 · 0 评论 -
栈在括号匹配中的应用
//栈在括号匹配中的应用 #include<stdio.h>#include<stdlib.h>typedef int Position;typedef char ElementType; struct SNode{ ElementType *Data; Position Top; int MaxSize;}; typedef struct SNode *Stack;Stack CreatStack(int MaxSize);bool IsFull(Stac原创 2021-03-30 18:39:30 · 91 阅读 · 0 评论 -
一个数组实现两个堆栈
//一个数组实现两个堆栈 #include <stdio.h>#include <stdlib.h>#define ERROR -100000typedef int ElementType; typedef int Position;typedef struct SNode *PtrToSNode;struct SNode{ ElementType *Data; Position Top1; Position Top2; int MaxSize;}; typ原创 2021-03-30 16:56:07 · 130 阅读 · 2 评论 -
链表与数组写一元多项式的乘法与加法运算——系数和指数取上限,结果有零多项式 段错误
不知道为啥就是系数和指数取上限,结果有零多项式 段错误,找了两三个小时都没找出来,气死。#include <stdio.h>#include <stdlib.h>typedef struct PolyNode *Polynomial;struct PolyNode{ int coef; int expon; Polynomial link;}; Polynomial ReadPoly();Polynomial Add(Polynomial P1,Polynom.原创 2021-03-29 21:10:53 · 415 阅读 · 0 评论 -
带头结点的队列链式存储及基本操作
//带头结点的队列链式存储及基本操作#include <stdio.h>#include <stdlib.h>typedef int ElementType; typedef struct QNode *PtrQNode;struct QNode{ ElementType Data; PtrQNode Next;};typedef PtrQNode Position;typedef struct Queue *PtrQueue;struct Queue{原创 2021-03-27 21:22:13 · 313 阅读 · 0 评论 -
队列的顺序存储及基本操作
//队列的线性存储及基本操作 #include <stdio.h>#include <stdlib.h>#define MaxSize 100typedef int ElementType;typedef int Position;struct QNode{ ElementType Data[MaxSize]; Position Front,Rear; //Front指向队列头一个元素再前面的一个元素,Rear指向队尾的元素 }; typedef struct Q原创 2021-03-26 23:41:54 · 176 阅读 · 0 评论 -
01-复杂度3 二分查找 (20 分)
Position BinarySearch( List L, ElementType X ){ int left=0,right=L->Last,i=(left+right)/2; int j=0; /*原理:任何连续数列{m,m+1,m+2,…,n-1,n},除2且后向下取整,定会出现{n,n+1},而后会出现{n} 要是像下面代码一样,每次向下取整后边界减一,会出现{n},然后出界[n,n-1]。描述得太乱了,有空要把取整函数的性质学一下*/ //条件可改原创 2021-03-26 21:56:42 · 71 阅读 · 0 评论 -
带头结点的堆栈链式存储及基本操作
//带头结点的堆栈链式存储 及基本操作 #include<stdio.h>#include<stdlib.h>typedef int ElementType;typedef struct SNode* PtrSNode;struct SNode{ ElementType Data; PtrSNode Next;};typedef PtrSNode Stack;Stack CreatStack(){ Stack S=(Stack)malloc(sizeof(st原创 2021-03-24 23:55:41 · 159 阅读 · 0 评论 -
堆栈的顺序存储及基本操作
#include<stdio.h>#include<stdlib.h>typedef int Position;typedef int ElementType; struct SNode{ ElementType *Data; Position Top; int MaxSize;}; typedef struct SNode *Stack;Stack CreatStack(int MaxSize){ Stack S=(Stack)malloc(sizeof(原创 2021-03-24 22:37:02 · 331 阅读 · 0 评论 -
线性表的链式存储及基本操作
只测试了大概的一部分,应该还存在bug。//有头结点的链式存储的链表 #include <stdio.h>#include <stdlib.h>typedef int ElementType;typedef struct LNode *List;struct LNode{ ElementType Data; List Next;}; List MakeEmpty();List Find(ElementType X,List L);List FindKth(i原创 2021-03-21 19:45:47 · 168 阅读 · 1 评论 -
线性表的顺序存储及其基本操作
注意点:1、顺序存储的插入函数,不仅要考虑插入位置的合法性,还要考虑表是否满!2、malloc函数的头文件是stdlib.h,不要忘记。#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100000typedef int ElementType;typedef struct LNode *List;struct LNode{ ElementType Data[MAXSIZE]; int Last;};L原创 2021-03-20 21:51:07 · 222 阅读 · 0 评论 -
在线处理算法求最大子列和的原理
在线处理算法求最大子列和的核心思想:如果整数序列{a1,a2,a3,…,an}\{a_1,a_2,a_3,\ldots,a_n\}{a1,a2,a3,…,an}的最大子列和是{ai,a1+1,…,aj}\{a_i,a_1+1,\ldots,a_j\}{ai,a1+1,…,aj},那么必定有∑k=ilak⩾0\sum_{k=i}^la^k\geqslant0∑k=ilak⩾0对任意i⩽l⩽ji{\leqslant}l{\leqslant}ji⩽l⩽j成立。#include <stdio原创 2021-03-19 23:07:00 · 379 阅读 · 0 评论 -
01-复杂度1 最大子列和问题 两种解法
解法一:暴力解法,把所有的连续子列和求出来。但是如何才能把所有的子列和表示出来呢?两个for循环。依次求出含有数组下标为0的元素的所有连续子列和,再接着求出含有数组下标为1的所有连续子列和……第一个for循环为了把所有元素走一遍,第二个for循环是求出含有Sequence[i]的所有子列和,即从位置i依次+1直到位置K-1,分别求出所有的子列。//暴力解法,把所有的子列和求出来。 #include <stdio.h>int main(){ int K,MaxSequenceSum=原创 2021-03-18 22:17:45 · 257 阅读 · 0 评论 -
02-线性结构4 Pop Sequence (25分)
Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, …, N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain原创 2020-12-11 20:39:07 · 127 阅读 · 0 评论 -
02-线性结构1 两个有序链表序列的合并 (15分)
总结:1、我自己的代码能力太垃圾,要是自己苦思冥想,花了好长时间,写出一个垃圾代码,即使通过了。学习的性价比也太低了,我现在要做的是,多读代码多学习,多借鉴大佬的。2、具体做法:a、思考四五分钟,没啥思路。找大佬的代码看懂,然后复现。b、有思路,自己写一下,遇到坎,看看大佬怎么写的,不要硬着头皮上,效率是第一位。先把这些具体实现一遍,再完完全全自己刷题!List Merge( List L1, List L2 ){ List pa, pb, pc, L; L=(List)malloc原创 2020-10-29 21:04:35 · 148 阅读 · 0 评论 -
02-线性结构2 一元多项式的乘法与加法运算 (20分)
#include <stdio.h>#define N2 2001#define N1 1001void addition(int a[], int b[]);void multiplication(int a[], int b[]);int main(){ int a[N1]={0}, b[N1]={0}, a1, b1, i, x, j; scanf("%d",&b1); for(i=0; i<b1; i++){ s原创 2020-10-28 23:32:56 · 272 阅读 · 0 评论 -
拼题A:01-复杂度2 Maximum Subsequence Sum两种解法
拼题A:01-复杂度2 Maximum Subsequence Sum (25分)#include <stdio.h>#define MAXK 100000void MaxSubSum(int L[], int N);int main(){ int a[MAXK], K; scanf("%d", &K); for(int i=0; i<K; i++) scanf("%d", &a[i]); MaxSubSum(a,原创 2020-10-27 22:57:48 · 227 阅读 · 2 评论