自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 NOJ数据结构026——二叉排序树的合并

代码如下:#include<stdio.h>#include<stdlib.h>typedef struct BiTNode { int data; struct BiTNode* left; struct BiTNode* right;}BiTNode, * BiTree;BiTree CreateBiTree(); //创建二叉树void InsertBi(BiTree* T, int insert);//插入节点void CombineBi(BiT.

2021-06-07 21:59:33 508

原创 NOJ数据结构025——二叉排序树的插入和删除

代码如下:#include<stdio.h>#include<stdlib.h>typedef struct BiTNode { int data; struct BiTNode* left; struct BiTNode* right;}BiTNode, * BiTree;BiTree CreateBiTree(); //创建二叉树int JudgeBinary(BiTree T); //判断是否是二叉排序树int main(){ BiTre.

2021-06-07 21:57:47 693

原创 NOJ数据结构024——二叉排序树的判别

#include<stdio.h>#include<stdlib.h>typedef struct BiTNode { int data; struct BiTNode* left; struct BiTNode* right;}BiTNode, * BiTree;BiTree CreateBiTree(); //创建二叉树int JudgeBinary(BiTree T); //判断是否是二叉排序树int main(){ BiTree T; T

2021-06-07 21:55:59 706

原创 NOJ数据结构023——构造哈希表

直接上代码:#include<stdio.h>#include<stdlib.h>#define NUM_DATA 8#define NUM_HASHTABLE 11typedef struct { int data; int flag;//记录查找所需次数}HashTable; //哈希表节点HashTable* CreateHashNode(int data, int flag); //构建哈希表节点int HashFunction(int dat..

2021-06-05 16:26:11 466

原创 NOj数据结构实验011——用弗洛伊德算法求赋权图中任意两点间的最短路径

本题与上题思路基本一致。设置一个二维数组P,将每一条最短路径上起点的后驱记录下来即可。#include <stdio.h>#include <stdlib.h>#define MAX_VER_NUM 20typedef struct { int vertex[MAX_VER_NUM]; int weight[MAX_VER_NUM][MAX_VER_NUM]; int num_vex;//弧的个数用不上}AdjMatrix;int TargetPath[..

2021-05-25 13:09:59 995

原创 NOJ数据结构实验010——用弗洛伊德算法求赋权图的两点间的最短路径的

本题主要考察弗洛伊德算法的应用。#include <stdio.h>#include <stdlib.h>#define MAX_VER_NUM 20typedef struct { int vertex[MAX_VER_NUM]; int weight[MAX_VER_NUM][MAX_VER_NUM]; int num_vex;//弧的个数用不上}AdjMatrix;int TargetPath[MAX_VER_NUM];//记录所求路径AdjMa.

2021-05-25 10:13:09 816

原创 NOJ数据结构实验009——用迪杰斯特拉算法求赋权图中的最短路径

本题是以上一道题为基础的提高,但我们需要求出给出的最短路径,需要多设置一个数组TargetPath记录。代码:#include <stdio.h>#include <stdlib.h>#define MAX_VER_NUM 20typedef struct { int vertex[MAX_VER_NUM]; int weight[MAX_VER_NUM][MAX_VER_NUM]; int num_vex;//弧的个数用不上}AdjMatrix;typ.

2021-05-24 00:21:21 1135

原创 NOJ数据结构实验008——求赋权图中一个结点到所有结点的最短路径的长度

本题要求使用邻接矩阵表示法,使用dijkstra算法求最短路径。代码:#include <stdio.h>#include <stdlib.h>#define MAX_VER_NUM 20typedef struct { int vertex[MAX_VER_NUM]; int weight[MAX_VER_NUM][MAX_VER_NUM]; int num_vex;//弧的个数用不上}AdjMatrix;typedef struct { int ..

2021-05-23 17:57:55 1254 1

原创 NOJ数据结构022——Dijkstra算法

本题要求使用dijkstra(迪杰斯特拉)算法,这是基于广度优先搜索的贪心算法。最后还要进行按路径从小到大的顺序输出。代码:#include <stdio.h>#include <stdlib.h>#define MAX_VER_NUM 2000typedef enum { DG, UDG, DN, UDN }GraphKind;typedef struct ArcNode{ int adjvex; struct ArcNode* nextarc; in..

2021-05-23 15:53:32 953

原创 有向无环图的关键路径(C语言)

用顶点表示事件,用弧表示活动,弧的权值表示活动所需要的时间,这样构造出来的有向无环图称为边表示活动的网简称AOE-网。AOE-网中存在唯一的、入度为0的顶点,称为源点,存在唯一的、出度为0的顶点,称为汇点。从源点到汇点的最长路径的长度即为完成整个工程任务所需的时间,该路径称为关键路径。关键路径上的活动称为关键活动。代码:#include <stdio.h>#include <stdlib.h>#define MAX_VER_NUM 2000typedef enum {

2021-05-22 16:24:56 331

原创 拓扑排序(C语言)

在一个有向无环图中,用顶点表示活动,用弧表示活动间的优先关系的有向无环图,称为顶点表示活动的网,简称AOV-网。对AOV-网,可用拓扑排序来得到他们顶点数据的优先关系,即拓扑序列。拓扑序列并不一定是唯一的。如下图:拓扑序列就有:acbfde、fadcbe等多种。拓扑序列需要用到栈。简单思路:1.先求出各顶点的入度,并将入度为0的顶点入栈。2.栈不空,则重复以下两步:①将栈顶顶点v出栈并打印②将顶点i的每一个邻接点k的入度减小1,若顶点k的入度变为0,则将k入栈代码:#includ

2021-05-21 23:56:43 959

原创 NOJ数据结构021——逆波兰表达式

本题要求采用有向无环图的邻接表表示,但我实在不会,参考其他大佬的做法,大部分都是用二叉树表示的(二叉树本身就是特殊的有向无环图),我也就用了二叉树表示(然后再换成邻接表?)。代码:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 2000typedef enum { charctor, operat }flag;//括号和字母为前, 运算符为后typedef st.

2021-05-21 12:53:35 941

原创 NOJ数据结构020——基于图的广度优先搜索策略

本题要求采用邻接表来表示图,图的广度优先搜索类似于树的层序遍历,本质上来说是树的按层次遍历的推广,其中需要用到队列。代码:#include <stdio.h>#include <stdlib.h>#define MAX_VERTEX_NUM 20//最多顶点数int visited[MAX_VERTEX_NUM];//遍历标志数组typedef enum { DG, UDG, DN, UDN }GraphKind;typedef struct ArcNode {.

2021-05-20 21:14:24 727

原创 NOJ数据结构019——基于图的深度优先搜索策略

图有多种构造方法,本题要求采用邻接表表示法。代码如下:#include <stdio.h>#include <stdlib.h>#define MAX_VERTEX_NUM 20//最多顶点数int visited[MAX_VERTEX_NUM];//遍历标志数组typedef enum { DG, DN, UDG, UDN }GraphKind;//图的种类,有向图,有向网,无向图,无向网typedef struct ArcNode { int adjve.

2021-05-18 18:38:58 739 3

原创 NOJ数据结构实验007——哈夫曼编/译码器

本题简单思路:1.先建立一棵哈夫曼树,在建立时需要将叶结点对应的字符记录在树中。2.我们需要建立一套译码系统,将叶结点中存储字符对应的译码存储到字符串数组hc中。建立时,我们需要从叶结点开始进行记录,即从下到上,我们将每次得到的译码先存储在字符串cd中(cd长度不会超过叶结点个数),并且时从cd最后(结束符\0前)开始记录(因为之前是反的,负负得正),之后整合在hc中。3.之后我们要在建立一套反译码系统。众所周知,哈夫曼编码是前缀编码,所以我们只需要将记录报文的字符串code与刚才字符串数组hc中每.

2021-04-30 23:46:48 3517 5

原创 构造哈夫曼树(C语言)

哈夫曼树又称最优树,即带权路径长度最小的二叉树。构造过程是典型的贪心算法,即每一步都求取最优情况使整体情况也达到最优。所以构造哈夫曼树时,应该让权重小的结点放在靠下的位置让权重大的放在较上的位置。代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 30 //叶子结点最大值#define M 2*N-1 //所有结点最大值typedef struct{ int

2021-04-30 10:49:29 1993 1

原创 洛谷P1229 遍历问题

学习二叉树相关知识时,看到书上写道:至少给定某棵二叉树的两种遍历顺序,才可以确定这棵二叉树。而给定先序与中序,或者后序与中序,都可以确定唯一二叉树,而若只给定先序与后序,是不一定可以唯一确定二叉树的。而我发现,洛谷上就有这样一道题。...

2021-04-29 21:26:34 211

原创 线索二叉树的建立与遍历(C语言)

当我们建立普通的二叉树时,无法找到它的前驱与后继结点,而通过线索化二叉树,我们则可以轻松实现以上算法。此处通过建立中序线索二叉树而实现了中序遍历。代码如下:#include<stdio.h>#include<stdlib.h>typedef struct Node{ char data; struct Node* LChild, * RChild; int Ltag, Rtag; //1表示前驱或后继}BiNode, * BiTree;BiTree Cr

2021-04-28 22:13:04 936

原创 二叉树层序遍历(C语言)

二叉树的层序遍历即从上到下,在每一层从左到右依次打印数据。如下:层序遍历结果:ABCDEFG基本思路即将根节点入队后,之后每次都将队首元素出队,打印队首元素数据,并将队首元素左右子树入队,一直重复上述过程。自然,本题还可以用数组来实现。代码:#include <stdio.h>#include <stdlib.h>#define QueueMax 100typedef struct Node{ char data; struct Node *

2021-04-25 22:22:01 6859 3

原创 遍历二叉树的非递归算法(C语言)

在遍历二叉树时,使用递归简单易懂,但会耗费更多的时间以及空间,可考虑使用消除递归的方法。一般我们用循环来代替递归,但在一些较为复杂的情况下,普通的循环已经难以支撑我们的需求。例如此种情况,我们用工作栈的方式来消除递归。下面是非递归的中序与后序遍历。输入时,以#表示取消子树建立。#include <stdio.h>#include <stdlib.h>#define StackMax 100typedef struct Node{ char data;

2021-04-25 20:23:09 1219 1

原创 NOJ数据结构018——建立二叉树的二叉链表

在本题中,给出中序遍历结果以及先序遍历结果或后序遍历才可以构建唯一二叉树,若给出先序和后序,则不唯一。本题思路即从左到右按顺序读取pre字符串,并在mid字符串中找到相应位置pos_m,在pos_m左边的字符串递归建立左子树,右边递归建立右子树。#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct Node{ char data; struct Node.

2021-04-25 12:41:18 945 1

原创 NOJ数据结构017——输出以二叉树表示的算术表达式

本题及考查二叉树的中序遍历。代码:#include <stdio.h>#include <stdlib.h>typedef struct Node{ char data; struct Node* LChild; struct Node* RChild;}BiNode, *BiTree;void CreateTree(BiTree *T); //创建二叉树void PrePrintTree(BiTree T); //先序输出int .

2021-04-24 00:26:04 356

原创 NOJ数据结构016——计算二叉树叶子结点数目

叶子结点就是无后继的结点,搞清楚这点我们就可以根据上一题的经验轻松写出本题。#include <stdio.h>#include <stdlib.h>typedef struct Node{ char data; struct Node *LChild; struct Node *RChild;}BiTNode, *BiTree;void CreateBinTree(BiTree *T); //创建二叉树int Getleaf(BiTre.

2021-04-23 23:50:13 693 2

原创 NOJ数据结构015——建立二叉树的二叉链表的存储结构

本题中无论建立还是遍历二叉树,都用到了递归思想,个人感觉跟广义表的建立有些像。代码如下:#include <stdio.h>#include <stdlib.h>typedef struct Node{ char data; struct Node *LChild; struct Node *RChild;}BiTNode, *BiTree; //定义二叉树void CreateBinTree(BiTree *T); //创建二叉树voi.

2021-04-23 18:05:50 539 3

原创 NOJ数据结构实验006——稀疏矩阵的乘法

本题并未想到更好的方法,只好依次遍历将矩阵a每一行与矩阵b相乘放到矩阵c中。上代码:#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef struct{ int row,col; /*非零元行下标、列下标*/ int data; /*非零元数据*/}Triple;typedef struct{ Triple elem[MAXSIZE]; /*非零..

2021-04-19 21:34:46 1413 1

原创 NOJ数据结构实验003——稀疏矩阵转置

本题要求使用三元组进行矩阵转置,方法有两种,列序递增转置以及一次定位快速转置。第一种方法思路简单,即将行列直接交换再进行排列,但占用空间较多,时间较慢。第二种方法耗时较短,思路简述为记录每一列元素个数在num数组中,以及将各列元素第一次出现位置在position数组中,以此进行快速转置。代码如下:#include <stdio.h>#include <stdlib.h>#define MAXSIZE 2000typedef struct{ int ro..

2021-04-17 23:16:26 2447

原创 NOJ数据结构014——求广义表的深度

广义表有两种存储结构,分别为头尾链表存储结构和同层结点链存储结构,此题使用了这两种方法来构建广义表,说实话,个人认为第二种方法更容易实现。话不多说,直接上代码。#include <stdio.h>#include <stdlib.h>#include <string.h>typedef enum {ATOM, LIST} ElemTag;//ATOM = 0,表示原子,LIST = 1表示子表typedef struct GLNode{ El.

2021-04-13 22:50:23 1157 1

原创 NOJ数据结构013——以十字链表为存储结构实现矩阵相加

本题是一道十分有挑战性的题目,反正我是被折磨了很久。。。#include <stdio.h>#include <stdlib.h>typedef struct Node{ int row, col; //非零元行列下标 int data; //非零元数据 struct Node *right, *down;//非零元行列后继链域}Node, *Link;typedef struct{ ..

2021-04-10 21:41:17 731 2

原创 NOJ数据结构012——以三元组为存储结构实现矩阵相加

本题练习三元组的应用。思路较为简单,即比较两个三元组a、b行数列数后进行排序。需要特别注意的是要考虑两个元素相加为0的情况,不能让这样的元素放在c中。#include <stdio.h>#include <stdlib.h>typedef struct{ int row,col; /*非零元行下标、列下标*/ int data; /*非零元数据*/}Triple;typedef struct{ Triple *elem; .

2021-04-10 00:00:52 547

原创 NOJ数据结构011——循环右移

本体使用循环队列,申请队列空间时推荐申请n个空间,即不多预留一个空间的方法来编写。如此更加简便,只需要移动front、rear两个指针的位置即可。代码:#include <stdio.h>#include <stdlib.h>typedef struct{ int *data; int front; int rear; int m;//队列目前长度 int n;//队列最长长度}SeqQueue;SeqQueue *seq;.

2021-04-08 18:24:43 700 1

原创 NOJ数据结构010——k阶斐波那契数列

k阶斐波那契数列简要描述:第0项到k-2项为0,第k-1项为1,之后每项都为前k项的和。代码如下:#include <stdio.h>#include <stdlib.h>typedef struct{ int *data; int front; int rear; int n;}SeqQueue;SeqQueue *seq;SeqQueue* CreateQueue(int k); //创建队列int .

2021-04-08 12:54:43 614

原创 NOJ数据结构009——循环队列

本题考查循环队列的应用。循环队列是队列的一种顺序表示和实现方法。可节省大量空间。本题中要求使用域变量rear(即队尾)和length(即队长)编写程序。这样做可规避一般循环队列的小缺陷,即不用预留一个空间来判断是否队满。#include <stdio.h>#include <stdlib.h>typedef struct { int *data; int rear; int length; int n;}QueueNode;Queu.

2021-04-07 13:10:42 939 3

原创 NOJ数据结构实验002——高精度计算PI值

题目及要求解题思路:使用泰勒展开将题目可视化。通过双向循环链表的存储结构计算a,即先算ka(k-1)再算ka(k-1)/(2k+1),并将此数据放入链表num中,之后将num与sum两个链表所表示的数据相加,不断重复上述过程,计算次数越多越精确。在本题中,笔者限于实力,只能先将PI值进行许多次计算,再在输出时截断至所需位数。这对时间或空间来说都是一场灾难。大佬则可根据下图来确定每次所需计算次数来节省时间和空间。代码:#include <stdio.h>#include <

2021-04-04 15:38:17 1933 1

原创 NOJ数据结构008——逆波兰式

C语言实现逆波兰式逆波兰式是数据结构中的重要内容,通过这个可以熟练栈的使用。本题可用单栈或双栈实现。此处笔者采用单栈的方法。基本思路是将输入的字符串in,通过遍历筛选按顺序输入字符串out中。遇到普通字符则直接输出到out中。遇到操作符,则比较其与栈顶字符间的优先级(栈为空则直接入栈),优先级比栈顶高才可入栈。操作符优先级即 *、/ 大于 +、- 大于 (,同级之间后来输入的大于之前输入的。遇到 ),则将栈中离其最近的一个( 两者之间的操作符全部输出到out中。最终遍历结束,若栈中仍有剩余

2021-04-01 22:36:50 1022 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除