第一篇:数据结构课程设计报告
扬州大学信息工程学院
《数据结构》
---课程设计报告
题目: 校园导游咨询
班级: 学号: 姓名 指导教师:
一、设计题目
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
二、需求分析
要求:
(1)设计你所在学校的校园平面图,所含景点不少于10个,以图中顶点表示校内各景点,存放景点名称,代号,简介等信息;以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。实现提示:
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网。顶点和边均含有相关信息。
三、概要设计
1.创建校园图:
(1)先定义节点个数N,边的最大值(MAXedg),节点(景点名称、景点信息),邻接点,边,顶点向量,当前顶点数和边数。
(2)先给一个节点赋上其相关信息,然后再用p =(Node)malloc(sizeof(edgenode))语句申请下一结点,再给所申请的节点赋上相关信息,直到节点数为N=10为止。
(3)读入道路的起始点,为邻接矩阵的边赋相应的值。
(4)节点和边的相关信息都弄好了后,校园图也就创建好了。
2.利用函数Name给10个节点赋上相应的名称,利用函数Information给各节点添加相应的介绍信息。
3.利用函数travgraph来查找景点信息,要查找景点名称时调用Name函数,要查找景点介绍信息时调用Information函数。
4.手动创建一个校园图creat(Matrix_Graph *G),然后为相应的边赋上真正的值。
5.用path函数来求任意两景点之间的最短路径。
6.用main函数来输出结果:用switch语句分别输出,要创建校园图时调用creatgraph函数;查找景点相关信息时调用travgraph函数;要查找任意两景点之间的最短路径时,先输入你目前所在的位置,再输入你的目的地,最后调用path函数。
四、详细设计
typedef int AdjMatrix[MAX][MAX];typedef struct { int vexs[MAX];AdjMatrix arcs;}Matrix_Graph;//图的矩阵表示法。typedef struct edgenode { int adjvex;//临接点序号
int length;//道路长度
char info[10];//景点名称
char info2[100];//景点详细信息
struct edgenode *next;}edgenode, *Node;typedef struct { char name[10];//存储景点的名称.char information[100];//具体的介绍此景点
struct edgenode *link;//指向下一个景点 }vexnode;//景点及其信息.typedef struct Edge { int lengh;//边的权值,表示路径长度.int ivex, jvex;//边的两端顶点号
struct Edge *next;//指向下一条边 } EdgeType;//边及其信息.typedef struct { int num;//顶点编号。
char name[10];//顶点名称 } vertex;
typedef struct { vertex vexs[MAX];//顶点集合int edges[MAX][MAX];//临街矩阵 }adjmax;//adj
(1)首先创建一个校园图并用邻接矩阵存储,程序会自动调用creatgraph(g,&n,e,&adj),函数进入到创建校园图界面,用循环语句来完成:
for(i = 1;i <= b;i++){
fscanf(fp,“%d %d %dn”,&e[i].lengh,&e[i].ivex,&e[i].jvex);//读入道路长度和起始点
s = e[i].ivex;//s是起点,d是终点。
d = e[i].jvex;
len = e[i].lengh;
adj->edges[s][d] = e[i].lengh;//为邻接矩阵中相应的边赋值
adj->edges[d][s] = e[i].lengh;
p =(Node)malloc(sizeof(edgenode));//申请一个弧节点。
p->next = NULL;
q =(Node)malloc(sizeof(edgenode));
q->next = NULL;
p->adjvex = d;// 弧p指向的定点
p->length = len;
strcpy(p->info,g[d].name);//为景点赋名称
strcpy(p->info2,g[d].information);//为景点赋介绍信息
q->adjvex = s;// 弧q指向的定点
q->length = len;
strcpy(q->info,g[s].name);//为景点赋名称
strcpy(q->info2,g[s].information);//为景点赋介绍信息
p->next = g[s].link;//头插法建立邻接表
g[s].link = p;
q->next = g[d].link;
g[d].link = q;}
(2)调用Name(i)和information(i)完成对校园景点的名称和信息的介绍。
(3)当游客选择了要查找景点的信息的介绍这一项功能的时候,程序就会调用travgraph(g,n,adj);函数进入到查找景点的介绍的界面,当游客输入了需要查找的景点的名称的时候,程序利用循环语句:
do{
printf(“是否继续? Y/N”);
scanf(“%c”,&ch);
getchar();
if(ch == 'Y' || ch == 'y')//继续
{
flag = 1;
i = 1;
printf(“请输入您要查询的景点序号:n”);
scanf(“%d”,&len);
getchar();
printf(“此景点的名称是:”);
Name(len);
printf(“此景点的介绍是:”);
Information(len);
continue;
}
else
flag = 0;//不继续
break;}while(1);
(4)手动给校园图赋上相关信息(景点名称、代号、简介),路径及路径长度。得到一个模拟的校园图:
(5)当游客选择了要查找两个景点之间的最短距离这一项功能的时候,程序就会调用path(&G,i,j);函数进入到查找两个景点之间的最短距离的操作界面当中,当游客输入了两个景点的名称过后,程序会调用creat(&G);函数给校园图赋上相关信息(景点名称、代号、简介),路径及路径长度,然后调用path(&G,i,j);函数进入到查找最短路径问题的程序当中。for(i=0;i<=N;i++)
for(j=0;j<=N;j++)r[i][j]=0;//初始值为0。
for(i=1;i<=N;i++)
{
T[i]=-1;//初始值为-1。
flag[i]=1;//初始值为1。
d[i]=MAX;//路径长度初始值为无穷大,用MAX表示。
}
flag[s]=0;//修改标识。
while(c<=N)
{
t=MAX;
for(i=1;i<=N;i++)
if(flag[i]&&G->arcs[s][i] { t=G->arcs[s][i];v=i;r[v][1]=v;} for(i=1;i<=c;i++) for(j=1;j<=N;j++) if(flag[j]&&d[i]+G->arcs[T[i]][j] { t=d[i]+G->arcs[T[i]][j];v=j; if(r[v][0]!=-1) { u=1; while(r[T[i]][u]!=0) { r[v][u]=r[T[i]][u];u++;} } r[v][u]=v; } r[v][0]=-1; T[c]=v; flag[v]=0; d[c]=t; c++; } printf(“nThe path is:n(%d)”,s); j=1; while(r[e][j]!=0) { printf(“-->(%d)”,r[e][j]);j++;}//显示路径。 (6)主函数是一个程序的主体,当我们要进行我们所需要的操作的时候我们就要根据主函数中的显示信息和它给我们的相关的提示信息来进行所需要的操作。 五、测试数据及运行结果 1.运行结果界面: 2.由于我编写创建校园图的程序时,不会编写打开一个文本的程序,所以创建校园图的运行结果显示的是“打开文本错误”。 3.查找景点相关信息的结果: 4.查找最短路径的结果: 六、源程序 #define N 10 #define MAX 20 //图中顶点数的最大值 #define MAXedg 30 //图中边数的最大值 #include int length;//道路长度 char info[10];//景点名称 char info2[100];//景点详细信息 struct edgenode *next;}edgenode, *Node;typedef struct { char name[10];//存储景点的名称.char information[100];//具体的介绍此景点 struct edgenode *link;//指向下一个景点 }vexnode;//景点及其信息.typedef struct Edge { int lengh;//边的权值,表示路径长度.int ivex, jvex;//边的两端顶点号 struct Edge *next;//指向下一条边 } EdgeType;//边及其信息.typedef struct { int num;//顶点编号。 char name[10];//顶点名称 } vertex; typedef struct { vertex vexs[MAX];//顶点集合int edges[MAX][MAX];//临街矩阵 }adjmax;//adj FILE *fp;//文件的读取 void clrscr()//清屏 { system(“cls”);} void creatgraph(vexnode g[],int *n, EdgeType e[],adjmax *adj)//创建校园图 { int b,i,s,d,len;struct edgenode *p,*q;//定义图的结构体 if((fp = fopen(“file.txt”,“r”))== NULL)//打开文件 { printf(“文件打开错误!n”); getchar(); exit(0);} fscanf(fp,“%d %dn”,n,&b);//读入景点个数和边数 for(i = 1;i <= *n;i++)//读入景点名称和详细介绍信息 { fscanf(fp,“%s %sn”,&g[i].name,&g[i].information); strcpy(adj->vexs[i].name,g[i].name); g[i].link = NULL;//初始化 } for(i = 1;i <= b;i++){ fscanf(fp,“%d %d %dn”,&e[i].lengh,&e[i].ivex,&e[i].jvex);//读入道路长度和起始点 s = e[i].ivex;//s是起点,d是终点。 d = e[i].jvex; len = e[i].lengh; adj->edges[s][d] = e[i].lengh;//为邻接矩阵中相应的边赋值 adj->edges[d][s] = e[i].lengh; p =(Node)malloc(sizeof(edgenode));//申请一个弧节点。 p->next = NULL; q =(Node)malloc(sizeof(edgenode)); q->next = NULL; p->adjvex = d;// 弧p指向的定点 p->length = len; strcpy(p->info,g[d].name);//为景点赋名称 strcpy(p->info2,g[d].information);//为景点赋介绍信息 q->adjvex = s;// 弧q指向的定点 q->length = len; strcpy(q->info,g[s].name);//为景点赋名称 strcpy(q->info2,g[s].information);//为景点赋介绍信息 p->next = g[s].link;//头插法建立邻接表 g[s].link = p; q->next = g[d].link; g[d].link = q;} printf(“校园旅游图已经建立!n”);getchar();} void Name(int i){ switch(i){ case 1: printf(“1:学校正门nn”);break;case 2: printf(“2:教学楼区nn”);break;case 3: printf(“3:图书馆nn”);break;case 4: printf(“4:社团办公室nn”);break;case 5: printf(“5:宿舍区nn”);break;case 6: printf(“6:食堂nn”);break;case 7: printf(“7:校园商业区nn”);break;case 8: printf(“8:大操场nn”);break;case 9: printf(“9:校医院nn”);break;case 10: printf(“10: 大学活动中心nn”);break;default: printf(“景点编号输入错误!请输入1->10的数字编号!nn”);break;} } /*Name*/ void Information(int i){/*景点介绍*/ switch(i){ case 1: printf(“学校正门:正门旁边是一条宽敞的马路,交通方便;进门后直对面就是两栋高大的主楼,气势宏伟。nn”);break;case 2: printf(“教学楼区: 教学楼众多且形状各异,教室大小不一,适宜各种人数班级使用。nn”);break;case 3: printf(“图书馆: 学校信息资源中心,外表呈三角形,宏伟壮观,藏有大量各种书刊,设有电子查阅室和自习室,是学生学习的好地方。nn”);break;case 4: printf(“社团办公室:是学校各个学生组织开会,策划活动的办公处。nn”);break;case 5: printf(“宿舍区: 有八个公寓,是大部分学生的住所。nn”);break;case 6: printf(“食堂: 位于教学楼与宿舍区之间,里面有各个地方的小吃,味道不错,是学生就餐的主要餐厅。nn”);break;case 7: printf(“校园商业区:里面有书店、打印和复印的地方、教育超市、水果超市,为学生们提供了方便。nn”);break;case 8: printf(“大操场:有足球场,篮球场,是学生和老师体育锻炼的主要地方。nn”);break;case 9: printf(“校医院: 设备不太齐全,只能治疗一些常见的小病,但是价格很便宜。nnn”);break;case 10: printf(“大学活动中心:里面还可以举行各项文艺活动。nn”);break;default: printf(“景点编号输入错误!请输入1->10的数字编号!nn”);break;} }/*Information*/ void travgraph(vexnode g[],int n,adjmax adj)//查找指定景点信息 { int i = 1,flag = 1,len;//len存储要查询的景点的序号 char ch;printf(“请输入您要查询的景点序号:n”);scanf(“%d”,&len);getchar();printf(“此景点的名称是:”);Name(len);printf(“此景点的介绍是:”);Information(len);do{ printf(“是否继续? Y/N”); scanf(“%c”,&ch); getchar(); if(ch == 'Y' || ch == 'y')//继续 { flag = 1; i = 1; printf(“请输入您要查询的景点序号:n”); scanf(“%d”,&len); getchar(); printf(“此景点的名称是:”); Name(len); printf(“此景点的介绍是:”); Information(len); continue; } else flag = 0;//不继续 break;}while(1);} void creat(Matrix_Graph *G){ int i,j;for(i=1;i<=N;i++)G->vexs[i]=i;//初始化,0号位不用。 for(i=1;i<=N;i++) for(j=1;j<=N;j++)G->arcs[i][j]=0;//初始值为0。 G->arcs[1][2]=2;G->arcs[1][9]=5;//表示景点一到景点二的距离是2。 G->arcs[2][1]=2;G->arcs[2][3]=5;G->arcs[2][4]=4;G->arcs[2][9]=6;G->arcs[3][2]=5;G->arcs[3][4]=7;G->arcs[3][7]=5;G->arcs[3][9]=6;G->arcs[3][10]=6; G->arcs[4][2]=4;G->arcs[4][6]=7;G->arcs[4][10]=7; G->arcs[5][6]=4;G->arcs[5][7]=6;G->arcs[5][8]=8;G->arcs[6][4]=7;G->arcs[6][5]=4;G->arcs[6][7]=3;G->arcs[6][10]=7; G->arcs[7][6]=3;G->arcs[7][8]=4;G->arcs[7][10]=6; G->arcs[8][5]=8;G->arcs[8][7]=4;G->arcs[8][9]=9;G->arcs[9][1]=5;G->arcs[9][2]=6;G->arcs[9][3]=6;G->arcs[9][8]=9;G->arcs[10][3]=6;G->arcs[10][4]=7;G->arcs[10][6]=7;G->arcs[10][7]=6; for(i=1;i<=N;i++) for(j=1;j<=N;j++) if(G->arcs[i][j]==0)G->arcs[i][j]=MAX;//没有被重新赋值的,表示两景点之间 //没有路,用MAX表示无穷大。} void path(Matrix_Graph *G,int s,int e){ int i,j,u,c=1,t,v;int r[N+1][N+1];//用来存放路径上的景点。 int T[N],flag[N],d[N];for(i=0;i<=N;i++) for(j=0;j<=N;j++)r[i][j]=0;//初始值为0。 for(i=1;i<=N;i++) { T[i]=-1;//初始值为-1。 flag[i]=1;//初始值为1。 d[i]=MAX;//路径长度初始值为无穷大,用MAX表示。 } flag[s]=0;//修改标识。 while(c<=N) { t=MAX; for(i=1;i<=N;i++) if(flag[i]&&G->arcs[s][i] { t=G->arcs[s][i];v=i;r[v][1]=v;} for(i=1;i<=c;i++) for(j=1;j<=N;j++) if(flag[j]&&d[i]+G->arcs[T[i]][j] { t=d[i]+G->arcs[T[i]][j];v=j; if(r[v][0]!=-1) { u=1; while(r[T[i]][u]!=0) { r[v][u]=r[T[i]][u];u++;} } r[v][u]=v; } r[v][0]=-1; T[c]=v; flag[v]=0; d[c]=t; c++; } printf(“nThe path is:n(%d)”,s); j=1; while(r[e][j]!=0) { printf(“-->(%d)”,r[e][j]);j++;}//显示路径。 printf(“nn”);} void main()//主函数 { int i,j;Matrix_Graph G;creat(&G);int n = 0;//景点数目 vexnode g[MAX];//保存顶点及其信息 EdgeType e[MAXedg];//保存边及其信息 adjmax adj;//保存边和定点 char choice = 'x';while(1){ clrscr(); printf(“nnttt***校园导游系统***”);printf(“ntt*************************************nn”); printf(“ttt1.文件读入并创建校园图:nn”); printf(“ttt2.查询景点详细信息:nn”); printf(“ttt3.查找两景点间最短路径:nn”); printf(“ttt0.退出nn”); printf(“tttt2013/06/29”);printf(“ntt************************************nn”); printf(“Please enter your choice(0-3):n ”); choice = getchar(); switch(choice) { case '1': clrscr(); creatgraph(g,&n,e,&adj);//创建图(景点,景点数,边,边和景点) printf(“n打开文件错误n”); getchar(); break; case '2': clrscr(); travgraph(g,n,adj);//查询景点信息 getchar(); break; case '3': clrscr(); printf(“2你目前的位置是:n”); scanf(“%d”,&i); getchar(); printf(“2你的目的地是:n”); scanf(“%d”,&j); getchar(); } path(&G,i,j);//查找最短路径 getchar(); creat(&G); do{ printf(“是否继续? Y/N”); char ch; int flag=1; scanf(“%c”,&ch); getchar(); if(ch == 'Y' || ch == 'y')//继续 { flag = 1; i = 1; printf(“2你目前的位置是:n”); scanf(“%d”,&i); getchar(); printf(“2你的目的地是:n”); scanf(“%d”,&j); getchar(); path(&G,i,j);//查找最短路径 getchar(); creat(&G); continue; } else flag = 0;//不继续 break; }while(1); break;case '0': clrscr(); printf(“n*******按任意键退出********n”); getchar(); exit(0); break;default: printf(“n输入错误,请重新输入0-3之间的数字:n”); getchar(); break;} } getchar(); 计算机科学与工程系 数据结构课程设计报告 课程设计题目 迷宫 航班信息查询系统 学 号 姓 名 班 级 专 业 网络工程 完 成 时 间 2013-1-4 指 导 教 师 数据结构课程设计 迷宫 题目一 1.设计内容 1.1问题描述 求迷宫从入口到出口的所有路径。1.2设计要求 1.迷宫中不能使用递归算法查找路径。2.试探方向限定为上、下、左、右四个方向。3.迷宫采用随机生成和手工生成两种方式。4.生成从迷宫入口到出口的最短和最长路径。5.迷宫的入口和出口由键盘输入。 1.3开发环境 Visual C++6.0的集成化环境 1.4研究思路 对这样的矩形迷宫,可以用N*M的矩阵来描述,N和M分别代表迷宫的行数和列数。这样,迷宫中的每一个位置都可以用行号和列号来指定。从入口到出口的路径则是由一个位置构成的,每个位置上都没有障碍,且每个位置(第一个除外)都是前一个位置的东、南、西或北的邻居。为了描述迷宫中位置(i,j)处有无障碍,规定:当位置(i,j)处有一个障碍时,其值为1,否则为0。 经分析,一个简单的求解方法是:从入口出发,沿某一方向进行探索,若能走通,则继续向前走;否则沿原路返回,换一方向再进行搜索,直到所有可能的通路都探索到为止。即所谓的回溯法。 2.设计步骤 2.1 需求分析 (1)题目:迷宫的生成与路由。生成一个N*M(N行M列)的迷宫,0和 1-1数据结构课程设计 迷宫 在该程序中,首先进入的是菜单选择,在菜单中有3种选择,选1是手动输入迷宫函数;选2是随机自动生成迷宫;选3是退出程序。在手动生成迷宫时,有两种输出方式,一是矩阵输出,二是图形输出。在矩阵输出时,直接将数组中的数进行输出,在图形输出时,则要判断该点的情况,然后输入迷宫的出入口,再调用mgpath()函数进行判断是否存在路径,如果存在则将路径经过的点进行输出,并且将经过的点进入到辅助数组中(辅助数组是辅助图形界面的输出),并且将辅助数组初始为1,辅助数组中点为路径的重新赋值为0,然后根据情况输出图形界面。在自动生成迷宫时,用到了c语言随机函数,对于其它问题,和手动情况基本相同。 2.3 详细设计(1)主菜单伪代码: while(flag1){ } {shuru();//输入行列数 printf(“手动建立迷宫矩阵(0表示可通1表示障碍):n”);for(i=1;i<=m;i++) for(j=1;j<=n;j++)scanf(“%d”,&mg[i][j]);showplay(mg);// 迷宫输出 churukou();//迷宫出入口的输入 x=Mazepath(mg);// 判断路径函数 数据结构课程设计 迷宫 和“class ‘maze’has an illegal zero-sized array”两行错误。双击错误信息,找到出错的程序段,经过查阅资料发现,在利用顺序栈时,没有定义顺序栈的向量空间大小,导致程序出错。但不要对向量空间定义过大,否则会浪费空间。 (2)算法的时空分析: 由于链栈实际上是运算受限制的单链表。所以取栈顶元素运算的算法、置空栈运算的算法执行时间与问题的规模无关,则该算法的时间复杂度为O(1);而其入栈运算的算法与出栈运算的算法相当于在链表的表尾进行插入和删除操作,不需要移动元素,时间复杂度也为O(1)。建立迷宫矩阵的时间复杂度为O(x*y)。在查找路径的过程中,最坏的情况下可能要考察每一个非障碍的位置。因此,查找路径的时间复杂度应为O(unblocked)。 链栈的入栈算法、出栈算法、取栈顶元素算法、置空栈算法执行时所需要的空间都是用于存储算法本身所用的指令、常数、变量,各个算法的空间性能均较好。只是对于存放顺序栈的向量空间大小的定义很难把握好,如果定义过大,会造成不必要的空间浪费。所以在定义时要慎重考虑。 3.用户使用说明 运行该程序,运行的界面的会出现菜单界面,然后用户可根据界面的提示进行相应的操作,生成迷宫的方式有两种方式,手动生成和自动生成,手动生成时、,用户可根据自己的要求输入迷宫的格式,还需输入相应的入出口,确认程序就会生成相应的路径图形;自动生成只需输入所需的行数和列数,就会生成迷宫,接下来的操作和手动操作相同了。 图数据结构课程设计 迷宫 图1-2 图1-3 退出 5.总结与心得体会 本次课程设计过程中由于掌握的知识不牢固,在编程序的过程中得到了同学的帮助和指导,在此表示感谢。课程设计的过程中,遇到了一些问题,大部分是课本中的知识掌握的不牢固,还有就是在以前学习C++的过程中相关的知识掌握的不够全面。在以后的学习过程中,自己一定要把各种知识掌握牢固。 { } mg[i][j]=1;//初始化 矩阵,将最外围置为1 printf(“n输入迷宫入口:n”);scanf(“%d%d”,&x1,&y1);printf(“输入迷宫出口:n”);scanf(“%d%d”,&x2,&y2); }mlink;mlink *stack;//定义一个栈 int m,n,x1,x2,y1,y2;//定义全局变量 } void showplay(int mg[][M+2])//迷宫输出 { n“); for(i=1;i<=m;i++){ printf(”n“);for(j=1;j<=n;j++) printf(”%d “,mg[i][j]); int i,j; printf(”迷宫矩阵如下(0可通):printf(“输入行数:n”);scanf(“%d”,&m);printf(“输入列数:n”);scanf(“%d”,&n);数据结构课程设计 迷宫 } } printf(“n迷宫图形如下(白色for(i=1;i<=m;i++){ } printf(”n“);for(j=1;j<=n;j++){ } if(mg[i][j]==0)printf(” if(mg[i][j]==1)printf(“ if(mg[stack->row][stack->col+1]== p->next=stack; stack=p;{ p=(mlink 可通):n”);0)//下面位置可通 *)malloc(sizeof(mlink)); p->row=stack->row;p->col=stack->col+1;□“);//为0的输出□ ■”);//为1的输出■ //入栈 mg[stack->row][stack->col]=1;//将 } else 访问过的标记为1 int Mazepath(int mg[][N+2]){ mlink *p;if(mg[x1][y1]==0){ p=(mlink p->row=x1;p->col=y1;p->next=NULL;stack=p; //将入口 mg[stack->row][stack->col]=1;/while((!(stack->row==NULL& if(mg[stack->row][stack->col-1]==0)//上面可通 //入栈 stack=p; p->next=stack; { p=(mlink *)malloc(sizeof(mlink)); *)malloc(sizeof(mlink)); p->row=stack->row;p->col=stack->col-1;放入堆栈 /标志入口已访问 &stack->col==NULL))&&(!(stack->row==x2&&stack->col==y2)))//循环条件直到找到输入的出口 { mg[stack->row][stack->col]=1;//将 访问过的标记为1 数据结构课程设计 迷宫 void tonglu()//将坐标的顶点输出 { 始化 printf(“(%d%3d)n”,q->row,q->col); 情况 else printf(“□”);//0的 } q=stack;{ } for(i=0;i for(j=0;j = while(q!=NULL)//循环条件 q=q->next;for(j=0;j 情况 } void create(int mg[][N+2])//创建和菜单 { int i,j,x,choice,flag1=1;chushi();while(flag1){ } printf(“n”);printf(“所有通道为(由下而q=stack;{ 上):n”);while(q!=NULL)//循环条件 printf(“ ## printf(”# n“); *********选择菜单********** #n”); printf(“ ## printf(”输入选项:“);scanf(”%d“,&choice);switch(choice){ case 1://手动建立迷宫 { shuru(); printf(”手动建立for(i=1;i<=m;i++) n“); printf(”# 1-手动生成迷 宫 2-自动生成迷宫 3-退出 #n“);0;//将路径中的点赋给辅助数组a 形的界面输出 迷宫矩阵(0表示可通1表示障碍):n”); for(j=1;j<=n;j++)scanf(“%d”,&mg[i][j]); 数据结构课程设计 航班信息查询与检索系统 题目二 1.设计内容 1.1问题描述 设计一个航班信息查询系统,提供信息的管理和使用功能,管理包括更新、添加、删除功能。 1.2设计要求 (1)原始信息存储在文件中,记录不少于50条。(2)用户界面至少包括以下功能: 创建 修改(插入、添加、删除、更新) 查询 浏览 退出管理系统(3)航班信息包括: 航班号:字符序列,具体字符表达的意思上网查询 起点站和终点站:字符串 班期:指一周中哪些天有航班 起飞时间:可将时间定义成一个时、分组成的序列 到达时间:可将时间定义成一个时、分组成的序列 机型:字符序列,具体字符表达的意思上网查询 票价:整型数,具体值可上网查询 (4)创建是指从文件中读取数据,并存入所定义的顺序表中。 (5)可按航班号、起点站、终点站、起飞时间、到达时间等进行查询。查询时要用到顺序查找、二分查找方法。输出查询结果时必须排序。 (6)可按航班号、起点站、起飞时间、票价进行删除和更新操作,删除的记录存入另外的文件中,作为日志文件保存。 (7)作插入操作前,先对信息按起点站进行排序。新记录插入为起点站相同的最后一条记录。 数据结构课程设计 航班信息查询与检索系统 typedef struct node { Time rh;Time lv;}Pnode;(2)飞机结构体: struct Plane { };(3)静态链表: typedef struct Sqlist { int length;struct Plane *plane;char key[10],sted[20],sche[10];Time rh,lv;int price;}Sqlist;2.3 详细设计(1)主函数: do{printf(“* * * * * * * * * * * * * 航班查询系统* * * * * * * * * * * * *n”); printf(“* 1.创建 2.修改 3.查询 4.浏览 5.表长 6.文件 0.退出 *n”); printf(“* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *n”); scanf(“%d”,&opt);switch(opt){ case 1:Initlist(L);break; case 2:handle(L);break; case 3:search(L);break; case 4:print(L);break;case 5:Get_Sq(L);break;case 6:File(L);break; 数据结构课程设计 航班信息查询与检索系统 } }while(opt!=0);} (4)文件操作: void File(Sqlist &L){ int ch;do{ printf(“* * * * * * * * * * * * * * * * * * * * * * * * *n”); printf(“* *n”); printf(“* 1.保存信息到文件 2.从文件读取信息 0 退出 *n”); printf(“* *n”); printf(“* * * * * * * * * * * * * * * * * * * * * * * * *n”); printf(“请输入选项n”); scanf(“%d”,&ch); switch(ch) { case 1:SaveList(L);break; } }while(ch!=0);case 2:ReadList(L);break; case 0:printf(“退出!n”);break;} (5)浏览信息:就是循环使用输出函数,在此就不必多说了 2.4 调试分析 (1)在课设过程中,遇到问题时,通过与同学、老师交流,在图书馆查阅资料,使问题得以解决。 (2)算法中有许多不是很优化的地方。3.用户使用说明 程序运行后用户根据提示输入要进行的操作选项(应先选择创建选项,这样可以直接读取保存好的文件),然后选择要进行的操作选项。由于主菜单中有修改、查询和浏览项目,每个项目又有各自的子菜单,所以在进行管理和使用时要注意输入的元素是否正确,需按照提示输入。输入操作元素时,元素之间以空格隔开。程序将按输入的操作元素找到相应的算法,然后进行处理,然后将结果打 数据结构课程设计 航班信息查询与检索系统 图2-2 查询信息 图2-3插入 图2-4删除 数据结构课程设计 航班信息查询与检索系统 时就需要重新写出一个子函数,哪怕这个子函数就是在原有的一个子函数的基础上改那么一丁点的地方,例如航班信息查询系统中的查询函数,其实每个子函数只是改了一下关键码而已。 6.附录 #include { } void search_key(Sqlist L)//按航班号查找 { 号:“); Time rh;Time lv; scanf(”%s“,n);int i; printf(”此航班的航班号,起点char n[20]; printf(“请输入要查找的航班 printf(”%dn“,L.length);//表长 }Time;typedef struct node { }Pnode;struct Plane { };typedef struct Sqlist { int length;struct Plane *plane;char key[10],sted[20],sche[10];Time rh,lv;int price; 终点,班期,起飞时间,到达时间,票价:n”); if(strcmp(L.plane[i].key,n)==0) ted,L.plane[i].sche,L.plane[i].lv.hour,L.{ for(i=L.length-1;i>=0;i--){ printf(“%s %s %s %d:%d % d:%d %dn”,L.plane[i].key,L.plane[i].s}Sqlist;int get_Sq(Sqlist &L){ } void Get_Sq(Sqlist &L)return L.length; plane[i].lv.min,L.plane [i].rh.hour,L.plane[i].rh.min,L.plane [i].price); 0数据结构课程设计 航班信息查询与检索系统 printf(“此航班的航班号,起点 ted,{ 终点,班期,起飞时间,到达时间,票价:n”); if(L.plane[i].lv.hour<=hour) ted,L.plane[i].sche,L.plane[i].lv.hour,L.{ for(i=L.length-1;i>=0;i--){ printf(“%s %s %s %d:%d % d:%d %dn”,L.plane[i].key,L.plane[i].s L.plane[i].sche,L.plane[i].lv.hour,L.plane[i].lv.min,L.plane [i].rh.hour,L.plane[i].rh.min,L.plane } void search(Sqlist L){ int i;do { printf(“* * * * * * * * * * * } } printf(”%s %s %s %d:%d %d:%d %dn“,L.plane[i].key,L.plane[i].s[i].price);plane[i].lv.min,L.plane [i].rh.hour,L.plane[i].rh.min,L.plane } void search_rh(Sqlist L){ int hour;printf(”请输入你所要求的最scanf(“%d”,&hour);printf(“此航班的航班号,起点 } } [i].price); * * * * * * * * * * * * * ** * * * * * * * * * * * * * * *n”); printf(“* 1.航班号查询 2.起点终点查询 3.班期查询 4.起飞时间查询 5.到达时间查询 0.退出 *n”); printf(“* * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * *n”); scanf(“%d”,&i); switch(i) { case 晚时间:“);终点,班期,起飞时间,到达时间,票价:n”); if(L.plane[i].rh.hour<=hour)for(int i=L.length-1;i>=0;i--){ 1:search_key(L);break; 2数据结构课程设计 航班信息查询与检索系统 n“); } else { } printf(”查找不成功。 i--;if(i==0) { char c[20]; printf(“输入修改后的scanf(”%s“,c); 内容:”); strcpy(L.plane[i].sche,c); printf(“修改成功!n”);}break;{ int a,b; printf(“输入修改后的int opt;printf(”选择修改对象:“);scanf(”%d“,&opt);switch(opt){ case 1: printf(”修改成功!n“);printf(”修改成功!n“);{ char a[10];printf(”输入修改后的scanf(“%s”,a); case 4: 内容:“); char b[20];printf(”请输入修改后scanf(“%s”,b); scanf(“%d:%d”,&a,&b); L.plane[i].lv.hour=a;L.plane[i].lv.min=b;printf(“修改成功!n”);航班号:“); }break;{ int a,b; printf(”输入修改后的strcpy(L.plane[i].key,a);}break;{ case 5: case 2: 内容:“); scanf(”%d:%d“,&a,&b); L.plane[i].rh.hour=a;L.plane[i].rh.min=b;printf(”修改成功!n“);的内容:”);strcpy(L.plane[i].sted,b);}break; }break;{ int a; case 6: case 3: 4数据结构课程设计 航班信息查询与检索系统 *n“); printf(”* * * * * * * * * * * * * * * * * * * * * * * * *n“); printf(”请输入选项n“); scanf(”%d“,&ch); switch(ch) { case 1:SaveList(L);break;case 2:ReadList(L);break; L.plane[i].sche,&L.plane[i].lv.hour,&L.plane[i].lv.min,&L.plane [i].rh.hour,&L.plane[i].rh.min,&L.pl } void delet_Sq1(Sqlist &L){ char n[10];int i,j; printf(”请输入您要删除的航scanf(“%s”,n);if(L.length==0){ printf(“没有选项!n”);for(i=0;i L.length++; ane[i].price); case 0:printf(“退出!n”);break; } void Initlist(Sqlist &L)//插入存储 { “); 容:”);价n“); scanf(”%s%s%s%d:%d%d:%d%d“,L.plane[i].key,L.plane[i].sted, for(i=0;i 班期 起飞时间 到达时间 票scanf(”%d“,&n);L.length=0;L.plane=(Plane if(!L.plane)exit(0);printf(”请输入顺序表中的内 int i,n;printf(“输入表中航班的数量: } }while(ch!=0); 班号:”); if(strcmp(L.plane[i].key,n)==0) { printf(“所删除的班机*)malloc((n+10000)*sizeof(Plane));的信息:n”); printf(“n航班号 起点终点 printf(”%s %s %s %d:%d %d:% d %dn“,L.plane[i].key,L.plane[i].sted,L.plane[i].sche,L.plane[i].lv.hour,L.plane[i].lv.min,L.plane [i].rh.hour,L.plane[i].rh.min,L.plane [i].price); 6数据结构课程设计 航班信息查询与检索系统 n”);} printf(“无法打开文件!} }while(opt!=0); void insert_Sq(Sqlist &L){ 数量 价n”); for(i=0;i printf(“* * * * * * * * * * * scanf(”%s%s%s%d:%d%d:%d%d“,&L.plane[L.length].key,&L.plane[L.length].sted,&L.plane[L.length].sche,&L.plane[ { int a=get_Sq(L); printf(”请输入要添加班机的scanf(“%d”,&n); printf(“请输入要添加的班机printf(”n航班号 起点终点 int i,n; //n表示添加的fprintf(fp,“航班号:%sn起点站:%s 终点站:%sn班期:%dn起飞时间:%d:%d 到达时间:%d:%dn价格:%dnn”, p.key,p.sted,p.sche,p.lv.hour,p.lv.mi n“);} void delet_Sq(Sqlist &L){ int opt;do { fclose(fp);printf(”保存删除的信息成功。n,p.rh.hour,p.rh.min,p.price); 数量:“); 信息:n”); 班期 起飞时间 到达时间 票* * * * * * * * * *n“); printf(”* 1.航班号删除 printf(“* * * * * * * * * * printf(”输入你的选择:“);2.路线删除 0.退出 *n”);* * * * * * * * * * *n“); scanf(”%d“,&opt); switch(opt){ case 1:delet_Sq1(L);break; case 2:delet_Sq2(L);break; case 0:printf(”退出。} L.length].lv.hour,&L.plane[L.length].lv.min,&L.plane[L.length].rh.hour,&L.plan e[L.length].rh.min,&L.plane[L.length].price); } void handle(Sqlist &L){ } L.length++; n");break; 《数据结构》课程设计 哈希表实现电话号码查询系统一目的 利用《数据结构》课程的相关知识完成一个具有一定难度的综合设计题目,利用C/C++语言进行程序设计,并规范地完成课程设计报告。通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。 二需求分析 1、程序的功能 1)读取数据 ① 读取原电话本存储的电话信息。 ② 读取系统随机新建电话本存储的电话信息。2)查找信息 ① 根据电话号码查询用户信息。② 根据姓名查询用户信息。3)存储信息 查询无记录的结果存入记录文档。 2、输出形式 1)数据文件“old.txt”存放原始电话号码数据。 2)数据文件“new.txt”存放有系统随机生成的电话号码文件。3)数据文件“out.txt”存放未查找到的电话信息。4)查找到相关信息时显示姓名、地址、电话号码。 3、初步测试计划 1)从数据文件“old.txt”中读入各项记录,或由系统随机产生各记录,并且把记录保存到“new.txt”中。 2)分别采用伪随机探测再散列法和再哈希法解决冲突。3)根据姓名查找时显示给定姓名用户的记录。4)根据电话号码查找时显示给定电话号码的用户记录。 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 1 《数据结构》课程设计 5)将没有查找的结果保存到结果文件Out.txt中。 6)系统以菜单界面工作,运行界面友好,演示程序以用户和计算机的对话方式进行。 三概要设计 1、子函数功能 int Collision_Random(int key,int i)//伪随机数探量观测再散列法处理冲突 void Init_HashTable_by_name(string name,string phone,string address)//以姓名为关键字建立哈希表 int Collision_Rehash(int key,string str)//再哈希法处理冲突 void Init_HashTable_by_phone(string name,string phone,string address)//以电话号码为关键字建立哈希表 void Outfile(string name,int key)//在没有找到时输出未找到的记录,打开文件out.txt并将记录储存在文档中 void Outhash(int key)//输出哈希表中的记录 void Rafile()//随机生成数据,并将数据保存在new.txt void Init_HashTable(char*fname,int n)//建立哈希表 int Search_by_name(string name)//根据姓名查找哈希表中的记录 int Search_by_phone(string phone)//根据电话号码查找哈希表中的记录 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 2 《数据结构》课程设计 2、函数调用图 main()Refile()init-hashtable()init-hashtable-by-name()init-hashtable-by-phone()Seach-by-name()Seach-by-phone()Coiiision-random()Collision-rehash()Outhash()xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 3 《数据结构》课程设计 四详细设计 1、主函数流程图 开始选择数据来源21建“new.txt”选择查找方式12姓名查找电话号码查找12021输入姓名显示哈希表0显示哈希表输入电话号码无此记录显示信息无此记录显示信息0写入“out.txt”写入“out.txt”结束 2、“伪随机探测再散列处理冲突”伪代码 若对应位置上已经存在其他数据,则新的关键字=(原关键字+伪随机数)%哈希表长。若新的位置上也存在其他数据,则用伪随机序列的下一个数求新的关键字,直到找到合适的位置。 3、“再哈希法处理冲突”伪代码 用“折叠法”将电话号码的ASCII码值定义为关键字,分别为前四位、中四位、后三位。 再用“除留余数法”求的新的关键字=原关键字%哈希表长。 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 《数据结构》课程设计 4、“以姓名为关键字建立哈希表”伪代码 用“除留余数法”将姓名的ASCII码值定义为关键字。 若对应位置上存在其他数据,则调用伪随机处理冲突,然后将数据存入哈希表。 5、“以电话号码为关键字建立哈希表”伪代码 用“除留余数法”将电话号码的ASCII码值定义为关键字。若对应位置上存在其他数据,则调用再哈希处理冲突。然后将数据存入哈希表。 五调试分析 1、程序的关键是掌握文件的相关操作、哈希函数的创建和运用、伪随机法处理冲突、再哈希法处理冲突等。在编程的过程中,出现了很多问题,如文件无法正常打开、程序进入死循环、无法实现文件的写入操作、忘了添加头文件等错误。修改后程序运行正确。 2、创建“new.txt”内容用子函数来实现,但是原数据是从“old.txt”文件中读取的,刚开始不知道怎样实现二者之间的选择,在同学和参考书的帮助下终于得到解决。 3、关于伪随机和再哈希的相关内容觉得很难懂,看了很久参考书才有所了解 六测试结果 1、根据姓名查找 1)姓名查找成功 2)姓名查找失败 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 5 《数据结构》课程设计 3)哈希表 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 6 《数据结构》课程设计 2、根据电话号码查找 1)电话号码输入错误 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 7 《数据结构》课程设计 2)电话号码查询成功 3)电话号码查询失败 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 8 《数据结构》课程设计 4)哈希表 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 9 《数据结构》课程设计 七用户使用说明 1、选择数据来源 根据提示信息进行操作,选择已存在的“old.txt”文件中的数据或系统当前自动生成的“new.txt”文件。 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 10 《数据结构》课程设计 2、选择查找方式 根据提示信息进行操作,选择“根据姓名查找”或“根据电话号码查找”两种查找方式。 3、选择功能 根据提示信息进行操作,选择输入已知信息或查看哈希表。 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 11 《数据结构》课程设计 4、显示结果 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 《数据结构》课程设计 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 13 《数据结构》课程设计 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 14 《数据结构》课程设计 5、查看文件 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 15 《数据结构》课程设计 八课程设计总结 1、收获 学会了C++的跟踪。更进一步了解和熟悉了关于哈希表的运用和文件的读取与写入操作。同时锻炼了对话形式的菜单的创建和熟练运用。 2、心得体会 在这次数据结构设计中遇到了很多实际性的问题,在实际设计中才发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题要不断地更正以前的错误思维。通过这次设计,我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 16 《数据结构》课程设计 学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。我觉得作为一名计科专业的学生,这次课程设计是很有意义的。更重要的是如何把自己平时所学的东西应用到实际中。虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,也没有很有效的办法通过自身去理解,但是靠着学习,渐渐对这门课逐渐产生了些许的兴趣,自己开始主动学习并逐步从基础慢慢开始弄懂它。 xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 《数据结构》课程设计 附录:源程序 #include using namespace std; ifstream in_file;ofstream out_file; int D[10]={1,3,5,8,13,15,17,21,27,34};//伪随机数序列 int count;//当前数据元素个数 int sizeindex;//哈希表的长度 char *sign;//冲突的标志 struct Data { string name;string phone;string address;};Data *intermediate_data; int Collision_Random(int key,int i)//伪随机数探量观测再散列法处理冲突{ int Re_key;if(sign[key]=='1'){ xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 18 《数据结构》课程设计 } Re_key=(key+D[i])%sizeindex;return Re_key;//归回新的要害码 return-1;} void Init_HashTable_by_name(string name,string phone,string address)//以姓名为关键字建立哈希表 { int i=0;int key;char*p;for(key=0,p=&name[0];*p;p++)key=key+*p;key=key%42;while(sign[key]=='1'){ } if(key==-1)exit(1);key=Collision_Random(key,i+1);count++;intermediate_data[key].name=name;//将数据存入哈希表 intermediate_data[key].address=address;intermediate_data[key].phone=phone;sign[key]='1';//设置冲突标志 } xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 19 《数据结构》课程设计 int Collision_Rehash(int key,string str)//再哈希法处理冲突 { int Re_key;int num1=(str[0]-'0')*1000+(str[1]-'0')*100+(str[2]-'0')*10+(str[3]-'0');int num2=(str[4]-'0')*1000+(str[5]-'0')*100+(str[6]-'0')*10+(str[7]-'0');int num3=(str[8]-'0')*100+(str[9]-'0')*10+(str[10]-'0');Re_key=num1+num2+num3;Re_key=(Re_key+key)%sizeindex;return Re_key;} void Init_HashTable_by_phone(string name,string phone,string address)//以电话号码为关键字建立哈希表 { int key;char*p;for(key=0,p=&phone[0];*p;p++)key=key+*p;key=key%42;while(sign[key]=='1'){ } count++;intermediate_data[key].name=name;intermediate_data[key].address=address;intermediate_data[key].phone=phone;key=Collision_Rehash(key,phone);xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 20 《数据结构》课程设计 sign[key]='1';} void Outfile(string name,int key)//在没有找到时输出未找到的记录,打开文件out.txt并将记录储存在文档中 { if((key==-1)||(sign[key]=='0')){ out_file.open(“out.txt”); if(out_file.fail()) { cout<<“n”<<“文件打开失败!!n”< exit(1); } out_file< out_file.close();} } void Outhash(int key)//输出哈希表中的记录 { unsigned i;if((key==-1)||(sign[key]=='0')){ cout<<“n”<<“无此记录!!n”< } else xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 21 《数据结构》课程设计 { for(i=0;i cout< for(i=0;i<8;i++) cout<<“ ”; cout< for(i=0;i<8;i++) cout<<“ ”; cout< void Rafile()//随机生成数据,并将数据保存在new.txt { int i,j;out_file.open(“new.txt”);if(out_file.fail()){ cout<<“n”<<“文件打开失败!!n”< exit(1);} for(j=0;j<30;j++){ string name=“"; for(i=0;i<20;i++) name+=rand()%26+'a';out_file< 《数据结构》课程设计 string phone=”“; for(i=0;i<11;i++) phone+=rand()%10+'0'; out_file< string address=”“; for(i=0;i<29;i++) address+=rand()%26+'a'; address+=','; out_file< void Init_HashTable(char*fname,int n)//建立哈希表{ string name=”“;string phone=”“;string address=”“;int i,j;in_file.open(fname);if(in_file.fail()){ cout<<”n“<<”文件打开失败!!n“< exit(1);} while(!in_file.eof()){ xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 23 《数据结构》课程设计 字 键字 } char* str=new char[100];name=”“;phone=”“;address=”“;in_file.getline(str,100,'n');//按行读入数据 if(str[0]=='*')//判断数据结束 i=0;while(str[i]<=97||str[i]>=122)i++;break;for(;str[i]!=' ';i++)name+=str[i];while(str[i]==' ')i++;for(j=0;str[i]!=' ';j++,i++)phone+=str[i];while(str[i]==' ')i++;for(j=0;str[i]!=',';j++,i++)address+=str[i];if(n==1)Init_HashTable_by_name(name,phone,address);//以姓名为关键else Init_HashTable_by_phone(name,phone,address);//以电话号码为关delete str;in_file.close();} xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 《数据结构》课程设计 int Search_by_name(string name)//根据姓名查找哈希表中的记录 { int i=0;int j=1;int key;char*p;for(key=0,p=&name[0];*p;p++)key=key+*p;key=key%42;while(sign[key]=='1'&&(intermediate_data[key].name!=name)){ key=Collision_Random(key,i+1); j++; if(j=count) return-1;} return key;} int Search_by_phone(string phone)//根据电话号码查找哈希表中的记录{ int key;char*p;for(key=0,p=&phone[0];*p;p++)key=key+*p;key=key%42;int j=1;xxxx大学xxxx学院xxxx专业学号:xxxxxxx姓名:jenery6 25 《数据结构》课程设计 while(sign[key]=='1'&&(intermediate_data[key].phone!=phone)){ key=Collision_Rehash(key,phone); j++; if(j=count) return-1;} return key;} void main(){ count=0;sizeindex=50;int i,k;int ch;char *Fname; sign=new char[sizeindex]; intermediate_data=new Data[sizeindex]; for(i=0;i第二篇:数据结构课程设计报告
第三篇:数据结构课程设计报告