数据结构
Laura2017
这个作者很懒,什么都没留下…
展开
-
树、二叉树、森林的转换
树、森林、二叉树的转换树变二叉树树变二叉树的规则:每个结点的左指针指向它的第一个孩子结点。右指针指向它在树中的相邻兄弟结点。 也即:左孩子右兄弟。 根没有兄弟,所以转换以后的树没有右子树。具体操作:在兄弟之间连线对每一个结点,只保持它与第一个子结点(长子)的连线,与其他子结点的连线全部抹去。以树根为轴心,顺时针旋转45度。二叉树变树二叉树变树的规则:是树变二叉树的逆过程。问:二叉树可以变成各种各样...原创 2018-06-26 16:58:11 · 1642 阅读 · 1 评论 -
rear和length表示的循环队列
描述假设将循环队列定义为:以与变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。试给出此循环队列的队满条件,并写出相应的入队列和出队列的算法(在出队列的算法中要返回队头元素)。 输入先输入一个不大于100的正整数n(输入数据个数)和m(循环队列数组的大小),再输入n个整数,其中输入0表示出队。 输出要求用循环队列实现,队满时如有入队则输出"No"并丢掉此元素,出队时输出这...原创 2018-06-23 19:43:37 · 3565 阅读 · 0 评论 -
用括号法递归建立二叉树
描述如果用大写字母标识二叉树节点,则一棵二叉树可以用以下字母序列建立,#表示空节点。试写一个递归算法,有这种形式的字符序列,建立相应的二叉树的二叉链表存储结构,并按层次遍历输出。如一棵二叉树可表示为:A(B(#,D),C(E(#,F),#)) 输入按题中要求,用括号法输入二叉树序列,#表示空节点 输出按层次遍历建立好的二叉树并输出 输入样例A(B(#,D),C(E(#,F),#)) 输出样例ABC...原创 2018-06-21 00:02:26 · 4989 阅读 · 0 评论 -
二叉排序树的判别(耿8.6)
Description试编写程序,判别给定的二叉树是否为二叉排序树。设此二叉树以二叉链表作存储结构,且树中结点的关键字均不同。Input按先序输入二叉树各结点(结点值大于0),其中-1表示取消建立子树结点。Output若该二叉树为二叉排序树,则输出yes;否则,输出no。Sample Input 12 8 4 -1 -1 10 -1 -1 16 13 -1 -1 18 -1 -1Sample Ou...原创 2018-05-24 19:54:05 · 1312 阅读 · 0 评论 -
二叉排序树的合并(严9.38)
Description试编写程序,将两棵二叉排序树合并为一棵二叉排序树。Input按照先序序列,分两行输入两棵二叉排序树各结点(结点值大于0),其中-1表示取消建立子树结点。Output按照中序序列输出合并后的二叉排序树。Sample Input 12 8 4 -1 -1 10 -1 -1 16 13 -1 -1 18 -1 -117 6 2 -1 -1 9 -1 -1 24 19 -1 -1 ...原创 2018-05-24 22:45:51 · 4989 阅读 · 1 评论 -
二叉排序树的插入和删除(严9.35、9.36和9.37)
Description假设二叉排序树以后继线索链表作存储结构,编写程序,满足以下要求:输出该二叉排序树中所有大于a小于b的关键字;在二叉排序树中插入一个关键字;在二叉排序树中删除一个关键字。Input第一行按先序输入二叉排序树各结点(结点值大于0),其中-1表示取消建立子树结点;第二行输入要求1中a、b,用空格隔开;第三行输入要求2中要插入的关键字;第四行输入要求3中要删除的关键字。Output按...原创 2018-05-24 22:30:01 · 2366 阅读 · 0 评论 -
构造哈希表(耿8.12)
Description选取哈希函数H(k)=(3k)%11,用线性探测再散列法处理冲突。试在0-10的散列地址空间中,编写程序,对关键字序列 (22,41,53 46,30,13,01,67)构造哈希表,并求等概率情况下查找成功的平均查找长度。Input无Output输出等概率情况下查找成功的平均查找长度。Sample Input 无Sample Output2#include <stdio...原创 2018-05-24 16:38:05 · 2717 阅读 · 0 评论 -
背包问题的递归和非递归算法
/**简单背包问题问题定义:有一个背包重量是S,有n件物品,重量分别是W0,W1...Wn-1问能否从这n件物品中选择若干件放入背包中使其重量之和正好为S*/#include <iostream>#include <algorithm>#include <vector>#include <string>using namespac...转载 2018-06-23 19:43:29 · 1824 阅读 · 0 评论 -
用弗洛伊德算法求赋权图的两点间的最短路径的长度
Description用弗洛伊德算法求任意两点间的最短路径的长度Input先输入一个小于100的正整数n,然后输入图的邻接矩阵(10000表示无穷大,即两点之间没有边),之后再输入一个小于100的正整数m,最后的m行每行输入两个不同的0到n-1之间的整数表示两个点。Output用弗洛伊德算法求任意两点间的最短路径的长度,并输出这些两个点之间的最短路径的长度。 Sample...原创 2018-05-23 23:47:00 · 1394 阅读 · 0 评论 -
Dijkstra算法(严7.42)
Description编写程序,实现以邻接表作存储结构,求从源点到其余各顶点的最短路径的Dijkstra算法。Input第一行输入顶点数n和边数m;第二行输入顶点信息;分m行输入m对顶点vi,vj(表示由顶点vi到顶点vj(i不等于j)的边)以及该弧的权值。(0<m,n<100)Output输出从源点到其余各顶点的最短路径(不可达用-1表示)。Sample Input 6 111 2...原创 2018-05-23 18:28:07 · 1595 阅读 · 0 评论 -
逆波兰表达式(严7.38)
Description一个四则运算算术表达式以有向无环图的邻接表方式存储,每个操作数原子都由单个字母表示。编写程序输出其逆波兰表达式。Input输入四则运算算术表达式。Output输出其逆波兰表达式。Sample Input (a+b)*cSample Outputab+c*这个题要求是用有向无环图,老师说可以不用,我就没用~前面写的那个逆波兰代码大概是有点问题,过不了这道题,所以改了一下……#i...原创 2018-05-23 17:30:30 · 2594 阅读 · 2 评论 -
汉诺塔的递归解法
void Hanoi (int n, char x, char y, char z){ if (n = = 1) move(x, 1, z); else { Hanoi (n-1, x, z, y); move (x, n, z); Hanoi (n-1, y, x, z); } }其实2阶汉诺塔相当于执行了三大步骤: 1.在ACB的顺序下执...原创 2018-06-23 19:43:45 · 220 阅读 · 0 评论 -
约瑟夫环问题(Josephus问题)链表实现
描述设有N名同学手拉手围成一圈,自1、2、3、......开始编号,现从1号开始连续数数,每数到M将此同学从圈中拉走, 求最后被拉走的同学的编号 输入两个正整数,分别为N和M。0<N<=100 ;0<M<65535 输出一个正整数,为最后被拉走的同学的编号,最后输出回车 输入样例5 3 输出样例41.单循环链表实现#include<stdio.h>#inclu...原创 2018-06-23 19:42:56 · 576 阅读 · 0 评论 -
稀疏矩阵的转置(矩阵转置和快速转置)
原理是:如果能预先确定矩阵M中每一列(即T中每一行)的第一个非零元在b.data中(上面那图是b.data)恰当位置。那么在对a.data中的三元组一次做转置时,便可直接放到b.data中恰当的位置上去。设两个向量:num和cpotnum[col]表示矩阵M中第col列中的非零元素个数。cpot[col]指M中第col列的第一个非零元在b.data中的恰当位置。有下面两个公式:cpot[0]=0;...原创 2018-06-23 19:43:52 · 30460 阅读 · 3 评论 -
求二叉树第K层结点个数
描述如果按照二叉树的顺序存储结构,逐个输入二叉树的结点值,(即按从上到下、从左至右的顺序,逐个输入结点值,对于空结点使用0表示),则一棵二叉树可以被一个序列唯一表示,如A表示一棵只有根结点的二叉树;A#C表示一个深度为2、根结点左子树为空的二叉树。请根据输入的二叉树的序列,创建二叉链表,并根据输入的层数L,计算并输出二叉树第L层结点的个数。 输入第一行为二叉树中非空结点的个数K及要查找的层数L,1...原创 2018-06-29 19:42:44 · 10311 阅读 · 0 评论 -
快速排序和二分查找及其他
快速排序:#include <stdio.h>#include <stdlib.h>void Swap(int *a,int *b){ int tmp; tmp = *a; *a = *b; *b = tmp;}void QuickSort(int a[],int left,int right){ if(left...原创 2018-06-29 15:52:00 · 496 阅读 · 1 评论 -
平衡二叉树的四种调整方式和注意事项
原创 2018-06-23 19:38:12 · 1937 阅读 · 0 评论 -
稀疏矩阵的三种存储方法
一,相关概念㈠特殊矩阵:矩阵中存在大多数值相同的元,或非0元,且在矩阵中的分布有一定规律。⒈对称矩阵:矩阵中的元素满足 aij=aji 1≤i,j≤n⒉三角矩阵:上(下)三角矩阵指矩阵的下(上)三角(不包括对角线)中的元素均为常数c或0的n阶矩阵。⒊对角矩阵(带状矩阵):矩阵中所有非0元素集中在主对角线为中心的区域中。㈡稀疏矩阵:非0元素很少(≤ 5%)且...转载 2018-06-23 19:44:06 · 25873 阅读 · 0 评论 -
关键路径
1、拓扑排序的意义?举个例子先:一个软件专业的学生学习一系列的课程,其中一些课程必须再学完它的基础的先修课程才能开始。如:在《程序设计基础》和《离散数学》学完之前就不能开始学习《数据结构》。这些先决条件定义了课程之间的领先(优先)关系。这个关系可以用有向图更清楚地表示。图中顶点表示课程,有向边表示先决条件。若课程i是课程j的先决条件,则图中有弧<i,j>。若要对这个图中的顶点所表示的课...转载 2018-06-23 16:06:47 · 3685 阅读 · 0 评论 -
拓扑排序
/* 邻接表存储 - 拓扑排序算法 */ bool TopSort( LGraph Graph, Vertex TopOrder[] ){ /* 对Graph进行拓扑排序, TopOrder[]顺序存储排序后的顶点下标 */ int Indegree[MaxVertexNum], cnt; Vertex V; PtrToAdjVNode W; Queu...原创 2018-06-23 15:14:25 · 154 阅读 · 0 评论 -
图的最小生成树:Prim算法和Kruskal算法
1. 图的最小生成树生成树的定义:如果连通图G的一个子图是一棵包含G的所有顶点的树,则该子图称为G的生成树。 生成树是连通图的包含图中的所有顶点的极小连通子图。它并不唯一,从不同的顶点出发进行遍历,可以得到不同的生成树。其中,权值最小的树就是最小生成树。关于最小生成树最经典的应用模型就是城市通信线路网最小造价的问题:网络G表示n个城市之间的通信线路(其中顶点表示城市,边表示两个城市之...原创 2018-06-22 21:33:44 · 1322 阅读 · 0 评论 -
Reversing Linked List
Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4,...原创 2018-06-23 19:43:22 · 173 阅读 · 0 评论 -
双向循环链表基本操作(初始化,插入,删除,清空,销毁,访问前驱,后继等)
#include "stdio.h"#include <malloc.h>#define OK 1#define ERROR 0#define OVERFLOW -1#define TRUE 1#define FALSE 0typedef ...转载 2018-06-23 19:43:13 · 5895 阅读 · 0 评论 -
一元多项式的表示及相加
如题:采用链式存储结构,将两个线性链表表示的一元多项式相加,并输出。实现程序:#include <stdio.h>#include <stdlib.h>#include <malloc.h>typedef struct node{ float coef;//系数 int expn;//指数 struct node *next;}...原创 2018-06-23 19:43:04 · 1986 阅读 · 1 评论 -
最大子列和问题
给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子...原创 2018-06-23 19:42:46 · 163 阅读 · 0 评论 -
用迪杰斯特拉算法求赋权图中的最短路径
Description用迪杰斯特拉算法求一点到其余所有结点的最短路径。Input先输入一个小于100的正整数n,然后输入图的邻接矩阵(10000表示无穷大,即两点之间没有边),最后输入两个0到n-1的整数表示两个点。Output先用迪杰斯特拉算法求给定的第一个点到其余所有结点的最短路径。然后再输出给定的两个点之间的最短路径(按顺序输出最短路径上的每一个点,每个数据占一行)。...原创 2018-05-21 23:20:21 · 2096 阅读 · 1 评论 -
逆波兰式(耿3.8)
Description假设表达式由单字母变量和双目四则运算算符构成。试编写程序,将一个通常书写形式且书写正确的表达式转换为逆波兰式。Input输入由单字母变量和双目四则运算算符构成的表达式。Output输出其逆波兰式。Sample Input (a+b)*cSample Outputab+c*code:#include<stdio.h> #include<stdlib.h&g...原创 2018-04-13 15:45:07 · 1381 阅读 · 0 评论 -
表达式括号匹配(严3.19)
Description假设一个算术表达式中可以包含三种括号:圆括号“( ”和“ )”、方括号“ [ ”和“ ] ”和花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…)。编写判别给定表达式中所含括号是否正确配对出现的程序(已知表达式已存入数据元素为字符的顺序表中)。Input输入算术表达式,换行结束。Output若给定表达式中所含括号正确配对,...原创 2018-04-13 15:43:55 · 1069 阅读 · 0 评论 -
高精度计算PI值
问题描述:限制使用双向链表作存储结构,请根据用户输入的一个整数(该整数表示精确到小数点后的位数,可能要求精确到小数点后500位),高精度计算PI值。可以利用反三角函数幂级展开式来进行计算。code:#include <stdio.h> #include <stdlib.h> #define MAX 1000 typedef struct Node { ...原创 2018-04-13 15:42:35 · 4995 阅读 · 9 评论 -
LOCATE操作(严2.38)
Description设有一个双向循环链表,每个结点中除有pre,data和next三个域外,还增设了一个访问频度域freq。在链表被起用之前,频度域freq的值均初始化为零,而每当对链表进行一次LOCATE(L,x)的操作后,被访问的结点(即元素值等于x的结点)中的频度域freq的值便增1,同时调整链表中结点之间的次序,使其按访问频度非递增的次序排列,以便始终保持被频繁访问的结点总是靠近表头结点...原创 2018-04-13 15:41:41 · 948 阅读 · 0 评论 -
线性表之单链表
#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; }LinkNode, *LinkList; LinkList Creat(LinkList head,int n) { Li...原创 2018-04-13 15:40:40 · 207 阅读 · 0 评论 -
线性表之顺序表
#include<stdio.h> #define MAXSIZE 100 #define OK 1 #define ERROR 0 typedef int ElemType; typedef struct { ElemType elem[MAXSIZE]; int last; }SeqList; void Initl...原创 2018-04-13 15:39:40 · 184 阅读 · 0 评论 -
稀疏矩阵的乘法
Description计算两个稀疏矩阵的乘法Input首先输入第一个矩阵的行数和列数,再输入该矩阵的三元组形式,以0 0 0结束然后输入第二个矩阵的行数和列数,再输入该矩阵的三元组形式,以0 0 0结束Output输出相加后的矩阵三元组。Sample Input 3 31 1 12 2 22 3 43 1 -40 0 03原创 2018-04-18 17:37:41 · 875 阅读 · 0 评论 -
稀疏矩阵加法,用十字链表实现C=A+B
Description输入两个稀疏矩阵,输出它们相加的结果。Input第一行输入四个正整数,分别是两个矩阵的行m、列n、第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数t2。接下来的t1+t2行是三元组,分别是第一个矩阵的数据和第二个矩阵的数据。三元组的第一个元素表示行号,第二个元素表示列号,第三个元素是该项的值。Output输出相加后的矩阵三原创 2018-04-18 17:36:51 · 1669 阅读 · 1 评论 -
以十字链表为存储结构实现矩阵相加(严5.27)
Description以十字链表为存储结构,编写程序,将稀疏矩阵B加到稀疏矩阵A上。Input第一行输入四个正整数,分别为稀疏矩阵A和稀疏矩阵B的行数m、列数n、稀疏矩阵A的非零元素个数t1和稀疏矩阵B的非零元素个数t2。接下来的t1+t2行三元组表示,其中第一个元素表示非零元素所在的行值,第二个元素表示非零元素所在的列值,第三个元素表示非零元素的值。Output原创 2018-04-18 17:35:47 · 961 阅读 · 1 评论 -
稀疏矩阵转置
Description输出稀疏矩阵的转置矩阵。(行列均不大于20)Input第一行输入两个正整数n和m,分别表示矩阵的行数和列数,然后输入矩阵三元组,最后输入(0 0 0)表示结束输入。Output转置后的矩阵。Sample Input 4 41 1 12 1 23 2 30 0 0Sample Output原创 2018-04-18 17:31:01 · 917 阅读 · 0 评论 -
k阶斐波那契数列(严3.32)
Description试利用循环队列编写k阶斐波那契数列中前n+1项 (f(0),f(1),…,f(n))的程序,要求满足: f(n)<=max而f(n+1)>max,其中max为某个约定的常数。(注意:本题所用循环队列的容量仅为k,则在程序执行结束时,留在循环队列中的元素应是所求k阶斐波那契序列中的最后k项 f(n-k+1),…,f(n))。Input输入常数max(0<max...原创 2018-04-13 15:46:14 · 1801 阅读 · 0 评论 -
循环队列(严3.30)
Description假设将循环队列定义为:以域变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。编写相应的入队列和出队列的程序,并判断循环队列是否队满(在出队列的算法中要返回队头元素)。Input第一行输入队列大小N,第二行开始输入若干入队元素,队满时,停止入队,队满时输出yes,否则输出no。第三行输入出队元素。Output输出出队操作后的循环队列,并返回出队后的队头...原创 2018-04-13 15:47:23 · 2131 阅读 · 0 评论 -
循环右移(耿5.2)
Description编写程序,将一维数组A(下标从1开始)中的元素循环右移k位,要求只用一个元素大小的附加存储。Input第一行输入一维数组A的长度n和循环位移位数k(0<n<100;0<k<100),用空格分开。第二行输入n个元素。Output输出循环右移k位后的一维数组。Sample Input 6 31 2 3 4 5 6 Sample Output4 5 6 1...原创 2018-04-13 15:48:04 · 594 阅读 · 0 评论 -
求赋权图中一个结点到所有结点的最短路径的长度
Description给一个赋权图(无向图),求0号结点到其余所有结点的最短路径的长度。Input先输入一个小于等于100的正整数n,然后输入赋权图的邻接矩阵(10000表示无穷大,并且任意一条简单路径的长度都小于10000)Output按结点编号的顺序输出0号结点所有结点的最短路径的长度。Sample Input 60 1 4 10000 10000 100001 0 2 7 5 10000...原创 2018-05-21 22:39:23 · 1551 阅读 · 0 评论