![](https://img-blog.csdnimg.cn/20210709105033200.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
文章平均质量分 93
且随疾风前行,身后亦需留心
小开心
“学习不是要沉醉于自己舒适区,而是要死磕”
展开
-
哈夫曼树的创建(详细步骤)
// 构造赫夫曼树#include <iostream>using namespace std;//哈夫曼树的存储表示typedef struct{ int weight; //节点的权值 int parent, lchild, rchild; //节点的双亲,左孩子和右孩子} HTNode, *HuffmanTree;//查处权值最小且双亲为0的2的节点void Select(HuffmanTree HT, int len, i原创 2020-08-03 17:41:21 · 12259 阅读 · 7 评论 -
计算二叉树的深度
[算法步骤]如果是空树,递归结束,深度为0;否则执行一下操作递归计算左子树的深度计为m;递归计算右子树的深度计为n;如果m大于n,二叉树的深度为m+1,否则为n+1;[算法描述]int Depth(BiTree T){ int m, n; if (T == NULL) return 0; //如果是空树,深度为0,递归结束 else { m = Depth(T->lchild); //递归计算左子树的深度记为m原创 2020-08-02 11:33:45 · 49685 阅读 · 18 评论 -
先序遍历的顺序建立二叉链表&&中序遍历二叉树T的递归算法
【算法步骤】扫描字符序列,读入字符ch.如果ch是一个“#”字符,则表明该二叉树为空数,即T为NULL;否则执行以下操作。申请一个节点空间T。将ch赋给T->date。递归创建T的左子数。递归创建T的左子数。创建二叉链表如图所示:代码如下:#include <iostream>using namespace std;typedef struct BiNode{ char date; //二叉链表的定义 struct BiNode *lchi原创 2020-07-31 21:52:06 · 13840 阅读 · 4 评论 -
二叉树的复制和求叶子节点的个数
//算法5.4 复制二叉树#include <iostream>using namespace std;//二叉树的二叉链表存储表示typedef struct BiNode{ char data; //结点数据域 struct BiNode *lchild, *rchild; //左右孩子指针} BiTNode, *BiTree;//建立二叉链表void CreateBiTree(BiTree &T){原创 2020-08-01 22:15:28 · 207 阅读 · 0 评论 -
复制二叉树
//算法5.4 复制二叉树#include <iostream>using namespace std;//二叉树的二叉链表存储表示typedef struct BiNode{ char data; //结点数据域 struct BiNode *lchild, *rchild; //左右孩子指针} BiTNode, *BiTree;//用算法5.3建立二叉链表void CreateBiTree(BiTree &原创 2020-08-01 18:35:39 · 3798 阅读 · 0 评论 -
求二叉树的节点个数
如果是空树,则结点个数为0,递归结束否则结点个数为左子树的结点个数+右子树的结点个数+1【算法描述】int NodeCount(BiTree T){ if (T == NULL) return 0; // 如果是空树,则结点个数为0,递归结束 else return NodeCount(T->lchild) + NodeCount(T->rchild) + 1; //否则结点个数为左子树的结点个数+右子树的结点个数+1}具体代原创 2020-08-03 17:19:55 · 17231 阅读 · 0 评论 -
二叉树的中序遍历的非递归算法&&用链栈进行压栈和出栈
//算法5.2 中序遍历的非递归算法#include <iostream>using namespace std;//二叉树的二叉链表存储表示typedef struct BiNode{ char data; //结点数据域 struct BiNode *lchild, *rchild; //左右孩子指针} BiTNode, *BiTree;//链栈的定义typedef struct StackNode{ B原创 2020-08-01 12:36:47 · 889 阅读 · 0 评论 -
队列的各种操作
/***循环队列基本操作***/#include<iostream>#include<fstream>using namespace std;#define MAXQSIZE 100#define OK 1#define ERROR 0#define OVERFLOW -2typedef char QElemType;typedef char SElemType;typedef int Status;typedef struct { QElemType原创 2020-08-07 21:36:07 · 362 阅读 · 0 评论 -
依次输出链表中的各个结点(递归)
/***依次输出链表中的各个结点***/#include<iostream>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef char ElemType;typedef struct LNode { ElemType data; //结点的数据域 LNode *next; //结点的指针域} LNode, *LinkList;//头指针原创 2020-08-07 17:57:47 · 1515 阅读 · 0 评论 -
/***链栈实现括号匹配***/
基本原理:在栈顶进行插入和删除,栈顶指针一直指着栈顶节点。链栈的基本操作:栈的初始化,进栈,出栈,判断栈是否为空。链栈解决的实际问题:本例是典型的括号匹配问题,功能比较粗简,但也基本能满足需求。括号匹配问题描述:假设表达式 {[]}[]是正确的格式 ,{[(])} 或 ()[]}} 均为错误格式 ,只单纯的考虑括号的匹配。问题解决思路:在判断函数中新建一个栈,对传入的字符串进行处理,如果遇到’(’、’[’、’{’ 则取出来入栈,遇到’)’、’]’、’}’ 则先判断栈是否为空,为空则退出,字符串出现原创 2020-08-09 11:57:01 · 1198 阅读 · 0 评论 -
链栈实现表达式求值
头文件:/***链栈实现表达式求值***/#include<iostream>using namespace std;const char oper[7] = { '+', '-', '*', '/', '(', ')', '#' };#define OK 1#define ERROR 0#define OVERFLOW -2typedef char SElemType;typedef int Status;typedef struct SNode { int data原创 2020-08-09 22:19:15 · 2478 阅读 · 2 评论 -
链队的基本操作
/***链队的基本操作***/#include<iostream>#include<fstream>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2typedef char QElemType;typedef int Status;typedef char SElemType;//- - - - - 队列的链式存储结构- - - - - typedef struct QNo原创 2020-08-08 11:29:31 · 1109 阅读 · 0 评论 -
链栈-详细代码解析
/***链栈的实现***/#include <fstream>#include <iostream>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef char SElemType;typedef struct StackNode{ SElemType data; struct StackNode *next;原创 2020-08-07 11:23:50 · 877 阅读 · 0 评论 -
链栈实现数制的转换
/***链栈实现数制的转换***/#include<iostream>using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef struct SNode { int data; struct SNode *next;} SNode, *LinkStack;Status InitStack(LinkStack &S) { S = N原创 2020-08-08 21:41:06 · 2383 阅读 · 1 评论 -
/***顺序栈的实现***/超级详细
/***顺序栈的实现***/#include <fstream>#include <iostream>using namespace std;//顺序栈定义#define OK 1#define ERROR 0#define OVERFLOW -2#define MAXSIZE 100 //顺序栈存储空间的初始分配量typedef int Status;typedef char SElemType;typedef struct{ SElemTyp原创 2020-08-06 21:15:27 · 410 阅读 · 0 评论 -
采用邻接矩阵表示法创建无向网
//算法 采用邻接矩阵表示法创建无向网#include <iostream>using namespace std;#define MaxInt 32767 //表示极大值,即∞#define MVNum 100 //最大顶点数#define OK 1 typedef char VerTexType; //假设顶点的数据类型为字符型 typedef原创 2020-08-07 17:17:07 · 5133 阅读 · 0 评论 -
采用邻接表表示法创建无向图
//采用邻接表表示法创建无向图#include <iostream>using namespace std;#define MVNum 100 //最大顶点数 #define OK 1typedef char VerTexType; //-==顶点信息typedef int OtherInfo; //和边相关的信息 //- - - - -图的邻接表存储表示- - - - - typedef struct A原创 2020-08-08 16:16:33 · 11256 阅读 · 1 评论 -
(8)设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素(mink和maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同 )。
(8)设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素(mink和maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同 )。【算法思想】 用一个节点pre保存pa的前驱,方便删除。具体流程完整代码运行结果完整代码#include <iostream>using namespace std;//定义存储typedef struct LNode{ int date; struct LNode *next;} Lnode, *Linkl原创 2020-08-04 18:04:21 · 4668 阅读 · 0 评论 -
设计一个算法,通过遍历一趟,将链表中所有节点逆转,仍利用原表的存储空间
【题目分析】利用前插法将元素逆转完整代码实现#include <iostream>using namespace std;//定义存储typedef struct LNode{ int date; struct LNode *next;} Lnode, *Linklist;//链表初始化void init(Linklist &L){ L = new Lnode; // 开辟空间 L->next = NULL; //头节点置为空原创 2020-08-04 17:35:16 · 6312 阅读 · 1 评论 -
设计一个算法,通过一趟遍历确定长度为n的但链表的中值的最大的节点
#include <iostream>using namespace std;//定义存储typedef struct LNode{ int date; struct LNode *next;} Lnode, *Linklist;//链表初始化void init(Linklist &L){ L = new Lnode; // 开辟空间 L->next = NULL; //头节点置为空}//输出数据void output(Li原创 2020-08-03 17:50:56 · 4570 阅读 · 0 评论 -
(5)设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,要求B、C表利用A表的结点
**【题目分析】:将小于0的节点利用后插法插入Lb中,pre保存着pa的前驱,当节点小于0时,进行pre->next=pa->next,则删除了小于0的元素。当节点大于0时,进行pra=pa,pa=pa->next,pre保存着pa的前驱。**【算法设计】void Resolve(Linklist &La, Linklist &Lb){ Linklist pre = La; Linklist pb = Lb; Linklist pa = La原创 2020-08-02 18:13:16 · 8997 阅读 · 3 评论 -
(4)已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B 的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。
(4)已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B 的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。[题目分析]求两个集合A和B的差集是指在A中删除A和B中共有的元素,即删除链表中的相应结点,所以要保存待删除结点的前驱,使用指针pre指向前驱结点。pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点,从第一个结点开始进行比较,当两个链表La和Lb均为到达表尾结点时,如果La表中的元素小于Lb表原创 2020-08-01 18:16:17 · 7877 阅读 · 6 评论 -
(3)已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出A与B的交集,并存放于A链表中。
(3)已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出A与B的交集,并存放于A链表中。[题目分析]只有同时出现在两集合中的元素才出现在结果表中,合并后的新表使用头指针Lc指向。pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点,从第一个结点开始进行比较,当两个链表La和Lb均为到达表尾结点时,如果两个表中相等的元素时,摘取La表中的元素,删除Lb表中的元素;如果其中一个表中的元素较小时,删除此表中较小的元素,此表的工作指针后移。当链表La和Lb有一个到达表尾结点,为原创 2020-07-31 22:40:48 · 12778 阅读 · 0 评论 -
(2)将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。
(2)将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。[题目分析]合并后的新表使用头指针Lc指向,pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点,从第一个结点开始进行比较,当两个链表La和Lb均为到达表尾结点时,依次摘取其中较小者重新链接在Lc表的表头结点之后,如果两个表中的元素相等,只摘取La表中的元素,保留Lb表中的元素。当一个表到达表尾结点,为空时,将非空表的剩余元素依次摘取,链接原创 2020-07-29 22:03:19 · 8143 阅读 · 8 评论 -
(1)将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。
将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据。[题目分析]合并后的新表使用头指针Lc指向,pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点,从第一个结点开始进行比较,当两个链表La和Lb均为到达表尾结点时,依次摘取其中较小者重新链接在Lc表的最后。如果两个表中的元素相等,只摘取La表中的元素,删除Lb表中的元素,这样确保合并后表中无重复的元素。当一个表到达表尾结点,为空时,将非空表的剩余元原创 2020-07-28 22:25:30 · 20991 阅读 · 5 评论