//该课程设计纯手工制作,,但是美中不足的是,没有想出很好的方法计算出无向网络中任意的两个顶点之间的最短路径。。。该题是基于相应的应用将最短路径求出,存储在二维数组中,再将其输出。。。汗颜。。。
一、 课程设计目的 ****************************************
二、 课程内容及要求 ***************************************
三、 需求分析 ***************************************
四、 总体分析 ***************************************
五、 总结 ****************************************
六、 源代码 *****************************************
一、课程设计目的
通过数据结构的课程设计,深刻理解各种存储结构的应用。通过不断的编程设计锻炼思维逻辑和解决综合性实际问题的能力。
二、课程设计内容及要求
三、需求分析
由题目可知该问题用到数据结构中图的应用,构建图的类型存储结构。
构建景点结构为如下图所示:
存储影像如下图所示:
四
4.0头文件和类型定义
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<conio.h>/*清屏函数*///system("cls");
#include<cstdlib>
#define MAX 50
#define XXX 500
typedef charElemtype;
typedef structABC
{
char xinxi[XXX];
struct ABC *next;
}ABC;
typedef structnode
{
int adjno;
int len;
struct node *next;
}node; //链表表结点类型定义
typedef struct
{
Elemtype data;
ABC *last;
node *first;
}headnode; //链表头结点类型定义
typedef struct
{
headnode data[MAX];
int vexsnum; //记录顶点的个数
int arcnum; //记录边的个数
}zongjiegou; //总体结点的类型定义
4.1动态创建
zongjiegoucreat()
{
zongjiegou H;
int i;
node *p=NULL;
ABC *q=NULL;
printf("输入顶点的个数:\n");
scanf("%d",&H.vexsnum);
printf("输入边的个数:\n");
scanf("%d",&H.arcnum);
for(i=1;i<=H.vexsnum;i++)
{
printf("输入第%d个数据的值:",i);
scanf("%1s",&H.data[i].data);
H.data[i].first=NULL;
H.data[i].last=NULL;
}
for(i=1;i<=H.vexsnum;i++)
{
printf("输入编号为%d的数据的邻接顶点编号和与其路径长度:\n",i);
do {
p=(struct node*)malloc(sizeof(node));
scanf("%d,%d",&p->adjno,&p->len);
if(p->adjno == 0)
{
break;
}
p->next=H.data[i].first;
H.data[i].first=p;
}while(p->adjno != 0);//当输入为零时结束while循环
q=(struct ABC *)malloc(sizeof(ABC));
printf("\t输入顶点%d的备注信息:\n",i);
scanf("%s",&q->xinxi);
q->next=NULL;
H.data[i].last=q;
}
return H;
system("cls");
getch();
}
4.2查找信息
voidlookinformation(zongjiegou H)
{
int i;
ABC *p=NULL;
printf("\t请输入要查看的景点的编号:");
scanf("%d",&i);
p=H.data[i].last;
printf("\t这就是您要查看景点的所有信息\n");
printf("\t");
printf("%s",p->xinxi);
printf("\n");
getch();
system("cls");
}
4.3最短路径查询
voidshortestpath(zongjiegou H)
{
int i,j;
int a[MAX][MAX];
node *p=NULL;
a[1][2]=5;a[1][3]=7;a[1][4]=9;a[1][5]=9;a[1][6]=9;a[1][7]=9;a[1][8]=9;a[1][9]=9;a[1][10]=9;
a[2][3]=2;a[2][4]=4;a[2][5]=5;a[2][6]=6;a[2][7]=8;a[2][8]=5;a[2][9]=7;a[2][10]=3;
a[3][4]=2;a[3][5]=4;a[3][6]=4;a[3][7]=6;a[3][8]=7;a[3][9]=5;a[3][10]=5;
a[4][5]=2;a[4][6]=6;a[4][7]=8;a[4][8]=9;a[4][9]=7;a[4][10]=7;
a[5][6]=8;a[5][7]=10;a[5][8]=9;a[5][9]=9;a[5][10]=7;
a[6][7]=2;a[6][8]=11;a[6][9]=9;a[6][10]=9;
a[7][8]=8;a[7][9]=11;a[7][10]=6;
a[8][9]=5;a[8][10]=2;
a[9][10]=7;
printf("\t输入需要查找的任意两个景点的编号:");
scanf("%d,%d",&i,&j);
printf("\t%d与%d之间的最短路径为%d\n",i,j,a[i][j]);
getch();
system("cls");
}
4.4存储文件信息
void savefile(zongjiegouH)
{
int i;
node *p=NULL;
ABC *q=NULL;
FILE *fp=NULL;
if((fp=fopen("C:\\校园景区.txt","w+"))==NULL)
{
printf("错误!\n");
exit(0);
}
fputc(H.vexsnum,fp);
fputc(H.arcnum,fp);
for(i=1;i<=H.vexsnum ;i++)
{
p=H.data[i].first;
q=H.data[i].last ;
while(p!=NULL)
{
fputc(p->adjno,fp);
fputc(' ',fp);
fputc(p->len,fp);
fputs(q->xinxi,fp);
p=p->next;
}
}
printf("\t打印完毕!\n");
system("cls");
}
4.5显示代号
void show()
{
printf("\t景点代号为:\n");
printf("\tA:一教\n");
printf("\tB:二教\n");
printf("\tC:科技楼\n");
printf("\tD:文科楼\n");
printf("\tE:实训中心\n");
printf("\tF:艺术设计中心\n");
printf("\tG:学生食堂\n");
printf("\tH:西区食堂\n");
printf("\tI:男生宿舍\n");
printf("\tJ:女生宿舍\n");
getch();
system("cls");
}
4.6主函数
void main()
{
system("color 2f");
int i;
zongjiegou H;
printf("\t首先请创建校园平面图\n");
H=creat();
do
{
printf("\t**********欢迎来到湖北工业大学**********\n\n");
printf("\t1.查询某个相应景点信息\n");
printf("\t2.查找任意两个景点之间的最短路径\n");
printf("\t3.查看景点代号信息\n");
printf("\t4.存储文件内容\n");
printf("\t0.退出系统\n");
printf("\t");
scanf("%d",&i);
switch(i)
{
case 1: system("cls");lookinformation(H);break;
case 2: system("cls");shortestpath(H);break;
case 3: system("cls"); show();break;
case 4: system("cls");savefile(H);break;
}
}while(i!=0);
}
五、总结
经过这么多天的努力这份课程设计算是圆满完成了。熟练的应用了数据结构的类型结构。在这份课程设计中我应用了图的类型定义和存储结构的定义。通过这个简单的课程设计,让我深刻的体会到要想学好c语言这门课程是非常不容易的。在这个课程设计里把c语言的精华全部都体现出来了,让我看到了c语言的诱人之处,看到了它的神奇之处。在这短短的几天里我也深刻的体会到作为一个程序员是多么辛苦的是,整天都是对着电脑敲程序,有时候半天都不抬一下头,完全沉静在自己的程序世界里,仿佛整个世界都与他无关似的。这也更加充分的说明了那句话:程序员是孤独的。“众里寻他千百度,蓦然回首,那人还在敲程序。。。。。。”
六、源代码
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<conio.h>/*清屏函数*///system("cls");
#include<cstdlib>
#define MAX 50
#define XXX 500
typedef charElemtype;
typedef structABC
{
char xinxi[XXX];
struct ABC *next;
}ABC;
typedef structnode
{
int adjno;
int len;
struct node *next;
}node; //链表表结点类型定义
typedef struct
{
Elemtype data;
ABC *last;
node *first;
}headnode; //链表头结点类型定义
typedef struct
{
headnode data[MAX];
int vexsnum; //记录顶点的个数
int arcnum; //记录边的个数
}zongjiegou; //总体结点的类型定义
zongjiegoucreat()
{
zongjiegou H;
int i;
node *p=NULL;
ABC *q=NULL;
printf("输入顶点的个数:\n");
scanf("%d",&H.vexsnum);
printf("输入边的个数:\n");
scanf("%d",&H.arcnum);
for(i=1;i<=H.vexsnum;i++)
{
printf("输入第%d个数据的值:",i);
scanf("%1s",&H.data[i].data);
H.data[i].first=NULL;
H.data[i].last=NULL;
}
for(i=1;i<=H.vexsnum;i++)
{
printf("输入编号为%d的数据的邻接顶点编号和与其路径长度:\n",i);
do {
p=(struct node *)malloc(sizeof(node));
scanf("%d,%d",&p->adjno,&p->len);
if(p->adjno == 0)
{
break;
}
p->next=H.data[i].first;
H.data[i].first=p;
}while(p->adjno != 0);//当输入为零时结束while循环
q=(struct ABC *)malloc(sizeof(ABC));
printf("\t输入顶点%d的备注信息:\n",i);
scanf("%s",&q->xinxi);
q->next=NULL;
H.data[i].last=q;
}
return H;
system("cls");
getch();
}
voidlookinformation(zongjiegou H)
{
int i;
ABC *p=NULL;
printf("\t请输入要查看的景点的编号:");
scanf("%d",&i);
p=H.data[i].last;
printf("\t这就是您要查看景点的所有信息\n");
printf("\t");
printf("%s",p->xinxi);
printf("\n");
getch();
system("cls");
}
voidshortestpath(zongjiegou H)
{
int i,j;
int a[MAX][MAX];
node *p=NULL;
a[1][2]=5;a[1][3]=7;a[1][4]=9;a[1][5]=9;a[1][6]=9;a[1][7]=9;a[1][8]=9;a[1][9]=9;a[1][10]=9;
a[2][3]=2;a[2][4]=4;a[2][5]=5;a[2][6]=6;a[2][7]=8;a[2][8]=5;a[2][9]=7;a[2][10]=3;
a[3][4]=2;a[3][5]=4;a[3][6]=4;a[3][7]=6;a[3][8]=7;a[3][9]=5;a[3][10]=5;
a[4][5]=2;a[4][6]=6;a[4][7]=8;a[4][8]=9;a[4][9]=7;a[4][10]=7;
a[5][6]=8;a[5][7]=10;a[5][8]=9;a[5][9]=9;a[5][10]=7;
a[6][7]=2;a[6][8]=11;a[6][9]=9;a[6][10]=9;
a[7][8]=8;a[7][9]=11;a[7][10]=6;
a[8][9]=5;a[8][10]=2;
a[9][10]=7;
printf("\t输入需要查找的任意两个景点的编号:");
scanf("%d,%d",&i,&j);
printf("\t%d与%d之间的最短路径为%d\n",i,j,a[i][j]);
getch();
system("cls");
}
voidsavefile(zongjiegou H)
{
int i;
node *p=NULL;
ABC *q=NULL;
FILE *fp=NULL;
if((fp=fopen("C:\\校园景区.txt","w+"))==NULL)
{
printf("错误!\n");
exit(0);
}
fputc(H.vexsnum,fp);
fputc(H.arcnum,fp);
for(i=1;i<=H.vexsnum ;i++)
{
p=H.data[i].first;
q=H.data[i].last ;
while(p!=NULL)
{
fputc(p->adjno,fp);
fputc(' ',fp);
fputc(p->len,fp);
fputs(q->xinxi,fp);
p=p->next;
}
}
printf("\t打印完毕!\n");
system("cls");
}
void show()
{
printf("\t景点代号为:\n");
printf("\tA:一教\n");
printf("\tB:二教\n");
printf("\tC:科技楼\n");
printf("\tD:文科楼\n");
printf("\tE:实训中心\n");
printf("\tF:艺术设计中心\n");
printf("\tG:学生食堂\n");
printf("\tH:西区食堂\n");
printf("\tI:男生宿舍\n");
printf("\tJ:女生宿舍\n");
getch();
system("cls");
}
void main()
{
system("color 2f");
int i;
zongjiegou H;
printf("\t首先请创建校园平面图\n");
H=creat();
do
{
printf("\t**********欢迎来到湖北工业大学**********\n\n");
printf("\t1.查询某个相应景点信息\n");
printf("\t2.查找任意两个景点之间的最短路径\n");
printf("\t3.查看景点代号信息\n");
printf("\t4.存储文件内容\n");
printf("\t0.退出系统\n");
printf("\t");
scanf("%d",&i);
switch(i)
{
case 1: system("cls");lookinformation(H);break;
case 2: system("cls");shortestpath(H);break;
case 3: system("cls"); show();break;
case 4: system("cls");savefile(H);break;
}
}while(i!=0);
}