1、沈阳航空工业学院 数据结构与软件方法实验指导书 1实验一 学生成绩管理系统设计一、问题描述某班有 30 个学生,每个学生的只要信息包含学号、姓名、各科(计算机、英语、数学等)成绩。要求通过计算机对这些数据信息进行管理,设计出一个学生成绩管理系统。二、实验目的1、掌握线性表的基本运算(插入、删除、修改等) 。2、进一步学习 C 语言程序设计方法与技巧。三、实验内容与要求学生信息表如下学号 姓名 计算机 英语 数学98032001 李华 85 65 9798032002 王平 87 70 9098032003 张小娟 76 76 8898032004 赵静 95 85 76 98032030 王海
2、 89 90 781、 要求同学们首先建立学生的姓名、学号、课程表,将每个学生的姓名、学号录入,成绩下来后根据学号将录入每人的成绩;2、 班上若有退学或留级的,将删除该学生的信息;3、 若有新插入本班的则将该学生的信息加到该表中;4、 日常可能由于各种原因需要浏览所有学生的成绩信息,也有可能修改学生信息。5、 以上所有的功能都是随机的。需要设计一个合理的输入输出界面或者功能菜单。四、相关算法与分析学生成绩管理系统设计主要涉及到的是数据结构中线性表的相关知识,包括线性表的插入、删除、查找等基本运算,该实验正是课本中相关内容的综合。学生在实验中首先设计一个合理的输入输出界面,然后将各种运算应用到程
3、序中就可以。线性表的基本运算可以采用顺序存储结构实现也可以采用链式存储结构实现。下面给出了设计的参考范例。#include “stdafx.h“#include “stdlib.h“沈阳航空工业学院 数据结构与软件方法实验指导书 2#include “string.h“#define maxlen 100typedef struct studentchar name10,no10;int math,eng,comp;elemtype;/*/*以下是线性表顺序存储结构的插入算法 begin*/*/int insert(elemtype a,int *n,int i,elemtype x)int
4、j;if(i*n)printf(“n when insert, the position is invalid“);return 0;else if(*n=maxlen-1)printf(“n the list is full!“);return 0;elsefor(j=*n-1;j=i;j-) aj+1=aj;/元素后移ai=x; /插入元素(*n)+; /表长加 1return 1;/*/*线性表顺序存储结构的插入算法 end*/*/*#/*线性表顺序存储结构的删除算法 begin*/*/int del(elemtype a,int *n,int i)int j;沈阳航空工业学院 数据结构
5、与软件方法实验指导书 3if(i*n-1)printf(“n when del, the position is invalid!“);return 0;elsefor(j=i+1;j=0 /定义 maze 用于存放迷宫int move82; /定义 move 存放走步增量int markM+1N+1; / mark 矩阵用于存放标志位int s1003; /定义栈 s,用于存放每一走步的/行、列坐标及进入方向int top=0; /top 为栈 s 的栈顶指针int i,j,k,g,h; /k 表示走步的方向int flag=1; /flag 为一个标志,值为 0 时表示无通路。maze 矩
6、阵初始化;move 矩阵初始化;mark 矩阵初始化 0; 置当前位置的初始值为迷宫的入口处;mark11=1; i=1;j=1; 探测从当前位置向东(k=0)开始,按 k 值的递增顺序依次探测各方位; 若所探测位置的 maze 及 mark 值均为 0,则进入该位置,并记下原位置的行、列坐标及进入该位置的方位(k 的值) ,即这三个值入栈; 重复执行步骤 2 和步骤 3; 若探测各方向均无通路,则从所在位置沿原路后退一步,即执行出栈操作,并改变探测方位(k 的值) ,再重复执行步骤 2 和步骤 3,寻找其它通路; 重复步骤 2 到 5,直到走到迷宫出口(找到通路)或退回迷宫(无通路) 。若栈
7、不为空,则栈中保存的就是一条迷宫的通路。五、实验进一步的要求及思考题1、思考迷宫中四方位和八方位搜索的差别2、能否找出迷宫中所有的通路,能否在所有的通路中找出路径最短的路3、可以采用其它数据结构实现,队列可以吗?沈阳航空工业学院 数据结构与软件方法实验指导书 10实验三 哈夫曼算法一、问题的描述哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。哈夫曼算法的应用之一就是哈夫曼编码。利用哈夫曼编码进行通讯可以大大提高信道利用率,缩短传输时间,降低成本,这要求在发送端通过一个编码系统将传输的数据预先编码,在接收端通过一个译码系统对传来的数据进行译码( 复原) ,对于双向传输信息的信道,每端都一
8、个完整的编码译码系统,试为这样的收发站写一个哈夫曼的编码译码系统。二、实验目的1、掌握哈夫曼算法本质、了解哈夫曼编码及应用2、熟习 C 程序编程,掌握程序设计的技巧三、实验内容和要求1、该实验难度较大,要求学生要掌握哈夫曼算法本质及程序实现哈夫曼算法,即用 C语言实现生成最优二叉树。2、对于哈夫曼编码部分,学生视自己的个人情况掌握,有能力的同学要实现一个哈夫曼的编码译码系统。四、相关算法及分析哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为 0 层,叶结点到根结点的路径长度为叶结点的层数) 。树的带权路
9、径长度记为WPL=(W1*L1+W2*L2+W3*L3+.+ Wn*Ln),N 个权值 Wi(i=1,2,.n)构成一棵有 N 个叶结点的二叉树,相应的叶结点的路径长度为 Li(i=1,2,.n)。可以证明哈夫曼树的 WPL 是最小的。沈阳航空工业学院 数据结构与软件方法实验指导书 11构造哈夫曼树的算法如下:1)对给定的 n 个权值W1,W2,W3,.,Wi,.,Wn 构成 n 棵二叉树的初始集合F=T1,T2,T3,.,Ti,., Tn,其中每棵二叉树 Ti 中只有一个权值为 Wi 的根结点,它的左右子树均为空。2)在 F 中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树
10、的根结点的权值为其左右子树的根结点的权值之和。3)从 F 中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合 F 中。4)重复 2)和 3) ,直到集合 F 中只有一棵二叉树为止。这里给出构造哈夫曼树的算法。出于简单性考虑,构造的哈夫曼树不是采用链式存储,而是以数组方式存储,其中使用数组位置索引标识节点的链接。对于哈夫曼树中的节点其数据类型如下:typedef struct QHTNodechar c; /存储的数据,为一个字符double weight; /节点权重int parent;/父节点在数组中的位置索引int lchild;/左孩子在数组中的位置索引int rchild;/
11、右孩子在数组中的位置索引HTNode;构造哈夫曼树的算法的实现原理如下:对于 n 个叶子节点,我们根据上面的定理构造出大小为 2*n-1 的数组来存放整个哈夫曼树。这个数组的前 n 个位置存放的为已知的叶子节点,后(n-1)个位置存放的为动态生成的树内节点。在算法的大循环过程中,要做的事情就是根据位置 i 前面的已知节点(或者是叶节点或者是生成的树内节点) ,找出 parent 为1(即节点尚且是一个子树的根结点)的节点中权值最小的两个节点,然后根据这两个节点构造出位置为 i 的新的父节点(也就是一棵新树的根结点) 。程序如下:void creatHuffmanTree(HTNode ht,i
12、nt n)int i,j;int lchild,rchild;double minL,minR;for(i=0;i#include#include6、 #define NUMBER 4typedef structunsigned int weight;unsigned int parent, lchild, rchild;HTNode, *HuffmanTree;/最小数int _min(HuffmanTree ht, int i)int j=0;int temp=0;for(j = 0; jweight = *w;p-parent = 0;p-lchild = 0;p-rchild = 0;
13、for(; iweight = 0;p-parent = 0;p-lchild = 0;p-rchild = 0;for(i = n; im; +i)沈阳航空工业学院 数据结构与软件方法实验指导书 18min = _min(ht, i);sec_min = _sec_min(ht, i);htmin.parent = htsec_min.parent = i; hti.lchild = min; hti.rchild = sec_min;hti.weight = htmin.weight + htsec_min.weight;printf_HuffmanTree(ht, n);int main()HuffmanTree ht;int weightNUMBER;int i=0;for(; iNUMBER; +i)scanf(“%d“, Huffmancoding(ht, weight, NUMBER);return 0;沈阳航空工业学院 数据结构与软件方法实验指导书 19