#《数据结构》课程设计指导书1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》课程设计指导书(共13题)
一、课程设计的目的
课程设计的目的是培养学生综合程序设计的能力,训练学生灵活使用所学数据结构知识,独立完成问题分析、总体设计、详细设计和编程实现等软件开发全过程的综合实践能力。
巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的学习作风。
为今后学习其他计算机课程打下基础。
课程设计为学生提供了一个既动手又动脑,独立实践的机会,将书本上的理论知识和工作、生产实际有机地结合起来,从而锻炼学生分析问题、解决实际问题的能力,提高学生的编程序能力和创新意识。
二、课程设计的要求
在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过算法的设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的课程设计和程序分析报告。
前期准备工作完备和否直接影响到后序上机调试工作的效率。
三、课程设计的学生分组情况
每组三至五人,共同研究、共同讨论,可以共同编写算法,但必须各自独立完成各自的程序。
四、课程设计的时间安排
课程设计前两周:将各项任务及问题进行讲解、分析。
课程设计一周:
星期一:学生对任务进行讨论、研究和分析,初步设计出算法。
星期二到星期四:设计出详细算法,并上机调试程序。
星期五到星期六:写出课程设计报告并考核。
五、课程设计的主要内容
【课程设计题目一】
一元稀疏多项式加法、乘法器
【问题描述】
设计一个一元稀疏多项式加法、乘法器用于计算两个多项式的加法和乘法。
例如
(x2+4x5+2x9)+(x+3x4)或(7x4+4x6+2x9)*(x4+3x9)
【基本要求】
(1)输入并建立两个多项式f(x)和g(x);
(2)输出每个多项式,要求输出时按指数从小到大输出。
(3)两个多项式完成加法、乘法运算。
(4)输出两个多项式的加法之和及乘积的结果。
(5)写出课程设计报告
【实现提示】
用带表头结点的单链表存储多项式。
【测试数据】
分别选定三组测试数据进行测试,验证程序的正确性。
【课程设计题目二】
局域网的架设问题
【问题描述】
若要在8个城市(A、B、C、D、E、F、G、H)之间架设局域网,如何以最低的经济代价架设这个局域网。
【基本要求】
(1)利用三种方法(Prim算法、克鲁斯卡尔(Kruskual和矩阵运算)算法生成局域网的架设方案
(2)写出课程设计报告。
【测试数据】
分别对每种方法选定一组测试数据进行测试,验证程序的正确性。
【课程设计题目三】
二叉树的创建、二叉树的遍历
【问题描述】
创建一棵二叉树,并对二叉树进行中序、前序、后序和层次遍历,分别写出
它们的递归、非递归遍历算法。
【基本要求】
创建多种(五种以上)不同形态的二叉树,验证上述算法。
【课程设计题目四】
校园导游咨询系统
【问题描述】
设计一个你所在学校的校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
(1)设计你所在学校的校园平面图,所含景点不少于10个。
以图中顶点表示校内各景点,存放景点名称,代号,简介等信息;以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查出任意两个景点之间的一条最短的简单路径。
(4)写出课程设计报告
【测试数据】
选定一组测试数据进行测试,验证程序的正确性。
【课程设计题目五】
通信网络的架设问题
【问题描述】
若要在n(≥10)个城市之间建设通信网络,只需要架设n-1条线路即可,如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。
【基本要求】
(1)利用三种方法(Prim算法、克鲁斯卡尔(Kruskual和矩阵运算)生成网中的最小生成树
(2)写出课程设计报告。
【测试数据】
分别对每种方法选定三组测试数据进行测试,验证程序的正确性。
【课程设计题目六】
内部排序的比较
【问题描述】
比较内部排序——冒泡排序、插入排序、二分插入排序、选择排序的运行时间。
给出算法执行的时间阶或每个程序的运行时间,精确到秒。
【基本要求】
(1)比较下列几种内部排序:冒泡排序、插入排序、二分插入排序、选择排序的运行时间。
要求随机生成20000个测试数据进行测试,并输出每个程序的运行时间,精确到秒。
(2)写出课程设计报告
【测试数据】
选定一批测试数据进行测试,验证程序的正确性并对计算时间进行比较。
【课程设计题目七】
算法表达式的求值演算
【问题描述】
以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。
利用教科书给出的算符优先关系,加上乘方(^)和求除(%)运算符,实现对算术混合运算表达式的求值。
【基本要求】
(1)用顺序栈实现
(2)含有乘方(^)、加(+)、减(-)、乘(*)、除(/)、求除(%)等运算;并含有括号。
(3)分别以五组不同的表达式作为测试实例,每个实例中含有上述所有运算符,测试其结果的正确性。
(4)写出课程设计报告
【测试数据】
选定五组测试数据进行测试,验证程序的正确性。
【课程设计题目八】
设计一个矩阵运算器
【问题描述】
设计一个矩阵运算器,对矩阵进行乘方(^)、加(+)、减(-)、乘(*)运算;
【基本要求】
(1)参见数据结构题集P136页4.1
(2)求含有乘方(^)、加(+)、减(-)、乘(*)运算;。
(3)写出课程设计报告
【测试数据】
分别选定一组测试数据进行测试,验证程序的正确性。
【课程设计题目九】
自来水管理架设问题
【问题描述】
若要在扬州大学的八个居民区(A区、B区、C区、D区、E区、F区、G区、H区)之间架设自来水管道,如何以最低的经济代价架设这个自来水管道。
【基本要求】
(1)利用三种方法(Prim算法、克鲁斯卡尔Kruskual和矩阵运算)算法生成自来水管道的架设方案
(2)写出课程设计报告。
【测试数据】
分别对每种方法选定三组测试数据进行测试,验证程序的正确性。
【课程设计题目十】
校园网架设的方案设计问题
【问题描述】
若要在扬州大学的八个校区(江阳路南校区、江阳路北校区、盐阜校区、瘦西湖校区、农学院校区、工学院校区、水利学院校区、医学院校区)之间架设校园网,如何以最低的经济代价架设这个校园网。
【基本要求】
(1)利用三种方法(Prim算法、克鲁斯卡尔(Kruskual)和矩阵运算)算法生成校园网的架设方案
(2)写出课程设计报告。
【测试数据】
分别对每种方法选定一组测试数据进行测试,验证程序的正确性。
【课程设计题目十一】
学生成绩管理系统
【问题描述】
现有学生成绩信息文件1(1.txt),内容如下
姓名学号语文数学英语
张明明 01 67 78 82
李成友 02 78 91 88
张辉灿 03 68 82 56
王露 04 56 45 77
陈东明 05 67 38 47
…. .. .. .. …
学生成绩信息文件2(2.txt),内容如下:
姓名学号语文数学英语
陈果 31 57 68 82
李华明 32 88 90 68
张明东 33 48 42 56
李明国 34 50 45 87
陈道亮 35 47 58 77
…. .. .. .. …【基本要求】
试编写一管理系统,要求如下:
1) 实现对两个文件数据进行合并,生成新文件3.txt
2) 抽取出三科成绩中有补考的学生并保存在一个新文件4.txt
3) 对合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现)
4) 输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)
5) 要求使用结构体和链表实现上述要求.
【课程设计题目十二】
学生成绩管理系统
【问题描述】
现有学生成绩信息文件1(1.txt),内容如下
姓名学号语文数学英语
张明明 01 67 78 82
李成友 02 78 91 88
张辉灿 03 68 82 56
王露 04 56 45 77
陈东明 05 67 38 47
…. .. .. .. …
学生成绩信息文件2(2.txt),内容如下:
姓名学号语文数学英语
陈果 31 57 68 82
李华明 32 88 90 68
张明东 33 48 42 56
李明国 34 50 45 87
陈道亮 35 47 58 77
…. .. .. .. …
【基本要求】
试编写一管理系统,要求如下:
1) 实现对两个文件数据进行合并,生成新文件3.txt
2) 抽取出三科成绩中有补考的学生并保存在一个新文件4.txt
3) 对合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现)
4) 输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)
5) 要求使用结构体和数组实现上述要求.
【课程设计题目十三】
算法表达式的求值演算
【问题描述】
以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。
利用教科书给出的算符优先关系,加上乘方(^)和求除(%)等运算符,实现对算术混合运算表达式的求值。
【基本要求】
(1)用链栈实现
(2)含有乘方(^)、加(+)、减(-)、乘(*)、除(/)、求除(%)等运算;并
含有括号。
(3)分别以五组不同的表达式作为测试实例,每个实例中含有上述所有运
算符,测试其结果的正确性。
(4)写出课程设计报告
【测试数据】
选定五组测试数据进行测试,验证程序的正确性。
六、课程设计报告的主要内容
课程设计报告主要包括以下几方面的内容:
(1)课程设计的题目
(2)课程设计的目的
(3)分析系统的主要功能及用途
(4)分析和描述系统的基本要求
(5)问题实现的主要算法和分析
(6)源程序
(7)使用方法和说明
(8)课程设计的小结
(9)参考文献
七、课程设计的考核
结合学生的动手能力,独立分析解决问题的能力和创新精神,总结报告和答辩水平以及学习态度综合考评。
考核成绩分优、良、中、及格和不及格五等。
考核主要包含以下几方面内容:
1)运行所设计的系统
2)回答相关题目的问题
3)提交课程设计报告
4)提交软盘(含源程序、执行程序和课程设计报告)
5)内容要有创新。
八、附录(课程设计报告示例)
数据结构
课程设计报告
课题名称最小生成树问题
姓名×××
学院广陵学院
系科班级计科81101
{初始化图形界面;
读入用户选择信息;
根据用户选择执行相应模块;
关闭文件及图形界面;
};
2)汉字显示模块——实现DOS模式下的汉字显示;
3)随机图单元模块——实现随机生成图;
4)读图模块——实现从指定文件中读图;
5)图形输出模块——实现图的仿真输出。
6)集合操作模块——实现集合的查找合并。
7)求最短路径模块——实现Kruskal算法求图最短路径。
3、函数调用关系:
三、详细设计
1、顶点、边、图和集合类型
#define change(a,b) a=a+b,b=a-b,a=a-b; //交换两个变量值
#define Pi 3.14159265358979323846264 //Π值
#define NY AN //是否演示树的生成过程
typedef struct{
int x,y; //该城市的纵横坐标
int tag; //该城市的访问标志
char name[64]; //城市名
}verType; //顶点类型
typedef struct{
int bg,ed; //边的两端顶点号
int wt; //边的权值
int tag; //边的访问标志
}edgType; //边类型
typedef struct{
verType *v; //指向顶点集合
edgType *e; //指向边集合
int vn,en; //顶点及边的数目
char name[64]; //图名字
}GType; //图类型
GType g; //图全局变量
FILE *fp; //文件指针变量
2、图的基本操作
void initgph(void);
//初始化函数。
将系统设置为图形工作模式。
void getdot(unsigned char c,unsigned char n[8]);
//将c分解为二进制01串,存放在n中。
int pnthz(int x,int y,int fcolor,int bcolor,char os[]);
//x,y是屏幕坐标,fcolor和bcolor是前景色及背景色,os是汉字字符串;在x,y 位置输出汉字串os。
void copyedg(edgType *e1,edgType *e2)
// e1和e2是图的两条边。
将e1的内容赋给e2。
void randomedg(void)
//初始化。
对边集进行随机赋值。
void randomver(void)
//初始化。
对顶点集进行随机赋值。
void readver(void)
//读入信息。
将存放在文件里的图顶点信息读入内存。
void readedg(void)
//读入信息。
将存放在文件里的图边信息读入内存。
void drawver(void)
//绘图操作。
在屏幕上绘制结点。
void drawedg(void)
//绘图操作。
在屏幕上绘制边。
void initial(void)
//初始化操作。
构造一个由n个子集(每个子集只含单个成员X i)构成的集合S。
int find(int v)
//S是已经存在的集合,v是某个子集成员。
返回S中v所属子集Si。
void merge(int v1,int v2)
//S1和S2是S中两个互不相交的非空集合。
将S1和S2中的一个并入另一个。
void kruskal(int v1,int v2)
//求图G的最小生成树。
void output(void)
//输出操作。
将最小生成树以文本形式输出到文件中。
void fromfile(char fname[])
//fname是图文件名。
打开文件操作。
打开图信息文件,为读图做准备。
void userinput(void)
//由用户输入图文件名。
void randomimage(void)
//调用Randomedg()和Randomver()函数对边集和顶点集进行随机赋值。
int choose(void)
//由用户选择图信息的生成方式。
返回选择项的序号。
3、程序详细代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<math.h>
#include<graphics.h>
#define change(a,b) a=a+b,b=a-b,a=a-b;
#define Pi 3.1415926535897932384626433832795
#define NYAN
typedef struct{
int x,y,tag;
char name[64];
}verType;
typedef struct{
int bg,ed,wt,tag;
}edgType;
typedef struct{
verType *v;
edgType *e;
int vn,en;
char name[64];
}GType;
GType g;
FILE *fp;
void initgph(void)
{int gmode,gdrive;
printf("\n\n\tInitializtion graph mode, please wait..."); gmode=DETECT;
initgraph(&gmode,&gdrive,"C:\\Tc");
}
void getdot(unsigned char c,unsigned char n[8])
{char i;
for(i=0;i<8;i++)
n[i]=((c>>(7-i))&1);
}
int pnthz(int x,int y,int fcolor,int bcolor,char os[]) {FILE *hzk=NULL;
unsigned int j,k,cn[2],cx,cy;
unsigned long i,len,p;
unsigned char c[32],n[8],ch[2],s[128];
for(i=0,j=0,len=0;os[j]!='\0';i++,j++,len++)
{if(os[j]>32)
{s[i++]=0xAA;
s[i]=0xA1+(os[j]-33);
len++;
}
else if(os[j]==32)
{s[i++]=0xA1;
s[i]=0xA1;
len++;
}
else s[i]=os[j];
}
if(len==0) return(0);
len/=2;
if((hzk=fopen("C:\\Windows\\Command\\Chs16.fon","rb"))==NULL) return(1);
for(i=0;i<len;i++)
{ch[0]=s[i*2];
ch[1]=s[i*2+1];
cn[0]=(ch[0]-0xA1);
cn[1]=(ch[1]-0xA1);
p=(cn[0]*94L+cn[1])*32L;
rewind(hzk); fseek(hzk,p,0);
fread(&c,sizeof(char),32,hzk);
for(j=0;j<32;j++)
{getdot(c[j],n);
for(k=0;k<8;k++)
{cx=(k+(j%2)*8+i*16+x)%640;
cy=j/2+y+((k+(j%2)*8+i*16+x)/640)*16;
if(n[k]==1) putpixel(cx,cy,fcolor);
else if(bcolor!=-1) putpixel(cx,cy,bcolor);
} }
}
fclose(hzk);
return(cx);
}
void copyedg(edgType *e1,edgType *e2)
{e1->bg=e2->bg;
e1->ed=e2->ed;
e1->wt=e2->wt;
e1->tag=e2->tag;
}
void randomedg(void)
{int i,j,tag;
edgType re;
if(g.e!=NULL) free(g.e);
g.e=(edgType *)malloc(sizeof(edgType)*g.en);
if(g.e==NULL) {printf("\nMalloc Error!"); return;}
for(i=0;i<g.en;i++)
{re.bg=random(g.vn);
re.ed=random(g.vn);
for(j=0,tag=0;j<i;j++)
if((g.e[j].bg==re.bg&&g.e[j].ed==re.ed)
||(g.e[j].bg==re.ed&&g.e[j].ed==re.bg))
{tag=1; break;}
if(re.bg==re.ed||tag==1) {i--; continue;}
re.wt=random(99)+1;
re.tag=(-1);
for(j=i;(g.e[j-1].wt>re.wt)&&(j>0);j--)
copyedg(&(g.e[j]),&(g.e[j-1]));
copyedg(&(g.e[j]),&re);
}
}
void randomver(void)
{int i,xc,yc,r;
float dg,st,x,y;
if(g.v!=NULL) free(g.v);
g.v=(verType *)malloc(sizeof(verType)*g.vn);
if(g.v==NULL) {printf("\nMalloc Error!"); return;}
dg=0.0; st=Pi/g.vn*2.0;
xc=getmaxx()/2;
yc=getmaxy()/2;
r=xc<yc?xc:yc-10;
for(i=0,dg=0;i<g.vn;i++,dg+=st)
{x=xc+r*cos(dg);
y=yc+r*sin(dg);
g.v[i].x=x; g.v[i].y=y; g.v[i].tag=0;
sprintf(g.v[i].name,"%02d",i+1);
}
}
void readver(void)
{int i,ord;
if(g.v!=NULL) free(g.v);
g.v=(verType *)malloc(sizeof(verType)*g.vn);
if(g.v==NULL) {printf("\nMalloc Error in readver!"); return;} for(i=0;i<g.vn;i++)
{fscanf(fp,"%d%s%d%d",&ord,g.v[i].name,&g.v[i].x,&g.v[i].y);
g.v[i].tag=0;
}
}
void readedg(void)
{int i,j;
edgType re;
if(g.e!=NULL) free(g.e);
g.e=(edgType *)malloc(sizeof(edgType)*g.en);
if(g.e==NULL) {printf("\nMalloc Error in read edg!"); return;} for(i=0;i<g.en;i++)
{fscanf(fp,"%d%d%d",&re.bg,&re.ed,&re.wt);
re.tag=(-1);
for(j=i;(g.e[j-1].wt>re.wt)&&(j>0);j--)
copyedg(&(g.e[j]),&(g.e[j-1]));
copyedg(&(g.e[j]),&re);
}
}
void drawver(void)
{int i,x1,y1,x2,y2;
char s[64];
sprintf(s,"%s 结点数:%d边数:%d",,g.vn,g.en);
pnthz((640-8*strlen())/3,0,12,-1,s);
for(i=0;i<g.vn;i++)
{setcolor(12);
setfillstyle(1,12);
fillellipse(g.v[i].x,g.v[i].y,4,4);
pnthz(g.v[i].x+8,g.v[i].y,15,-1,g.v[i].name);
}
}
void drawedg(void)
{int i,x1,y1,x2,y2;
char s[10];
for(i=0;i<g.en;i++)
{if(g.e[i].tag<0) setcolor(7);
else if(g.e[i].tag==0) setcolor(8);
else if(g.e[i].tag==1) setcolor(10);
else setcolor(g.e[i].tag);
x1=g.v[g.e[i].bg].x;
y1=g.v[g.e[i].bg].y;
x2=g.v[g.e[i].ed].x;
y2=g.v[g.e[i].ed].y;
line(x1,y1,x2,y2);
sprintf(s,"%d",g.e[i].wt);
outtextxy((x1+x2)/2+4,(y1+y2)/2-10,s);
}
}
void initial(void)
{
g.e[0].tag=1;
}
int find(int v)
{int i;
for(i=0;(i<g.en)&&(g.e[i].tag>=0);i++)
{if(g.e[i].tag==0) continue;
if(g.e[i].bg==v||g.e[i].ed==v) return g.e[i].tag;
}
return -1;
}
void merge(int v1,int v2)
{int i;
if(v1>v2) change(v1,v2);
for(i=0;(i<g.en)&&(g.e[i].tag>=0);i++)
if(g.e[i].tag==v2) g.e[i].tag=v1;
}
void kruskal(void)
{int i,j=2,v1,v2;
initial();
for(i=1,j=2;i<g.en;i++)
{v1=find(g.e[i].bg);
v2=find(g.e[i].ed);
if(v1==v2&&v1!=(-1)) g.e[i].tag=0;
else if(v1==v2&&v1==(-1)) g.e[i].tag=j++;
else if(v1*v2<0) g.e[i].tag=(v1<0?v2:v1);
else if(v1!=v2) {merge(v1,v2); g.e[i].tag=(v1<v2)?v1:v2;} #ifdef YAN
drawedg(); if(getch()==27) return;
#endif
}
}
void output(void)
{FILE *fout;
int i;
fout=fopen("OUTFILE.TXT","w");
if(fout==NULL)
{printf("\nCan not open out file!");
getch(); return;
}
fprintf(fout,"%s\n",);
for(i=0;i<g.en;i++)
if(g.e[i].tag==1)
fprintf(fout,"%s - %s\t%d\n",
g.v[g.e[i].bg].name,g.v[g.e[i].ed].name,g.e[i].wt); fclose(fout);
}
void fromfile(char fname[])
{fp=fopen(fname,"r");
if(fp==NULL)
{pnthz(20,30,15,-1,"无法打开图文件:");
outtextxy(144,30,fname);
pnthz(20,50,15,-1,"任意键返回……");
getch(); cleardevice(); return;
}
fscanf(fp,"%d%d%s",&g.vn,&g.en,);
readver();
readedg();
kruskal();
drawedg();
drawver();
output();
pnthz(16,getmaxy()-20,15,0,"任意键返回……");
getch();
}
void userinput(void)
{char name[128];
int i;
char help[8][48]={"图文件结构要求如下",
"〈结点数〉〈边数〉〈图名〉",
"〈结点序号〉〈X坐标〉〈Y坐标〉〈名称〉",
"……其他结点信息……",
"〈起始结点序号〉〈终止结点序号〉〈权值〉",
"……其他边信息……",
"详细示例参看附带文件CHINAMAP.TXT"};
for(i=0;i<8;i++) pnthz(36,100+i*20,15,-1,help[i]);
pnthz(40,30,15,-1,"图形文件名:_");
gotoxy(18,3); gets(name);
cleardevice();
fromfile(name);
}
void randomimage(void)
{int tag=1;
randomize();
while(tag){
cleardevice();
pnthz(120,95,15,-1,"输入图的结点数:_");
gotoxy(32,7); scanf("%d",&g.vn);
pnthz(136,125,15,-1,"输入图的边数:_");
gotoxy(32,9); scanf("%d",&g.en);
if(g.en<=(g.vn*(g.vn-1)/2)&&g.vn>2&&g.vn<30&&g.vn<g.en) tag=0;
else {pnthz(136,150,15,-1,"数据错误,请重新输入!"); getch();}
}
strcpy(,"随机图形");
cleardevice();
randomver();
randomedg();
kruskal();
drawedg();
drawver();
output();
pnthz(16,getmaxy()-20,15,0,"任意键返回……");
getch();
}
int choose(void)
{int tag=2,key,i;
char s[6][32]=
{"最小生成树问题——黄健制作",
"请选择:","【1、演示图(城市通信网络)】",
"【2、用户输入图文件】","【3、随机生成图信息】", "【4、退出系统(ESC)】"};
cleardevice();
while(1)
{for(i=0;i<6;i++)
pnthz(100,20*i+40,15,(i==tag?7:0),s[i]);
key=getch();
if(key==13) break;
else if(key==27) return(0);
else if(key>'0'&&key<'5') tag=key-'0'+1;
else if(key==0) key=getch();
switch(key)
{case 72: tag--; break;
case 80: tag++; break;
}
if(tag<2) tag=2;
else if(tag>5) tag=5;
while(kbhit()) getch();
}
cleardevice();
return tag-1;
}
main()
{int i,tag=1;
initgph();
settextstyle(1,0,1);
do{
tag=choose();
switch(tag)
{case 1: fromfile("ChinaMap.txt"); break; case 2: userinput(); break;
case 3: randomimage(); break;
case 4: tag=0; break;
}
}while(tag);
fcloseall();
closegraph();
}
Initgph
getdot
pnthz randomedg randomv readve drawver choose userinput randomimage output merge
find initial drawedg readedg
函数调用关系图
问的边赋值-10。
2. O(n 2).
3. 集合的并运算需要遍历全部已经访问过的边,修改其tag 值。
故复杂度为
O(n)。
4. 1. 本程序运行环境为DOS 操作系统,执行文件为Image.exe 。
2. 进入系统后显示选择菜单:
图1
3. 使用上下键或数字键选择一个项目,则进入选项。
1.选项一运行结果如下图2所示:
图2
其中颜色为亮绿色(该处为深灰色)的是在最小生成树中的边。
2.进入选项二后用户会看到提示如图3(见下页)。
按要求输入图文件名,例如
输入Ceshi.txt并回车,调用附带的测试文件,可以看到的输出画面见图4。
其中颜色为亮绿色(该处为深灰色)的是在最小生成树中的边。
3.选项三的运行效果和选项一类似。
4.程序运行后会将运行结果以文本形式输出到文件OutFile.txt中,供用户查询
使用。
图3
图4
5.由于图文件的格式要求比较高,故提供了两个示例文件ChinaMap.txt和
CeShi.txt,用户可以参考创建其他图文件。
其含义如图3中所示。
六、测试结果
测试文件ChinaMap.txt内容如下(为节省空间,分两栏显示):
25 30 中国通信网络
0 北京 363 108
1 长春 520 60
2 成都 185 250
3 大连 475 153
4 福州 420 335
5 广州 300 383
6 贵阳 200 330
7 哈尔滨 570 20
8 呼和浩特 280 93
9 昆明 138 350
10 兰州 195 180
11 柳州 243 360
12 南昌 360 315
13 南宁 200 388
14 上海 438 263
15 沈阳 490 100
16 深圳 345 410
17 天津 405 145
18 武汉 325 263
19 乌鲁木齐 20 20
20 西安 260 200
21 西宁 135 165
22 徐州 390 203
23 郑州 330 200
24 株州 300 320 0 17 137
0 23 695
0 8 668
1 7 242
1 15 305
2 6 967
2 9 1100
2 20 842
3 15 397
4 12 622
5 1
6 104
5 24 675
6 9 639
6 11 607
6 24 902
8 10 1145 10 19 1892 10 20 676
10 21 216
11 13 255
11 24 672
12 14 825 12 24 367
14 22 651
15 17 704
17 22 674
18 23 534 18 24 409 20 23 511 22 23 349
该文件的生成树输出文件OutFile.txt内容如下:中国通信网络
广州 - 深圳104
北京 - 天津137
兰州 - 西宁216
长春 - 哈尔滨 242
柳州 - 南宁255
长春 - 沈阳305
徐州 - 郑州349
南昌 - 株州367
大连 - 沈阳397
武汉 - 株州409
西安 - 郑州511
武汉 - 郑州534
贵阳 - 柳州607
福州 - 南昌622
贵阳 - 昆明639
上海 - 徐州651
北京 - 呼和浩特668
柳州 - 株州672
天津 - 徐州674
广州 - 株州675
兰州 - 西安676
沈阳 - 天津704
成都 - 西安842
兰州 - 乌鲁木齐1892
以上即为包含在最小生成树中的边信息。
七、附件
Image.c //源程序
ChinaMap.txt //城市通信网络图信息文件CeShi.txt //测试图信息文件Readme.txt //程序说明
八、心得体会
在这次程序设计中,我使用了DOS模式下的汉字显示技术以及图形界面下的图形、字符输出等。
首先示汉字显示。
由于汉字在存储时占两个字节,分别是区码和位码。
首先需要将区位码转换为机内码,再由机内码确定汉字在字库中的位置,读出该汉字的字模,然后再一个像素一个像素的画出该汉字。
该程序调用Windows自带的汉字库文件CHS16.FON,该文件在Windows\Command文件夹下。
在确定汉字在字库中的位置时,进行了多次尝试,终于得到了一个转换公式。
在尝试过程中,我知道了完成一个程序有时后并不是能一次就可以达到目标的,往往需要你不断的思考,不断的调试,直到成功。
在此过程中,尽管有些枯燥,但我也找到了乐趣。
另外通过调试汉字显示程序,我也逐步熟悉了TurboC中的一些图形函数,并以此扩展,做出了一些其他的程序。
例如在高二时就接触的搬运工游戏。
当时是在文曲星电子词典上见到的。
游戏中有一些小BUG,当时玩时就想什么时候我会编程时我一定把它改正过来。
没想到今天我就实现了,这时我两年前想也不敢想的。
图形模式下的输出和字符界面完全不同。
在图形模式下是以像素为单位的,你必须考虑每个像素的位置、颜色,以及它是否超出屏幕,是否需要刷新,以及在刷新是如何保存需要的信息等。
使用图形模式输出,不仅锻炼了我思考问题的周密性,而且让我重新认识了C,知道C还可以做更多的事情。
在图形模式下没有字符模式下的硬件光标。
为了提示用户的输入位置,必须自己用程序做虚拟光标。
但我做了多次尝试,都没能成功实现。
由于时间仓促,只好退而求其次,舍弃虚拟光标,用一个亮下划线做位置提示。
在以后的编程中,我会继续尝试,实现虚拟光标。
通过对数据结构课程的学习以及本次课程设计,让我进一步完善了程序设计的思想。
我已经习惯了先考虑这个事情程序化的可行性,从具体问题抽象出一个适当的数学模型,从中提取操作对象,并找出这些对象包含的关系,然后用数学的语言加以描述,设计一个解决此问题的算法。
在程序编辑之前,首先分析程序待处理的对象的特性,以及各对象之间存在的关系,构造合适的数据结构,然后在此基础上编辑程序。