1、数据结构实验报告说明:本软件在 win7 64 位系统测试通过,需要安装 .net 3.5 以上版本七、数制转换问题1.问题描述对于输入的任意一个非负十进制整数,输出与其等值的其他进制数(二进制、八进制或十六进制)。2.任务要求 建立模型,确定存储结构; 对任意十进制数,实现进制转换问题。 3.实验指导(1) 实验类型:设计实验。本实验要求同学们针对“数制转换”这个经典的问题,应用栈的存储结构,自己设计一个方案,并上机实现。此实验的目的是培养学生对数据结构的简单应用能力。(2) 预备知识:栈的基本定义、栈的基本操作算法、栈的存储结构。(3) 实现方法提示:1) 以十进制转换为八进制为例。将十进
2、制数整除 8,计算过程中得到的余数依次进栈,按出栈序列输出栈中的内容即为与输入的十进制数对应的八进制数。设 Conversion 函数执行数制转换的操作,对(1348) 10 转换为 8 进制的过程如下:N N div 8 N mod 81348 168 4168 21 021 2 52 0 22) 设计数制转换的算法。4.实现方案1) 方案描述:本方案采用语言实现,实现十进制与其他进制直接的转换2) 实现代码:主要实现代码如下using System;using System.Collections.Generic;using System.ComponentModel;using Syst
3、em.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace 进制转换器public partial class MainFrm : Formpublic MainFrm()InitializeComponent();private void MainFrm_Load_1(object sender, EventArgs e)txtStart.Focus();/ / 十进制转换为八进制/ / / private void radio_dto_Click_1(object sender, E
4、ventArgs e)txtEnd.Text = “;if (txtStart.Text.Length != 0)/ TODO: 十进制转为八进制。Int32 i;tryi = Convert.ToInt32(txtStart.Text.Trim();lblTitle.Text = “十进制转为八进制“;txtEnd.Text = Convert.ToString(i, 8);catchMessageBox.Show(“请输入合法的十进制数“, “提示“, MessageBoxButtons.OK, MessageBoxIcon.Warning);elseMessageBox.Show(“请提
5、供转换数据!“, “提示“, MessageBoxButtons.OK, MessageBoxIcon.Warning);txtStart.Focus();/ / 十进制转换为十六进制/ / / private void radio_dth_Click(object sender, EventArgs e)txtEnd.Text = “;if (txtStart.Text.Length != 0)/ TODO: 十进制转换为十六进制。Int32 i;tryi = Convert.ToInt32(txtStart.Text.Trim();lblTitle.Text = “十进制转换为十六进制“;
6、txtEnd.Text = Convert.ToString(i, 16);catchMessageBox.Show(“请输入合法的十进制数“, “提示“, MessageBoxButtons.OK, MessageBoxIcon.Warning);elseMessageBox.Show(“请提供转换数据!“, “提示“, MessageBoxButtons.OK, MessageBoxIcon.Warning);txtStart.Focus();/ / 十进制转换为二进制/ / / private void radio_dtb_Click(object sender, EventArgs e
7、)txtEnd.Text = “;if (txtStart.Text.Length != 0)/ TODO: 十进制转换为二进制。Int32 i;tryi = Convert.ToInt32(txtStart.Text.Trim();lblTitle.Text = “十进制转换为二进制“;txtEnd.Text = Convert.ToString(i, 2);catchMessageBox.Show(“请输入合法的十进制数“, “提示“, MessageBoxButtons.OK, MessageBoxIcon.Warning);elseMessageBox.Show(“请提供转换数据!“,
8、 “提示“, MessageBoxButtons.OK, MessageBoxIcon.Warning);txtStart.Focus();/ / 八进制到十进制/ / / private void radio_otd_Click(object sender, EventArgs e)txtEnd.Text = “;if (txtStart.Text.Length != 0)/ TODO: 八进制到十进制。trylblTitle.Text = “八进制到十进制“;txtEnd.Text = Convert.ToString(Convert.ToInt32(txtStart.Text.Trim(
9、), 8);/八进制转为十进制catchMessageBox.Show(“请提供合法的八进制数“, “提示“, MessageBoxButtons.OK, MessageBoxIcon.Warning);elseMessageBox.Show(“请提供转换数据!“, “提示“, MessageBoxButtons.OK, MessageBoxIcon.Warning);txtStart.Focus();/ / 十六进制到十进制/ / / private void radio_htd_Click(object sender, EventArgs e)txtEnd.Text = “;if (txt
10、Start.Text.Length != 0)try/ TODO: 十六进制到十进制。lblTitle.Text = “十六进制到十进制“;txtEnd.Text = Convert.ToString(Convert.ToInt32(txtStart.Text, 16);catchMessageBox.Show(“请提供合法的十六进制数!“, “提示“, MessageBoxButtons.OK, MessageBoxIcon.Warning);elseMessageBox.Show(“请提供转换数据!“, “提示“, MessageBoxButtons.OK, MessageBoxIcon.
11、Warning);txtStart.Focus();/ / 二进制到十进制/ / / private void radio_btd_Click(object sender, EventArgs e)txtEnd.Text = “;if (txtStart.Text.Length != 0)try/ TODO: 二进制到十进制。lblTitle.Text = “二进制到十进制“;txtEnd.Text = Convert.ToString(Convert.ToInt32(txtStart.Text, 2);catchMessageBox.Show(“请提供合法的二进制数!“, “提示“, Mes
12、sageBoxButtons.OK, MessageBoxIcon.Warning);elseMessageBox.Show(“请提供转换数据!“, “提示“, MessageBoxButtons.OK, MessageBoxIcon.Warning);txtStart.Focus();private void reset_Click(object sender, EventArgs e)txtStart.Text = “;txtEnd.Text = “;txtStart.Focus();private void close_Click(object sender, EventArgs e)t
13、his.Close();3) 测试过程:1. 不输入数据,软件会温馨提示2输入数据选择转换模式3.测试完成,结果正确十四、Huffman 编码1.问题描述设某编码系统共有 个字符,使用频率分别为 ,设计一个不等长的编码方案,n12,.n输出每个字符对应的编码,使得该编码系统的空间效率最好。2.任务要求 掌握 Huffman 树的概念、特点和存储结构; 掌握 Huffman 树的构造算法; 运用 Huffman 树解决编码问题。 3.实验指导(1) 实验类型:设计实验。本实验要求同学们针对“Huffman 树”这个经典的问题,应用二叉树这种数据结构,自己设计一个解决方案,并上机实现。此实验目的是
14、培养学生对数据结构的简单应用能力。(2) 预备知识:二叉树的定义、二叉树的基本操作算法。(3) 实现方法提示:1) 以字符出现的次数 为权值, 个结点作为根结点分别构成 棵二叉树;12,.n n2) 所有二叉树中选取两棵根结点权值最小的树作为左右子树构造一棵新二叉树,新二叉树根结点的权值为左右子树上根结点的权值之和,并删除原先的两棵二叉树;3) 重复上述步骤,直到只剩一棵二叉树为止。4) Huffman 树的存储结构如下:structunsigned int weight;unsigned int parent, lchild, rchild;HTNode, *HuffmanTree;4.实现
15、方案1) 方案描述:本方案采用语言实现数据的 Huffman 编码与解码2) 实现代码:主要实现代码如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Collections.Specialized;namespace HuffmanCodepublic partial class Form1 : Fo
16、rmclass Nodepublic char code;public uint prioirry;public Node lchild;public Node rchild;public Form1()InitializeComponent();private Dictionary dictcode = new Dictionary();private Node huffTree;private int comparisonNode(Node n1, Node n2)return (int)(n1.prioirry - n2.prioirry);private string encode(s
17、tring str)dictcode.Clear();huffTree = null;if (string.IsNullOrEmpty(str)return “;Dictionary priorityQueue = new Dictionary();for (int i = 0; i listpc = new List();foreach (var item in priorityQueue)listpc.Add(new Node()prioirry = item.Value, lchild = null, rchild = null, code = item.Key);listpc.Sort
18、(comparisonNode);while (listpc.Count 1)Node n = new Node();n.prioirry = listpc0.prioirry + listpc1.prioirry;n.lchild = listpc0;n.rchild = listpc1;listpc.RemoveAt(0);listpc.RemoveAt(0);int index = -1;for (int i = 0; i listpc.Count; i+)if (n.prioirry = listpci.prioirry)index = i;break;if (index = -1)i
19、ndex = listpc.Count;listpc.Insert(index, n);string encodestr = “;viewTree(listpc0, “);huffTree = listpc0;for (int i = 0; i str.Length; i+)encodestr += dictcodestri;return encodestr;private void viewTree(Node n, string v)if (n.code != 0)dictcode.Add(n.code, v);elseif (n.lchild != null)string vl = v +
20、 “0“;viewTree(n.lchild, vl);if (n.rchild != null)string vr = v + “1“;viewTree(n.rchild, vr);private string decode(string str)Node root = huffTree;string result = “;for (int i = 0; i str.Length; i+)if (root.code != 0)result += root.code.ToString();root = huffTree;if (stri = 0)root = root.lchild;elser
21、oot = root.rchild;if (root.code != 0)result += root.code.ToString();return result;private void button1_Click_1(object sender, EventArgs e)textBox2.Text = encode(textBox1.Text);private void button2_Click_1(object sender, EventArgs e)textBox3.Text = decode(textBox2.Text);private void button3_Click(object sender, EventArgs e)this.Close();private void button4_Click(object sender, EventArgs e)textBox1.Text = “;textBox2.Text = “;textBox3.Text = “;4) 测试过程:1. 输入任意数据,选择编码,输出结果 Huffman 编码2. 输入刚才的 Huffman 编码,选择解码,则解码结果为原始数据3. 测试完成。