电子科技大学软件技术基础实验报告4

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电子科技大学通信与信息工程学院标准实验报告

(实验)课程名称软件技术基础实验

电子科技大学教务处制表

电子科技大学

实验报告

一、实验室名称:校公共机房

二、实验项目名称:二叉树和哈夫曼树

三、实验学时:4学时

四、实验原理:

使用VS2010等C语言集成开发环境(IDE),在微型计算机上对程序进行编辑、编译、连接与运行。通过上机练习掌握二叉树的建立、插入删除,遍历等方法和过程,掌握递归函数在二叉树建立,遍历中的应用,掌握哈夫曼树的最小路径和建立过程。

五、实验目的:

1.熟练二叉树和哈夫曼树的概念和基本操作方法。

2.掌握课程平台使用方法。

六、实验内容:

上机完成所有函数,编程实验,调试运行程序并完成报告。

七、实验器材(设备、元器件):

硬件要求:普通pc机,1G内存,100G硬盘空间即可。

软件要求:Windows 7,包括C编译器的IDE。

八、实验步骤、实验编程与运行结果:

下面建立该二叉树并展示输出结果:

#include

#include

typedef struct bnode

{

int data;

struct bnode *lc,*rc;

};

struct bnode* create()

{

struct bnode *tree=NULL;

char ch;

ch=getchar();

if(ch=='_')

tree=NULL;

else

{

tree=(struct bnode *)malloc(sizeof(struct bnode));

tree->data=ch;

tree->lc=create();

tree->rc=create();

}

return tree;

}

//先序遍历(根左右)--递归

int preorder(struct bnode *root)

{

putchar(root->data);

if(root->lc!=NULL)

preorder(root->lc);

if(root->rc!=NULL)

preorder(root->rc);

}

//中序遍历--递归

int inorder(struct bnode *root)

{

if(root->lc!=NULL)

inorder(root->lc);

putchar(root->data);

if(root->rc!=NULL)

inorder(root->rc);

}

//后序遍历--递归

int postorder(struct bnode *root)

{

if(root->lc!=NULL)

postorder(root->lc);

if(root->rc!=NULL)

postorder(root->rc);

putchar(root->data);

}

int main()

{

struct bnode *root=NULL;

printf("先序建立二叉树,输入变量: (下划线为NULL):");

root=create(); //输入(ABC DE G F )

printf("先序遍历输出:");

preorder(root);

printf("\n");

printf("中序遍历输出:");

inorder(root);

printf("\n");

printf("后序遍历输出:");

postorder(root);

printf("\n");

}

下面建立该二叉树并展示输出结果:

#include

#include

struct hftree

{

int data;

struct hftree *left;

struct hftree *right;

};

struct hftree *CreateHuffman(int a[], int n)

{

int i, j;

struct hftree *b[100], *q;//假设哈弗曼书最大为100个节点

for (i = 0; i < n; i++) //初始化b指针数组,使每个指针元素指向a数组中对应的元素结点{

b[i]=(struct hftree*)malloc(sizeof(struct hftree));

b[i]->data=a[i];

b[i]->left=NULL;

b[i]->right=NULL;

}

for (i = 1; i < n; i++)//进行n-1 次循环建立哈夫曼树

{

//k1表示森林中具有最小权值的树根结点的下标,k2为次最小的下标

int k1 = -1, k2;

for (j = 0; j < n; j++)//让k1初始指向森林中第一棵树,k2指向第二棵

{

if (b[j] != NULL && k1 == -1)

{

k1 = j;

continue;

}

if (b[j] != NULL)

{

k2 = j;

break;

}

}

for (j = k2; j < n; j++)//从当前森林中求出最小权值树和次最小

{

if (b[j] != NULL)

{

if (b[j]->data < b[k1]->data)

{

k2 = k1;

k1 = j;

}

else if (b[j]->data < b[k2]->data)

k2 = j;

}

}

//由最小权值树和次最小权值树建立一棵新树,q指向树根结点

q = (struct hftree*)malloc(sizeof(struct hftree));

q->data = b[k1]->data + b[k2]->data;

q->left = b[k1];

q->right = b[k2];

b[k1] = q;//将指向新树的指针赋给b指针数组中k1位置

b[k2] = NULL;//k2位置为空

}

free(b); //删除动态建立的数组b

return q; //返回整个哈夫曼树的树根指针

}

//求哈夫曼树的带权路径长度

int WeightPathLength(struct hftree* T, int len)//len初始为0

{

if (T == NULL) //空树返回0

相关文档
最新文档