C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作

文章目录

  • 写在前面
  • 哈夫曼树及哈夫曼编码的算法实现
    • 实验内容
    • 代码实现
  • 图的基本操作
    • 实验内容
    • 代码实现

写在前面

本篇实验代码非本人写,代码源自外部,经调试解决了部分warning和error后在本地vs上可以正常运行,如有运行失败可换至vs

未来会重构实现该两个实验


哈夫曼树及哈夫曼编码的算法实现

实验内容

内容要求:

1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立哈夫曼树
2、建立编码表(CreateTable):利用已经建好的哈夫曼树进行编码,并将每个字符的编码输出。
3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。
4、译码(Decoding):利用已经建好的哈夫曼树对编码后的字符串进行译码,并输出译码结果。

测试数据:
输入字符串“thisprogramismyfavourite”,完成这28个字符的编码和译码。

代码实现

#include<iostream>
#include<string.h>
#include<queue>
#define MAX 10000 
using namespace std;
char a[100], buff[1024], p;
typedef struct
{char letter, * code;int weight;int parent, lchild, rchild;
}HTNode, * HuffmanTree;int n;
char coding[100];int Min(HuffmanTree& HT, int i)
{int j;int k = MAX;int flag=0;for (j = 0; j <= i; ++j){if (HT[j].weight < k && HT[j].parent == 0){k = HT[j].weight;flag = j;}}HT[flag].parent = 1;return flag;
}void Select(HuffmanTree& HT, int i, int& s1, int& s2)
{s1 = Min(HT, i);s2 = Min(HT, i);
}void CreateHuffmanTree(HuffmanTree& HT, char t[], int w[])
{int m;int i, s1, s2;if (n <= 1)return;m = 2 * n - 1; HT = new HTNode[m + 1];for (i = 0; i < n; i++){char arr[] = "0";char* pa = arr;HT[i].code = pa;HT[i].parent = 0;HT[i].lchild = -1;HT[i].rchild = -1;HT[i].letter = t[i];HT[i].weight = w[i];}for (i = n; i <= m; i++){char arr[] = "0";char* pa = arr;HT[i].code = pa;HT[i].parent = 0;HT[i].lchild = -1;HT[i].rchild = -1;HT[i].letter = ' ';HT[i].weight = 0;}cout << "********************************" << endl;for (i = n; i < m; i++){Select(HT, i - 1, s1, s2);HT[s1].parent = i;HT[s2].parent = i;HT[i].lchild = s1;HT[i].rchild = s2;HT[i].weight = HT[s1].weight + HT[s2].weight;}
}void CreatHuffmanCode(HuffmanTree HT)
{int start, c, f;int i;char* cd = new char[n];cd[n - 1] = '\0';cout << "字符编码为:" << endl;for (i = 0; i < n; i++){start = n - 1;c = i;f = HT[i].parent;while (f != 0) {--start;if (HT[f].lchild == c) {cd[start] = '0';}else {cd[start] = '1';}c = f;f = HT[f].parent;}HT[i].code = new char[n - start];strcpy(HT[i].code, &cd[start]);cout << HT[i].letter << ":" << HT[i].code << endl;}delete[] cd;
}void HuffmanTreeDecode(HuffmanTree HT, char cod[], int b)  
{char sen[100];char temp[50];char voidstr[] = " ";int t = 0;int s = 0;int count = 0;for (int i = 0; i < b; i++){temp[t++] = cod[i];temp[t] = '\0';for (int j = 0; j < n; j++) {if (!strcmp(HT[j].code, temp)) {sen[s] = HT[j].letter;s++;count += t;strcpy(temp, voidstr);t = 0;break;}}}if (t == 0) {sen[s] = '\0';cout << "译码为:" << endl;cout << sen << endl;}else {cout << "二进制源码有错!从第" << count + 1 << "位开始" << endl;}
}int main()
{HuffmanTree HT;int b[100]={0};int i, j;int symbol = 1, x, k;cout << "请输入一段文字:";cin >> buff;int len = (int)strlen(buff);for (i = 0; i < len; i++){for (j = 0; j < n; j++){if (a[j] == buff[i]){b[j] = b[j] + 1;break;}}if (j >= n){a[n] = buff[i];b[n] = 1;n++;}}cout << "字符和权值信息如下" << endl;for (i = 0; i < n; i++){cout << "字符:" << a[i] << "  权值:" << b[i] << endl;}CreateHuffmanTree(HT, a, b);CreatHuffmanCode(HT);cout << "文字编码为:\n";for (int i = 0; i < len; i++){for (int j = 0; j < n; j++){if (buff[i] == HT[j].letter){cout << HT[j].code;break;}}}cout << "\n译码:" << endl;while (1){cout << "请输入要译码的二进制字符串,输入'#'结束:";x = 1;k = 0; symbol = 1;while (symbol) {cin >> p;if (p != '1' && p != '0' && p != '#') {x = 0;}coding[k] = p;if (p == '#')symbol = 0;k++;}if (x == 1) {HuffmanTreeDecode(HT, coding, k - 1);}else {cout << "有非法字符!" << endl;}cout << "是否继续?(Y/N):";cin >> p;if (p == 'y' || p == 'Y')continue;elsebreak;}return 0;
}

图的基本操作

实验内容

分别用邻接矩阵和邻接表对如下有向图实现:
1.输出存储结果;
2.计算各结点的出度和入度,并输出;
3.实现图的深度优先遍历和广度优先遍历,并输出。

在这里插入图片描述

代码实现

#include<stdio.h>
#include<stdlib.h>#define MAXVEX 50
int visit[MAXVEX];
int in_deg[MAXVEX];//入度
int out_deg[MAXVEX];//出度 typedef struct
{int vertices[MAXVEX];int arc[MAXVEX][MAXVEX];int vexnum, arcnum;
}MGraph;typedef struct queue
{int* pBase;int front, rear;
}QUEUE;void init_queue(QUEUE* Q)
{Q->pBase = (int*)malloc((sizeof(int)) * MAXVEX);Q->front = 0;Q->rear = 0;
}bool isfull_queue(QUEUE* Q)
{if (((Q->rear + 1) % MAXVEX) == Q->front)return true;elsereturn false;
}bool isempty_queue(QUEUE* Q)
{if (Q->rear == Q->front)return true;elsereturn false;
}void in_queue(QUEUE* Q, int val)
{if (isfull_queue(Q))return;Q->pBase[Q->rear] = val;Q->rear = (Q->rear + 1) % MAXVEX;
}int out_queue(QUEUE* Q)
{int temp = 0;if (isempty_queue(Q))return 0;temp = Q->pBase[Q->front];Q->front = (Q->front + 1) % MAXVEX;return temp;
}void BFS(MGraph G, QUEUE* Q, int v)
{if (!visit[v]) {visit[v] = 1;printf("%d  ", G.vertices[v]);in_queue(Q, v);}while (!isempty_queue(Q)) {int temp = out_queue(Q);for (int i = 0; i < G.vexnum; i++) {if (G.arc[temp][i] != 0 && !visit[i]) {visit[i] = 1;printf("%d  ", G.vertices[i]);in_queue(Q, i);}}}
}void BFST(MGraph G, QUEUE* Q)
{printf("\nBFS的遍历:");int i = 0;for (i = 0; i < G.arcnum; i++)visit[i] = 0;for (i = 0; i < G.vexnum; i++) {if (!visit[i])  BFS(G, Q, i);}
}int LocateVex(MGraph G, int v)
{for (int i = 0; i < G.vexnum; i++) {if (G.vertices[i] == v)return i;}return 0;
}void CreatMGraph(MGraph* G)
{int i = 0, j = 0;printf("请分别输入顶点数和边数: \n");scanf("%d%d", &(G->vexnum), &(G->arcnum));printf("请输入顶点信息:\n");for (i = 0; i < G->vexnum; i++)scanf("%d", &(G->vertices[i]));for (i = 0; i < G->vexnum; i++) {for (j = 0; j < G->vexnum; j++)G->arc[i][j] = 0;}printf("请输入构成边的两个顶点:  \n");for (i = 0; i < G->arcnum; i++) {int num, num1;scanf("%d%d", &num, &num1);int j = LocateVex(*G, num);int k = LocateVex(*G, num1);G->arc[j][k] = 1;}
}void PrintMGraph(MGraph G)
{printf("*************************\n");printf("邻接矩阵的遍历:\n");for (int i = 0; i < G.vexnum; i++) {for (int j = 0; j < G.vexnum; j++) {printf("%d  ", G.arc[i][j]);if (G.arc[i][j] != 0)out_deg[i]++;if (G.arc[j][i] != 0)in_deg[i]++;}printf("\n");}printf("*************************\n");
}void Print_in_out_deg(MGraph G)
{printf("\n*************************\n");printf("各顶点的度的遍历:\n");for (int i = 0; i < G.vexnum; i++) {printf("\n第%d条边的入度: %d 与出度: %d\n", i + 1, in_deg[i], out_deg[i]);}printf("*************************\n");
}void DFS(MGraph G, int v)
{visit[v] = 1;printf("%d  ", G.vertices[v]);for (int i = 0; i < G.vexnum; i++) {if (G.arc[v][i] != 0 && visit[i] == 0)DFS(G, i);}
}void DFST(MGraph G)
{printf("DFS的遍历:");for (int i = 0; i < G.vexnum; i++) {if (!visit[i])DFS(G, i);}
}int main()
{MGraph G;QUEUE Q;init_queue(&Q);CreatMGraph(&G);PrintMGraph(G);DFST(G);BFST(G, &Q);Print_in_out_deg(G);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/29752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、初识 Spring MVC

文章目录 一、初始 Spring MVC1.1 回顾 MVC 模式1.2 回顾 Servlet 一、初始 Spring MVC 什么是 Spring MVC Spring MVC就是一个 Spring 内置的 MVC 框架。 MVC框架&#xff0c;它解决WEB开发中常见的问题(参数接收、文件上传、表单验证、国际化等等)&#xff0c;而且使用…

Python web实战之细说Django的中间件

&#x1f511; 关键词&#xff1a;Python Web 开发、Django、中间件 今天分享Python Web开发中的一个重要成员&#xff1a;Django的中间件。介绍中间件的概念、作用及其在实战中的应用。 1 什么是中间件 在Python Web开发中&#xff0c;中间件&#xff08;Middleware&#xff…

vue中使用this.$refs获取不到子组件的方法,属性方法都为undefined的解决方法

问题描述 vue2中refs获取不到子组件中的方法&#xff1f;&#xff0c;而获取到的是undefined 原因及解决方案&#xff1a; 第一种、在循环中注册了很多个ref 因为注册了多个ref&#xff0c;获取是不能单单知识refs.xxx&#xff0c;需要使用数组和索引来获取具体一个组件refs[…

yolov5目标检测多线程C++部署

C多线程复习 下面的代码搭建了简单的一个生产者-消费者模型&#xff0c;在capture()函数中进行入队操作&#xff0c;infer()函数中进行出队操作&#xff0c;为了模拟采图-推理流程&#xff0c;在函数中调用Sleep()函数延时。 #include <iostream> #include <string&…

Rabbitmq的消息确认

配置文件 spring:rabbitmq:publisher-confirm-type: correlated #开启确认回调publisher-returns: true #开启返回回调listener:simple:acknowledge-mode: manual #设置手动接受消息消息从生产者到交换机 无论消息是否到交换机ConfirmCallback都会触发。 Resourceprivate Rabb…

adb用法,安卓的用户CA证书放到系统CA证书下

设备需root&#xff01;&#xff01;设备需root&#xff01;&#xff01;设备需root&#xff01;&#xff01; ​​​​​​​测试环境&#xff1a;redmi 5 plus、miui10 9.9.2dev&#xff08;安卓8.1&#xff09;、已root win下安装手机USB驱动&#xff08;过程略&#xff0c…

【Spring专题】Spring之底层架构核心概念解析

目录 前言前置知识课程内容一、BeanDefinition&#xff1a;图纸二、BeanDefinitionReader&#xff1a;图纸读取器——Spring工厂基础设施之一2.1 AnnotatedBeanDefinitionReader2.2 XmlBeanDefinitionReader2.3 ClassPathBeanDefinitionScanner 三、BeanFactory&#xff1a;生产…

关于在c++中使用数组名作为函数参数,或者使用数组名的地址作为函数参数问题的一些研究

前言 使用数组名作为函数参数&#xff0c;或者使用数组名的地址作为函数参数&#xff0c;常常出现于对于字符串的读入问题之中。 常有以下两种写法&#xff1a; 这是使用数组名作为函数参数 #include<cstdio> char s[100]; int main() {scanf("%s",s); }在…

Jmeter-获取接口响应头(Response headers)信息进行关联

文章目录 Jmeter-获取接口响应头&#xff08;Response headers&#xff09;信息进行关联使用正则表达式提取器将Set-Cookie的值提取出来在其余接口中关联该提取信息运行查看关联是否成功 Jmeter-获取接口响应头&#xff08;Response headers&#xff09;信息进行关联 获取某一…

重发布选路最佳实验

题目 IP地址配置 R1&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; 双点重发布 R2&#xff1a; rip 1 version 2 network 12.0.0.0 network 2.0.0.0 import-route ospf 1 ospf 1 import-route rip 1 route-policy R2 area 0.0.0.0 network 23.1.1.0 0.0…

ElasticSearch:环境搭建步骤

1、拉取镜像 docker pull elasticsearch:7.4.0 2、创建容器 docker run -id --name elasticsearch -d --restartalways -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e "discovery.typesingle-node" elasti…

腾讯云COS的快速接入

背景 最近在研究一个剪贴板粘贴工具&#xff0c;实现粘贴图片&#xff0c;返回可访问的地址&#xff0c;这个在我的哔哩哔哩上有出一期视频&#x1f92d;。但是&#xff0c;我发现部分博客平台不能正常的转载我的图片链接&#xff0c;于是研究了一下腾讯云的COS&#xff08;阿…

linux程序保护机制gcc编译选项

预备知识&#xff1a; 计算机内存的结构通常包括以下几个主要部分&#xff1a; 1.代码段(Code Segment)&#xff1a;也称为文本段&#xff0c;存储程序的可执行指令。代码段是被标记为可执行的&#xff0c;程序从代码段中获取指令并执行。 2.数据段(Data Segment)&#xff1a…

现代C++中的从头开始深度学习:【4/8】梯度下降

一、说明 在本系列中&#xff0c;我们将学习如何仅使用普通和现代C编写必须知道的深度学习算法&#xff0c;例如卷积、反向传播、激活函数、优化器、深度神经网络等。 在这个故事中&#xff0c;我们将通过引入梯度下降算法来介绍数据中 2D 卷积核的拟合。我们将使用卷积和上一个…

大数据技术之Hadoop:HDFS集群安装篇(三)

目录 分布式文件系统HDFS安装篇 一、为什么海量数据需要分布式存储 二、 分布式的基础架构分析 三、 HDFS的基础架构 四 HDFS集群环境部署 4.1 下载安装包 4.2 集群规划 4.3 上传解压 4.4 配置HDFS集群 4.5 准备数据目录 4.6 分发hadoop到其他服务器 4.7 配置环境变…

OpenStack监控工具

OpenStack是一个开源的云计算管理平台项目&#xff0c;是一系列软件开源项目的组合。由NASA和Rackspace合作研发并发起&#xff0c;以Apache许可证&#xff08;Apache软件基金会发布的一个自由软件许可证&#xff09;授权。 OpenStack为私有云和公有云提供可扩展的弹性的云计算…

Cadvisor+InfluxDB+Grafan+Prometheus(详解)

目录 一、CadvisorInfluxDBGrafan案例概述 &#xff08;一&#xff09;Cadvisor Cadvisor 产品特点&#xff1a; &#xff08;二&#xff09;InfluxDB InfluxDB应用场景&#xff1a; InfluxDB主要功能&#xff1a; InfluxDB主要特点&#xff1a; &#xff08;三&#…

·[K8S:使用calico网络插件]:解决集群节点NotReady问题

文章目录 一&#xff1a;安装calico&#xff1a;1.1&#xff1a;weget安装Colico网络通信插件&#xff1a;1.2&#xff1a;修改calico.yaml网卡相关配置&#xff1a;1.2.1&#xff1a;查看本机ip 网卡相关信息&#xff1a;1.2.2&#xff1a;修改calico.yaml网卡interface相关信…

深度解读|一站式ABI平台 Smartbi Insight V11 能力再升级

纵观过去&#xff0c;我们发现汽车和BI的发展有异曲同工之妙。 100来年&#xff0c;汽车的动力从蒸汽到燃油再到新能源&#xff0c;汽车的操控方式从手动到自动再到智能无人驾驶。而在BI领域&#xff0c;自1958年BI的概念提出后&#xff0c;底层数据准备从报表开发、Cube多维模…

【CI/CD】Git Flow 分支模型

Git Flow 分支模型 1.前言 Git Flow 模型&#xff08;本文所阐述的分支模型&#xff09;构思于 2010 年&#xff0c;也就是 Git 诞生后不久&#xff0c;距今已有 10 多年。在这 10 多年中&#xff0c;Git Flow 在许多软件团队中大受欢迎。 在这 10 多年里&#xff0c;Git 本身…