《算法与数据结构》课程设计报告
题目: 医院选址问题
完成日期:2013 年12月27日
一、课程设计目的
本课程设计的目标就是要达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,并培养基本的、良好的程序设计技能以及合作能力。
设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。
通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择和
应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
二、课程设计内容
1)问题描述
n个村庄之间的交通图可以用有向网图来表示,图中边上的权值表示从村庄i到村庄j的道路长度。现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄,才能使所有的村庄离医院都比较近? 2) 基本要求
(1) 建立模型,设计存储结构; (2) 设计算法完成问题求解; (3) 分析算法的时间复杂度。
三、课程设计过程
1.需求分析
① 输入的形式和输入值的范围:首先输入村庄数目、道路数目。接着按提示输入道路的起点和终点以及路程
② 输出的形式:输出临接矩阵,再输出偏心度数组,然后输出最适合建立医院的村庄编号
③ 程序所能达到的功能:根据录入的相关数据(包括村庄数目、道路数目、道路的起点和终点以及路程),找出最适合的医院选址,使所有的村庄离医院都比较近。
④ 测试数据:
A. 村庄数目、道路数目:5,7
B. 道路的起点和终点以及路程:1,2,1;2,3,2;3,4,2; 3,5,4;4,2,1;4,3,3;5,4,5.
2.概要设计
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
1.为了实现上述程序功能,需要定义有向带权图的抽象数据类型: ①图的结构体定义:
typedef struct {
数据对象:int arcs[MAX_NUM][MAX_NUM]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点和边数 }Graph;
操作结果:构建邻接矩阵的存储结构 ②产生一个有向带权图的邻接矩阵
void CreateGraph(Graph &); //生成图的邻接矩阵
操作结果:在屏幕生成一个有向带权图 ③用弗洛依德算法求最短路径
void floyd(Graph,BOOL[][MAX_NUM][MAX_NUM],int[][MAX_NUM]); //用弗洛依德算法求每对顶点之间的最短路径 操作结果:求得最短路径
2)本程序包含3个函数: ① 主函数main()
② 构造邻接矩阵结构的图函数 CreateGraph() ③ 用弗洛依德算法求最短路径函数 floyd() 各函数间关系如下:
3.详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数和过程的调用关系图。
1.定义的数据结构类型 typedef struct {
int arcs[MAX_NUM][MAX_NUM]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点和边数
}Graph;
void CreateGraph(Graph &); //生成图的邻接矩阵
void floyd(Graph,BOOL[][MAX_NUM][MAX_NUM],int[][MAX_NUM]); //用弗洛依德算法求每对顶点之间的最短路径 2.主函数的基本操作
void main() {
do{ switch (i){ case 1: break;
default: exit(1); }
}while(i!=0); }
3.构造邻接矩阵结构的图函数基本操作
void CreateGraph(Graph &G) {
//构造邻接矩阵结构的图G do{
if(G.arcnum>k)
}while(G.arcnumk); for(i=1;i
for(i=1;i
3,弗洛依德算法的基本操作 void floyd(Graph *G,int path[MAX_NUM][MAX_NUM],int A[MAX_NUM][MAX_NUM] ) {
//用弗洛依德算法求有向网G的每对顶点v和w之间的最短路径path[v][w]
//及其带权路径长度D[Av][w],
//若path[v][w][u]为True,表明u是从v到w当前求得最短路径上的顶点 //偏心度数组
for(v=0;vvexnum;v++) //各对顶点之间的初始已知路径及距离 for(w=0;wvexnum;w++) { }
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离 { for(w=1;wvexnum;w++) { } }
///////////////////////
for(k=1;kvexnum;k++)
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离 for(w=1;wvexnum;w++) if(A[v][k]+A[k][w]
///邻接矩阵和path矩阵 对角线应该为0 (上1面的结果不是0) for(k=1;kvexnum;k++) { }
///////// for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离 for(w=1;wvexnum;w++) { if(A[v][w]==INFINITY) { } };
}
4.调试分析
1.
for(k=1;kvexnum;k++)
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离 for(w=1;wvexnum;w++) if(A[v][k]+A[k][w]
///邻接矩阵和path矩阵 对角线应该为0 (上1面的结果不是0) 2. while(next!=0){ //课本上有出入 printf(" -> %d",next); next=path[next][w]; };printf("->%d\n",w);
5.用户使用说明
程序名为gg.cpp,运行环境为Microsoft Visual C++ 6.0。程序执行后显示 ======================= 1: 根据输入数据寻找最佳村庄 0: Exit
======================= SELECT:
在select后输入数字选择执行不同的功能。要求首先输入足够多的数据,才可以进行其他的操作。每执行一次功能,就会显示执行的结果(正确或错误)以及执行后单链表的内容。 选择0:退出程序
选择1:显示“首先输入村庄数目(2-19)和道路数目:
请输入村庄数目(2-19)和道路数目,格式:村庄数目,道路数目” , 要求输入村庄数目和道路数目的值(都是整数)。 6.测试结果
程序名为gg.cpp,运行环境为Microsoft Visual C++ 6.0。程序执行后显示
SELECT:
在select后输入数字选择执行不同的功能。要求首先输入足够多的数据,才可以进行其他的操作。每执行一次功能,就会显示执行的结果(正确或错误)以及执行后单链表的内容。 选择0:退出程序
选择1:显示“首先输入村庄数目(2-19)和道路数目:
请输入村庄数目(2-19)和道路数目,格式:村庄数目,道路数目” , 要求输入村庄数目和道路数目的值(都是整数)。
7.附录
带注释的源程序。 #include #include #include
#define INFINITY 10000 //定义权值的最大值
#define MAX_NUM 20 //图的最大顶点数
typedef struct {
int arcs[MAX_NUM][MAX_NUM]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点和边数 }Graph;
void CreateGraph(Graph &); //生成图的邻接矩阵
void floyd(Graph *G,int path[MAX_NUM][MAX_NUM],int A[MAX_NUM][MAX_NUM] ); //用弗洛依德算法求每对顶点之间的最短路径
void main() {
Graph G; //采用邻接矩阵结构的图 int i;
int path[MAX_NUM][MAX_NUM]; //存放每对顶点的最短路径
int A[MAX_NUM][MAX_NUM]; //存放每对顶点的最短路径的距离 do{ //从菜单中选择遍历方式,输入序号。 printf("\t1: 根据输入数据寻找最佳村庄\n"); printf("\t0: Exit\n");
scanf("%d",&i ); //输入菜单序号(0-1) switch (i){
case 1: printf("首先输入村庄数目(2-19)和道路数目:\n"); CreateGraph(G); //生成邻接矩阵结构的图 Graph *k; k=&G;
floyd(k,path,A); //利用弗洛依德算法求最短路径
break;
default: exit(1); }
printf("\n"); }while(i!=0); }
void CreateGraph(Graph &G) {
//构造邻接矩阵结构的图G int i,j,k;
int start,end,weight; do{ printf("请输入村庄数目(2-19)和道路数目,格式:村庄数目,道路数目\n");
scanf("%d,%d",&G.vexnum,&G.arcnum); //输入图的顶点数和边数 k=G.vexnum*(G.vexnum-1); if(G.arcnum>k) printf("error!!\n");
}while(G.arcnumk); for(i=1;i
G.arcs[i][j]=INFINITY; //初始化邻接矩阵
printf("请输入道路的起点和终点(i,j)及其路程,格式:起点,终点,路程:\n"); for(i=1;i
{scanf("%d,%d,%d",&start,&end,&weight); //输入边的起点和终点及权值 G.arcs[start][end]=weight; } }
void floyd(Graph *G,int path[MAX_NUM][MAX_NUM],int A[MAX_NUM][MAX_NUM] ) {
//用弗洛依德算法求有向网G的每对顶点v和w之间的最短路径path[v][w] //及其带权路径长度D[Av][w],
//若path[v][w][u]为True,表明u是从v到w当前求得最短路径上的顶点 int v,w,k,next,min;
int a[10]; //偏心度数组
for(v=0;vvexnum;v++) //各对顶点之间的初始已知路径及距离 for(w=0;wvexnum;w++) { A[v][w]=G->arcs[v][w]; path[v][w]=0; }
////////////////打印出初始矩阵 printf("\n出初始矩阵:\n");
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离 { for(w=1;wvexnum;w++) { printf("%8d",A[v][w]); }
printf("\n"); }
///////////////////////
for(k=1;kvexnum;k++)
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离
for(w=1;wvexnum;w++)
if(A[v][k]+A[k][w]
{
A[v][w]=A[v][k]+A[k][w];
path[v][w]=k;
}
///邻接矩阵和path矩阵 对角线应该为0 (上1面的结果不是0)
for(k=1;kvexnum;k++)
{
A[k][k]=0;
path[k][k]=0;
}
/////////
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离
for(w=1;wvexnum;w++)
{
printf("顶点%d路径长度%d",v,A[v][w]);
if(A[v][w]==INFINITY)
{
printf("无路径\n");
continue;
}
next=path[v][w];
printf("路径为:%d",v);
while(next!=0){ //课本上有出入
printf(" -> %d",next);
next=path[next][w];
};printf("->%d\n",w);
}
printf("生成的最短路径的邻接矩阵为:\n");
for(v=1;vvexnum;v++)
{for(w=1;wvexnum;w++)
printf("%7d", A[v][w]);
printf("\n");}
///////打印出path
printf("\n path矩阵:\n");
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离
{
for(w=1;wvexnum;w++)
{
printf("%8d",path[v][w]);
}
printf("\n");
}
printf("偏心度为:");
for(w=1;wvexnum;w++)
{
int max=A[1][w];
for(v=1;vvexnum;v++)
{
if(max
{
max=A[v][w];
}
}
if(max==0)
max=INFINITY;
a[w]=max;
printf("%7d",a[w]);
}
printf("\n");
k=1;
min=a[1];
for(w=1;wvexnum;w++)
{
if(a[w]
{min=a[w];
k=w;}
}
printf("最适合建医院的村庄为:%d\n",k);
}
四、课程设计体会
计算机对我们的现实世界、现实生活具有很大的作用,人们能够通过计算机去解决现实的问题,我们正好通过编程去解决,对现在来说也是很大的帮助。
在数据结构的学习过程中,我们的能力有很大的提高,对我们的未来是一个很大的帮助,对我们的编程积累很大的经验。
我感受最深的一点是:以前用C编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。但现在编程感觉完全不同了。在编写一个程序之前,自己能够综合考虑各种因素,首先选取自己需要的数据结构,是树还是图或是别的什么?然后选定一种或几种存储结构来具体的决定后面的函数的主要风格。最后在编写每一个函数之前,可以仔细斟酌比对,挑选出最适合当前状况的算法。这样,即使在完整的程序还没有写出来之前,自己心中已经有了明确的原图了。这样无形中就提高了自己编写的程序的能力。
另外,我还体会到深刻理解数据结构的重要性。只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构。了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。
《算法与数据结构》课程设计报告
题目: 医院选址问题
完成日期:2013 年12月27日
一、课程设计目的
本课程设计的目标就是要达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,并培养基本的、良好的程序设计技能以及合作能力。
设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。
通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择和
应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
二、课程设计内容
1)问题描述
n个村庄之间的交通图可以用有向网图来表示,图中边上的权值表示从村庄i到村庄j的道路长度。现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄,才能使所有的村庄离医院都比较近? 2) 基本要求
(1) 建立模型,设计存储结构; (2) 设计算法完成问题求解; (3) 分析算法的时间复杂度。
三、课程设计过程
1.需求分析
① 输入的形式和输入值的范围:首先输入村庄数目、道路数目。接着按提示输入道路的起点和终点以及路程
② 输出的形式:输出临接矩阵,再输出偏心度数组,然后输出最适合建立医院的村庄编号
③ 程序所能达到的功能:根据录入的相关数据(包括村庄数目、道路数目、道路的起点和终点以及路程),找出最适合的医院选址,使所有的村庄离医院都比较近。
④ 测试数据:
A. 村庄数目、道路数目:5,7
B. 道路的起点和终点以及路程:1,2,1;2,3,2;3,4,2; 3,5,4;4,2,1;4,3,3;5,4,5.
2.概要设计
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
1.为了实现上述程序功能,需要定义有向带权图的抽象数据类型: ①图的结构体定义:
typedef struct {
数据对象:int arcs[MAX_NUM][MAX_NUM]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点和边数 }Graph;
操作结果:构建邻接矩阵的存储结构 ②产生一个有向带权图的邻接矩阵
void CreateGraph(Graph &); //生成图的邻接矩阵
操作结果:在屏幕生成一个有向带权图 ③用弗洛依德算法求最短路径
void floyd(Graph,BOOL[][MAX_NUM][MAX_NUM],int[][MAX_NUM]); //用弗洛依德算法求每对顶点之间的最短路径 操作结果:求得最短路径
2)本程序包含3个函数: ① 主函数main()
② 构造邻接矩阵结构的图函数 CreateGraph() ③ 用弗洛依德算法求最短路径函数 floyd() 各函数间关系如下:
3.详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数和过程的调用关系图。
1.定义的数据结构类型 typedef struct {
int arcs[MAX_NUM][MAX_NUM]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点和边数
}Graph;
void CreateGraph(Graph &); //生成图的邻接矩阵
void floyd(Graph,BOOL[][MAX_NUM][MAX_NUM],int[][MAX_NUM]); //用弗洛依德算法求每对顶点之间的最短路径 2.主函数的基本操作
void main() {
do{ switch (i){ case 1: break;
default: exit(1); }
}while(i!=0); }
3.构造邻接矩阵结构的图函数基本操作
void CreateGraph(Graph &G) {
//构造邻接矩阵结构的图G do{
if(G.arcnum>k)
}while(G.arcnumk); for(i=1;i
for(i=1;i
3,弗洛依德算法的基本操作 void floyd(Graph *G,int path[MAX_NUM][MAX_NUM],int A[MAX_NUM][MAX_NUM] ) {
//用弗洛依德算法求有向网G的每对顶点v和w之间的最短路径path[v][w]
//及其带权路径长度D[Av][w],
//若path[v][w][u]为True,表明u是从v到w当前求得最短路径上的顶点 //偏心度数组
for(v=0;vvexnum;v++) //各对顶点之间的初始已知路径及距离 for(w=0;wvexnum;w++) { }
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离 { for(w=1;wvexnum;w++) { } }
///////////////////////
for(k=1;kvexnum;k++)
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离 for(w=1;wvexnum;w++) if(A[v][k]+A[k][w]
///邻接矩阵和path矩阵 对角线应该为0 (上1面的结果不是0) for(k=1;kvexnum;k++) { }
///////// for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离 for(w=1;wvexnum;w++) { if(A[v][w]==INFINITY) { } };
}
4.调试分析
1.
for(k=1;kvexnum;k++)
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离 for(w=1;wvexnum;w++) if(A[v][k]+A[k][w]
///邻接矩阵和path矩阵 对角线应该为0 (上1面的结果不是0) 2. while(next!=0){ //课本上有出入 printf(" -> %d",next); next=path[next][w]; };printf("->%d\n",w);
5.用户使用说明
程序名为gg.cpp,运行环境为Microsoft Visual C++ 6.0。程序执行后显示 ======================= 1: 根据输入数据寻找最佳村庄 0: Exit
======================= SELECT:
在select后输入数字选择执行不同的功能。要求首先输入足够多的数据,才可以进行其他的操作。每执行一次功能,就会显示执行的结果(正确或错误)以及执行后单链表的内容。 选择0:退出程序
选择1:显示“首先输入村庄数目(2-19)和道路数目:
请输入村庄数目(2-19)和道路数目,格式:村庄数目,道路数目” , 要求输入村庄数目和道路数目的值(都是整数)。 6.测试结果
程序名为gg.cpp,运行环境为Microsoft Visual C++ 6.0。程序执行后显示
SELECT:
在select后输入数字选择执行不同的功能。要求首先输入足够多的数据,才可以进行其他的操作。每执行一次功能,就会显示执行的结果(正确或错误)以及执行后单链表的内容。 选择0:退出程序
选择1:显示“首先输入村庄数目(2-19)和道路数目:
请输入村庄数目(2-19)和道路数目,格式:村庄数目,道路数目” , 要求输入村庄数目和道路数目的值(都是整数)。
7.附录
带注释的源程序。 #include #include #include
#define INFINITY 10000 //定义权值的最大值
#define MAX_NUM 20 //图的最大顶点数
typedef struct {
int arcs[MAX_NUM][MAX_NUM]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点和边数 }Graph;
void CreateGraph(Graph &); //生成图的邻接矩阵
void floyd(Graph *G,int path[MAX_NUM][MAX_NUM],int A[MAX_NUM][MAX_NUM] ); //用弗洛依德算法求每对顶点之间的最短路径
void main() {
Graph G; //采用邻接矩阵结构的图 int i;
int path[MAX_NUM][MAX_NUM]; //存放每对顶点的最短路径
int A[MAX_NUM][MAX_NUM]; //存放每对顶点的最短路径的距离 do{ //从菜单中选择遍历方式,输入序号。 printf("\t1: 根据输入数据寻找最佳村庄\n"); printf("\t0: Exit\n");
scanf("%d",&i ); //输入菜单序号(0-1) switch (i){
case 1: printf("首先输入村庄数目(2-19)和道路数目:\n"); CreateGraph(G); //生成邻接矩阵结构的图 Graph *k; k=&G;
floyd(k,path,A); //利用弗洛依德算法求最短路径
break;
default: exit(1); }
printf("\n"); }while(i!=0); }
void CreateGraph(Graph &G) {
//构造邻接矩阵结构的图G int i,j,k;
int start,end,weight; do{ printf("请输入村庄数目(2-19)和道路数目,格式:村庄数目,道路数目\n");
scanf("%d,%d",&G.vexnum,&G.arcnum); //输入图的顶点数和边数 k=G.vexnum*(G.vexnum-1); if(G.arcnum>k) printf("error!!\n");
}while(G.arcnumk); for(i=1;i
G.arcs[i][j]=INFINITY; //初始化邻接矩阵
printf("请输入道路的起点和终点(i,j)及其路程,格式:起点,终点,路程:\n"); for(i=1;i
{scanf("%d,%d,%d",&start,&end,&weight); //输入边的起点和终点及权值 G.arcs[start][end]=weight; } }
void floyd(Graph *G,int path[MAX_NUM][MAX_NUM],int A[MAX_NUM][MAX_NUM] ) {
//用弗洛依德算法求有向网G的每对顶点v和w之间的最短路径path[v][w] //及其带权路径长度D[Av][w],
//若path[v][w][u]为True,表明u是从v到w当前求得最短路径上的顶点 int v,w,k,next,min;
int a[10]; //偏心度数组
for(v=0;vvexnum;v++) //各对顶点之间的初始已知路径及距离 for(w=0;wvexnum;w++) { A[v][w]=G->arcs[v][w]; path[v][w]=0; }
////////////////打印出初始矩阵 printf("\n出初始矩阵:\n");
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离 { for(w=1;wvexnum;w++) { printf("%8d",A[v][w]); }
printf("\n"); }
///////////////////////
for(k=1;kvexnum;k++)
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离
for(w=1;wvexnum;w++)
if(A[v][k]+A[k][w]
{
A[v][w]=A[v][k]+A[k][w];
path[v][w]=k;
}
///邻接矩阵和path矩阵 对角线应该为0 (上1面的结果不是0)
for(k=1;kvexnum;k++)
{
A[k][k]=0;
path[k][k]=0;
}
/////////
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离
for(w=1;wvexnum;w++)
{
printf("顶点%d路径长度%d",v,A[v][w]);
if(A[v][w]==INFINITY)
{
printf("无路径\n");
continue;
}
next=path[v][w];
printf("路径为:%d",v);
while(next!=0){ //课本上有出入
printf(" -> %d",next);
next=path[next][w];
};printf("->%d\n",w);
}
printf("生成的最短路径的邻接矩阵为:\n");
for(v=1;vvexnum;v++)
{for(w=1;wvexnum;w++)
printf("%7d", A[v][w]);
printf("\n");}
///////打印出path
printf("\n path矩阵:\n");
for(v=1;vvexnum;v++) //各对顶点之间的初始已知路径及距离
{
for(w=1;wvexnum;w++)
{
printf("%8d",path[v][w]);
}
printf("\n");
}
printf("偏心度为:");
for(w=1;wvexnum;w++)
{
int max=A[1][w];
for(v=1;vvexnum;v++)
{
if(max
{
max=A[v][w];
}
}
if(max==0)
max=INFINITY;
a[w]=max;
printf("%7d",a[w]);
}
printf("\n");
k=1;
min=a[1];
for(w=1;wvexnum;w++)
{
if(a[w]
{min=a[w];
k=w;}
}
printf("最适合建医院的村庄为:%d\n",k);
}
四、课程设计体会
计算机对我们的现实世界、现实生活具有很大的作用,人们能够通过计算机去解决现实的问题,我们正好通过编程去解决,对现在来说也是很大的帮助。
在数据结构的学习过程中,我们的能力有很大的提高,对我们的未来是一个很大的帮助,对我们的编程积累很大的经验。
我感受最深的一点是:以前用C编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。但现在编程感觉完全不同了。在编写一个程序之前,自己能够综合考虑各种因素,首先选取自己需要的数据结构,是树还是图或是别的什么?然后选定一种或几种存储结构来具体的决定后面的函数的主要风格。最后在编写每一个函数之前,可以仔细斟酌比对,挑选出最适合当前状况的算法。这样,即使在完整的程序还没有写出来之前,自己心中已经有了明确的原图了。这样无形中就提高了自己编写的程序的能力。
另外,我还体会到深刻理解数据结构的重要性。只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构。了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。