![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
『西工大-数据结构-NOJ』
文章平均质量分 62
西北工业大学的数据结构NOJ题目、代码、与解析。
_LanXiu
西北工业大学 2018届 计算机学院 计算机科学与技术专业 本科在读
展开
-
『西工大-数据结构-NOJ』 018-建立二叉树的二叉链表(严6.65) 『西北工业大学』
通过前序序列和中序序列我们可以知道根节点,之后使用递归的方法构建二叉树的二叉链表,进而输出二叉树后序序列原创 2023-06-10 17:25:21 · 431 阅读 · 0 评论 -
『西工大-数据结构-NOJ』 026-二叉排序树的合并(严9.38) 『西北工业大学』
解题思路:这道题要求实现两个二叉搜索树的合并。跟二叉树有关的题其实都不是很难,合理使用递归的思想去构造相关函数即可。这道题,其实可以转化为将一个二叉搜索树的全部元素插入到另一个二叉搜索树中,这样利用NOJ-025构造的插入函数就可以很容易的完成了。//因为我们无法将指针变量的本身传入函数,因此直接将指针传入函数可能会造成无效的处理//因为在C语言中,所有非数组形式的数据实参均以传值形式调用(对实参做一备份并传递给调用的函数,函数不能修改作为实参实际变量的值,而只能修改传递给它的那份备份)//..原创 2020-07-11 21:59:09 · 3015 阅读 · 0 评论 -
『西工大-数据结构-NOJ』 025-二叉排序树的插入和删除(严9.35、9.36和9.37) 『西北工业大学』
解题思路:这道题要求对二叉排序树实现搜索、插入和删除操作。跟二叉树有关的题其实都不是很难,合理使用递归的思想去构造相关函数即可。//因为我们无法将指针变量的本身传入函数,因此直接将指针传入函数可能会造成无效的处理//因为在C语言中,所有非数组形式的数据实参均以传值形式调用(对实参做一备份并传递给调用的函数,函数不能修改作为实参实际变量的值,而只能修改传递给它的那份备份)//此时我们通常有如下两种办法://1.通过return返回,例如 BT *T; T = creat(); ( BT *cr..原创 2020-07-11 21:52:30 · 2047 阅读 · 1 评论 -
『西工大-数据结构-NOJ』 024-二叉排序树的判别(耿8.6) 『西北工业大学』
解题思路:这道题要求用判别输入的二叉树是否为二叉排序树。跟二叉树有关的题其实都不是很难,合理使用递归的思想去构造相关函数即可。二叉排序树,即需要满足(T->left->data)<=(T->data)<=(T->right->data)即可。(这道题好像题库有点问题,直接printf(“yes”)就能通过)//因为我们无法将指针变量的本身传入函数,因此直接将指针传入函数可能会造成无效的处理//因为在C语言中,所有非数组形式的数据实参均以传值形式调用(..原创 2020-07-11 21:43:21 · 2095 阅读 · 2 评论 -
『西工大-数据结构-NOJ』 023-构造哈希表(耿8.12) 『西北工业大学』
解题思路:这道题要求对给定关键字序列使用哈希映射函数,并运用线性探测再散列法构造该关键字序列的哈希表,并求出查找成功的平均查找长度。这道题还是比较简单,没有复杂的数据结构要求和算法,只要对哈希算法比较了解,知道线性探测再散列法,这道题就比较简单了。具体操作见代码,代码中有部分注释。题解代码:#include <stdio.h>#include <stdlib.h>#define DATANUM 8#define HASHTABLENUM 11typedef ..原创 2020-07-11 00:52:49 · 2229 阅读 · 0 评论 -
『西工大-数据结构-NOJ』 022-Dijkstra算法(耿7.42) 『西北工业大学』
解题思路:这道题要求使用邻接来作为储存结构,使用Dijkstra算法计算源点到其余各点的最短距离,无法到达时令距离为-1.了解一下Dijkstra算法:而根据题目预期的Output来看,输出数据是按照最短路径升序输出的,因此我们还要对数据进行一次排序,最短路径升序优先,其次是目标点序号,之后将最短路径为-1的放在最后输出。具体操作见代码,代码中有部分注释。题解代码:#include<stdio.h>#include<stdlib.h>#define MAX..原创 2020-07-10 23:31:44 · 2626 阅读 · 0 评论 -
『西工大-数据结构-NOJ』 021-逆波兰表达式(耿7.38) 『西北工业大学』
解题思路:这道题要求使用有向无环图的邻接表来储存一个算术表达式(中缀表达式),并以逆波兰式(后缀表达式)的形式输出。这道题把波兰式转换与有向无环图的邻接表结合起来考察,波兰式转换是经典的栈的运用题,我实在是没想到怎么用有向无环图的邻接表来储存,只好采用了同为有向无环图的二叉树来储存算术表达式。赋与运算符优先级,以优先级最低的符号作为根节点,左右子串分别递归生成左右子树,来构造二叉树,之后递归进行后序遍历输出即可。代码中去除外层多余的括号的函数也很关键,这是构造子树的一个前提。具体操作见代码,代..原创 2020-07-10 23:14:46 · 3171 阅读 · 0 评论 -
『西工大-数据结构-NOJ』 019-基于图的深度优先搜索策略(耿7.10) 『西北工业大学』
解题思路:这道题要求使用邻接表的形式储存有向图,再用深度优先的搜索策略,判断是否存在vi到vj的路径。邻接表的宏定义大致如下:深度优先策略,即DFS,要用递归的方式去完成纵向遍历。具体操作见代码,代码中有部分注释。题解代码:#include<stdio.h>#include<stdlib.h>#define MAX 200#define FALSE 0#define TRUE 1typedef struct EdgeNode{ int end..原创 2020-07-09 01:50:02 · 2203 阅读 · 3 评论 -
『西工大-数据结构-NOJ』 017-输出以二叉树表示的算术表达式(耿6.51) 『西北工业大学』
解题思路:这道题要求通过给出的先序遍历二叉树的数据,构造二叉树,并输出其算术中缀表达式,即输出二叉树的中序遍历。二叉树部分知识比较简单好理解,就是要注意二叉树的操作均需要递归完成。其实我一般习惯是先给存储结构申请空间,用void函数对存储结构进行操作的,但是这个题在读取输入字符前无法确定是否需要申请空间,于是我选择在函数内申请空间。具体操作见代码,代码中有部分注释。题解代码:#include<stdio.h>#include<stdlib.h>typedef s..原创 2020-07-06 18:11:23 · 1583 阅读 · 0 评论 -
『西工大-数据结构-NOJ』 016-计算二叉树叶子结点数目(耿6.14) 『西北工业大学』
解题思路:这道题要求通过给出的前序遍历二叉树的数据,构造二叉树,并求出其叶子节点的数目。二叉树部分知识比较简单好理解,就是要注意二叉树的操作均需要递归完成。其实我一般习惯是先给存储结构申请空间,用void函数对存储结构进行操作的,但是这个题在读取输入字符前无法确定是否需要申请空间,于是我选择在函数内申请空间。具体操作见代码,代码中有部分注释。题解代码:...原创 2020-07-06 14:33:29 · 1428 阅读 · 0 评论 -
『西工大-数据结构-NOJ』 015-建立二叉树的二叉链表存储结构(严6.70) 『西北工业大学』
解题思路:这道题要求将输入的基本单元形如 ROOT(left,right)格式的数据以二叉树的形式储存(看代码注释),并以先序遍历输出。二叉树部分知识比较简单好理解,就是要注意二叉树的创建遍历等操作均需要递归完成。具体操作见代码,代码中有部分注释。题解代码:#include<stdio.h>#include<stdlib.h>typedef struct BinTreeNode{ char data; struct BinTreeNode *lef..原创 2020-07-05 23:33:58 · 1914 阅读 · 0 评论 -
『西工大-数据结构-NOJ』 013-以十字链表为存储结构实现矩阵相加(严5.27) 『西北工业大学』
解题思路:这道题要求用十字链表的储存结构储存稀疏矩阵,并进行加法运算。首先我们要了解一下为什么要用十字链表,对于一个稀疏矩阵,尤其是高维度时,如果以多维数组的形式开辟空间,会造成很大的不必要空间浪费,于是我们用十字链表,只存储稀疏矩阵中的非零元素,来达到储存稀疏矩阵的目的。当要进行矩阵的加、减、乘等运算时,有时非零元素的位置会发生很大的变化,三元组表为保持以行或列序为主而需要大量移动元素。但十字链表就比较灵活,它在三元组表的基础之上多了两个指针域,指向同一行中的下一个非零元素和同一列的下一个非零元..原创 2020-07-05 21:22:50 · 2324 阅读 · 4 评论 -
『西工大-数据结构-NOJ』 012-以三元组表为存储结构实现矩阵相加(耿5.7) 『西北工业大学』
解题思路:这道题要求用三元组表的储存结构储存稀疏矩阵,并进行加法运算。首先我们要了解一下为什么要用三元组表,对于一个稀疏矩阵,尤其是高维度时,如果以多维数组的形式开辟空间,会造成很大的不必要空间浪费,于是我们用三元组表,只存储稀疏矩阵中的非零元素,来达到储存稀疏矩阵的目的。常见的三元组和三元组表的宏定义如下:typedef struct{//定义三元组 int i,j; int val;}Triple;typedef struct{//定义三元组表 Triple *..原创 2020-07-04 22:35:38 · 2382 阅读 · 3 评论 -
『西工大-数据结构-NOJ』 011-循环右移(耿5.2) 『西北工业大学』
解题思路:这道题要求对于一个数组进行循环移位操作,讲真这是我在这门课的NOJ中遇到的我认为最简单的一个题了。没啥需要考虑的思路,输入数组,for循环进行k次右移,输出数组就OK了。具体操作见代码,代码中有部分注释。题解代码:#include<stdio.h>#include<stdlib.h>void CreatArray(int a[], int n){ for(int i=0;i<n;i++){ scanf("%d",&a..原创 2020-07-04 01:16:54 · 1714 阅读 · 0 评论 -
『西工大-数据结构-NOJ』 010-k阶斐波那契数列(严3.32) 『西北工业大学』
解题思路:这道题要求使用循环队列求斐波那契数列不大于max的最后k项的值。循环列表通常情况包含以下结构:typedef struct node{ int *data; int front; int rear; int N;}Queue;void CreatQueue(Queue *Q, int n)void AddElem(Queue *Q, int num)int Pop(Queue *Q)int Push(Queue *Q)这道题,难道..原创 2020-07-04 00:51:59 · 1852 阅读 · 1 评论 -
『西工大-数据结构-NOJ』 009-循环队列(严3.30) 『西北工业大学』
解题思路:这道题要求对一个循环队列,进行入队、出队和判满等操作,我们先了解一下比较常规的循环队列。以下是一个常见的循环队列的宏定义:typedef struct { int *base; // 初始化的动态分配存储空间 int front; // 头指针,若队列不空,指向队列头元素 int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置} SqQueue;然而,我们这道题要求的循环队列没有front成员,而是增加了length成员,这其实也无妨,..原创 2020-07-03 22:49:09 · 2755 阅读 · 0 评论 -
『西工大-数据结构-NOJ』 006-LOCATE操作(严2.38) 『西北工业大学』
解题思路:这道题要求使用双向链表储存一组数据,并且每个数据带有一个freq值,我们每次LOCAET访问某个数据,其freq值会自增,最后我们按照freq值由大到小的顺序保存链表,并输出。这道题我们首先要了解双向链表的创建,之后对其进行一个简单的自增,和一次简单的冒泡排序就可以输出数据了。但是既然这道题是以双向链表的形式储存,我们还是要想着去利用和完善一下双向链表的特殊性质的,代码中有一段主函数没使用的排序函数,是一个排序的思路,可惜好像有点问题不能正常运行,仅提供思路。具体操作见代码,代码中有部..原创 2020-07-03 09:40:06 · 2536 阅读 · 3 评论 -
『西工大-数据结构-NOJ』 005-单链表的删除(严2.29) 『西北工业大学』
这道题跟数据结构NOJ-003一模一样,下面是第三题的链接。https://blog.csdn.net/LanXiu_/article/details/107094831原创 2020-07-03 00:19:40 · 1652 阅读 · 0 评论 -
『西工大-数据结构-NOJ』 004-单链表的归并(耿2.11) 『西北工业大学』
解题思路:这道题要求将两个非递减有序的线性表(其实就是广义递增)合并为一个非递增(其实就是广义递减)链表,且使用原链表的节点储存,即只能有常数量级的额外空间开销。既然要倒序输出,我们有限考虑头插法完成新链表。这道题在合并的过程中我们加一个新头节点,就很好解决了。我们令新头节点为A链表的头节点,然后再新的头节点后依次插入节点即可。具体操作见代码,代码中有部分注释。题解代码:#include <stdio.h>#include <stdlib.h>typedef s..原创 2020-07-02 23:08:52 · 2500 阅读 · 0 评论 -
『西工大-数据结构-NOJ』 003-顺序表的删除(严2.29) 『西北工业大学』
解题思路:这道题要求对三个非递减有序的线性表(其实就是广义递增)中的A表进行删除操作,需删除的元素为B、C表中均出现的元素。我们比较好想到的一种方法,使用一个数组去储存重复元素,再进行去重操作,这种方式在重复率比较理想的情况下也不会造成太多的储存花销。具体操作见代码,代码中有部分注释。题解代码:#include <stdio.h>#include <stdlib.h>typedef struct node{ int data; struct nod..原创 2020-07-02 22:35:57 · 3813 阅读 · 2 评论 -
『西工大-数据结构-NOJ』 002-线性表的就地逆置(耿2.9) 『西北工业大学』
解题思路:这道题要求用数组和单链表两种储存形式完成线性表就地逆置的算法,即只能有常数量级的空间开销。数组的拟制很简单,就从中间分开前后交换,注意元素个数为奇偶时中间位置的计算。单链表采用头插法,将原链表顺序插入即的到其逆序结果,画图可使链表算法更好理解。具体操作见代码,代码中有部分注释。题解代码:#include <stdio.h>#include <stdlib.h>//以数组作为储存结构void CreatArray(int n, int A[]){//创..原创 2020-07-02 22:35:18 · 2714 阅读 · 5 评论 -
『西工大-数据结构-NOJ』 001-顺序表的插入运算(耿2.4) 『西北工业大学』
解题思路:这道题要求在线性表上进行操作,我们可以使用顺序表或者链表,因为比较熟悉链表,我们以链表为例,之后也有用数组实现的简易方法。已知线性表为递增序且知道内容与元素个数,我们需要进行一次遍历并新元素插入即可。创建和输出链表没什么特别的,就是插入时要关注一下边界点的完善。具体操作见代码,代码中有部分注释。题解代码:链表实现:#include <stdio.h>#include <stdlib.h>typedef struct node{ int dat..原创 2020-07-02 22:34:40 · 3942 阅读 · 1 评论