当前位置:文档之家› 数据结构迷宫课程设计

数据结构迷宫课程设计

华中科技大学文华学院数据结构课程设计报告学部:信息科学与技术学部专业班级:09级通信工程2班姓名:沈弋轩学号: 0901********指导教师:张采芳老师时间:2011.11.18实验一栈和队列的应用一、实验目的熟悉栈的定义和栈的基本操作. 熟悉队列的定义和栈的基本操作. 掌握递归和非递归算法的实现技术和实际应用. 加深对栈结构的理解,培养解决实际问题的编程能力。

二、实验内容完成迷宫问题求解。

三、实验基本原理所谓求迷宫问题,就是在一个指定的迷宫中求出从入口到出口的路径,在求解时,我们先从入口出发,顺某一方向向前试探,若能走通,则继续往前走,否则,沿原路退回,换一个方向再继续试探,直至所有可能的通路都试探完为止。

四、源程序及注释#include <stdio.h>#define Maxsize 500#define M 4#define N 4struct{int i,j,di; //当前方块行号、列号、下一可走相邻方位的方位号}qu[Maxsize],path[Maxsize]; //定义栈、最小路径存放int top=-1; //初始化栈顶指针int mgpath(int xi,int yi,int xe,int ye,int mg[M+2][N+2]) //求解路径为(xi.yi)->(xe,ye){ //此处放置前面顺序栈的定义int num=0;int i,j,k,di,find,minlenth=Maxsize;top++; //初始化栈qu[top].i=xi;qu[top].j=yi; //取栈顶方块qu[top].di=-1; //找到了出口,输出路径mg[1][1]=-1;printf("迷宫路径如下:\n");while(top>-1)//栈不为空时循环{i=qu[top].i;j=qu[top].j;di=qu[top].di;if(i==xe&&j==ye){num++;printf("第%d条路径:\n",num);for(k=0;k<=top;k++){path[k]=qu[k];printf("\t(%d,%d)",qu[k].i,qu[k].j);if((k+1)%5==0) //每输出5个方块后换一行printf("\n");}printf("\n\n");mg[qu[top].i][qu[top].j]=0;if(top+1<minlenth){minlenth=top+1;for(int c=0;c<=top;c++)path[k]=qu[k];}top--;i=qu[top].i;j=qu[top].j;di=qu[top].di;}find=0;while(di<=4&&find==0) //找(i,j)下一可走方块{di++; //找下一方位switch(di){case 0: i=qu[top].i-1; j=qu[top].j;break;case 1: i=qu[top].i; j=qu[top].j+1;break;case 2: i=qu[top].i+1; j=qu[top].j;break;case 3: i=qu[top].i; j=qu[top].j-1;break;}if(mg[i][j]==0) find=1; //找到下一可走相邻方块}if(find==1) //找到一可走相邻方块{qu[top].di=di; //修改原栈顶元素ditop++; //将可走相邻方块进栈qu[top].i=i;qu[top].j=j;qu[top].di=-1;mg[i][j]=-1; //值制为-1,避免重复走到该方块}else //没有相邻方块可走,退出栈{mg[qu[top].i][qu[top].j]=0; //该位置变为其他路径可走方向top--; //该方块退栈}}printf("路径条数:%d\n",num);printf("\n最短路径长度为:%d\n",minlenth);printf("\n最短路径为:\n");for(k=0;k<=minlenth;k++){printf("\t(%d,%d)",path[k].i,path[k].j);if((k+1)%5==0)printf("\n");}printf("\n");return(0); //没有可走路径,返回0}void main(){int i,j;int mg[M+2][N+2]={{1,1,1,1,1,1},{1,0,0,0,1,1},{1,0,1,0,0,1},{1,0,0,0,1,1},{1,1,0,0,0,1}};printf("迷宫图如下:\n");for(i=0;i<=M+1;i++){printf(" ");for(j=0;j<=N+1;j++)printf("%d ",mg[i][j]);printf("\n");}mgpath(1,1,M,N,mg); }五、实验结果分析六、调试和运行程序过程中产生的问题及采取的措施在调试的过程当中,对于最短路径和路径长度这一问题,书上都给出了例子,且在课件和书本的第三章都有一定的解释,这一问题我们可以依据书本的提示来解决,但若要输出所有的路径,我们就得另外进行考虑,全部输出,就是将内容逐一输出,沿着这一思路,在参考C语言以及C++的相关内容,得到我们可以用FOR语句来对其进行解决。

七、对课题相关算法的讨论、分析,改进设想本课题在一些问题上可以有多种算法,比如说,在输出所有路径这一问题上,我们就可以采用当型循环来做,但相对于当型循环,FOR语句循环比较方便,同时,在迷宫数组的中,我们也采用其他格式。

八、总结本次课题需要我们对问题做进一步的分析,且需要我们参考不同书本以及课外的相关知识,需要我们对其做进一步的融合,且本次课题中的每一步都有不同的问题,这就需要我们应用不同的知识来对其进行解决,总体来说,就是我们要应用不同的知识解决不同的问题,且要对其进行融合,来时不同的问题变成一个问题,不同的知识可以相互结合,来解决一个问题。

实验二赫夫曼编码及其应用一、实验目的掌握赫夫曼树的概念、存储结构掌握建立赫夫曼树和赫夫曼编码的方法及带权路径长度的计算熟练掌握二叉树的应用。

二、实验内容实现赫夫曼树的生成,完成赫夫曼编码的输出。

三、实验要求利用动态分配数组存储赫夫曼树,设计一组输入数据(假定为一组整数),能够对其进行如下操作:创建一个新的顺序表,实现动态空间分配的初始化;对输入的数据构造成一棵Huffman 树根据生成的Huffman 树进行Huffman 编码;实现对输入数据的Huffman 编码输出;编写主程序,实现对各不同的算法调用。

四、源程序及注释#include <string.h>#include <ctype.h>#include <malloc.h> /* malloc()等*/#include <limits.h> /* INT_MAX 等*/#include <stdio.h> /* EOF(=^Z 或F6),NULL */#include <stdlib.h> /* atoi() */#include <io.h> /* eof() */#include <math.h> /* floor(),ceil(),abs() */#include <process.h> /* exit() *//* 函数结果状态代码*/#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1/* #defineOVERFLOW -2 因为在math. h 中已定义OVERFLOW 的值为3,故去掉此行*/typedef int Status; /* Status 是函数的类型,其值是函数结果状态代码,如OK 等*/ typedef int Boolean; /* Boolean 是布尔类型,其值是TRUE 或FALSE */typedef struct{unsigned int weight;unsigned int parent,lchild,rchild;}HTNode,*HuffmanTree; /* 动态分配数组存储赫夫曼树*/typedef char* *HuffmanCode; /* 动态分配数组存储赫夫曼编码表*//* HuffermanUse.cpp 求赫夫曼编码。

#include"pubuse.h"#include"HuffermanDef.h"int min1(HuffmanTree t,int i){ /* 函数void select() 调用*/int j,flag; unsigned int k=UINT_MAX; /* 取k 为不小于可能的值*/for(j=1;j<=i;j++)if(t[j].weight<k&&t[j].parent==0)k=t[j].weight,flag=j;t[flag].parent=1;return flag;}void select(HuffmanTree t,int i,int *s1,int *s2){ /* s1 为最小的两个值中序号小的那个*/int j;*s1=min1(t,i);*s2=min1(t,i);if(*s1>*s2){j=*s1;*s1=*s2;*s2=j;}}void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n) /* 算法6.12 */ { /* w 存放n 个字符的权值(均>0), 构造赫夫曼树HT, 并求出n 个字符的赫夫曼编码HC */ int m,i,s1,s2,start;unsigned c,f;HuffmanTree p;char *cd;if(n<=1) return;m=2*n-1;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); /* 0 号单元未用*/for(p=HT+1,i=1;i<=n;++i,++p,++w){(*p).weight=*w;(*p).parent=0;(*p).lchild=0;(*p).rchild=0;}for(;i<=m;++i,++p)(*p).parent=0;for(i=n+1;i<=m;++i) /* 建赫夫曼树*/{ /* 在HT[1~i-1] 中选择parent 为0 且weight 最小的两个结点,其序号分别为s1 和s2 */select(HT,i-1,&s1,&s2);HT[s1].parent=HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;HT[i].weight=HT[s1].weight+HT[s2].weight;}/* 从叶子到根逆向求每个字符的赫夫曼编码*/HC=(HuffmanCode)malloc((n+1)*sizeof(char*));/* 分配n 个字符编码的头指针向量([0] 不用) */cd=(char*)malloc(n*sizeof(char)); /* 分配求编码的工作空间*/cd[n-1]='\0'; /* 编码结束符*/for(i=1;i<=n;i++){ /* 逐个字符求赫夫曼编码*/start=n-1; /* 编码结束符位置*/for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)/* 从叶子到根逆向求编码*/if(HT[f].lchild==c)cd[--start]='0';elsecd[--start]='1'; HC[i]=(char*)malloc((n-start)*sizeof(char)); /* 为第i 个字符编码分配空间*/ strcpy(HC[i],&cd[start]); /* 从cd 复制编码(串)到HC */}free(cd); /* 释放工作空间*/}void main(){HuffmanTree HT;HuffmanCode HC;int *w,n,i;printf("请输入权值的个数(>1):");scanf("%d",&n);w=(int*)malloc(n*sizeof(int));printf("请依次输入%d 个权值(整型):\n",n);for(i=0;i<=n-1;i++)scanf("%d",w+i);HuffmanCoding(HT,HC,w,n);printf("赫夫曼编码为:\n");for(i=1;i<=n;i++)puts(HC[i]);}五.实验结果分析六、总结与体会通过对赫夫曼编码程序的实践,我理解了赫夫曼编码的基本过程,明白赫夫曼编码是最优的二进制前缀编码,掌握了赫夫曼树的概念、存储结构建立赫夫曼树和赫夫曼编码的方法及带权路径长度的计算也掌握二叉树的应用。

相关主题