困扰我一天了的数据结构实习题目——校园导游系统

tianshilei1992 2011-12-14 08:20:14
这个周要做数据结构课程设计,学校要求设计一个校园导游系统,然后自己各种照着葫芦画瓢写完了代码,运行倒是可以编译通过,但是运行起来就报错误,不知道哪里出错了……后天就要上交了,这现在还不知道哪里出错了……所以请大家帮忙看一下了……

#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 14
#define MAXSIZE 14
#define INFINITY 32768
#define True 1
#define False 0

typedef int WeightType;
typedef WeightType AdjType;

/*线性表结构体*/
typedef struct {
int elem[MAXSIZE];
int last;
}SeqList;

/*初始化顺序表*/
void InitList(SeqList *L)
{
int i;
for (i = 0; i < MAXSIZE; i++)
L -> elem[i] = 0;
L -> last = -1;
}

typedef SeqList VertexSet;

typedef struct Node
{
int data;
struct Node *next;
}LinkQueueNode;

typedef struct
{
LinkQueueNode *front;
LinkQueueNode *rear;
}LinkQueue;

int InitQueue(LinkQueue *Q)//初始化队列
{
Q -> front = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if (Q -> front != NULL)
{
Q -> rear = Q -> front;
Q -> front -> next = NULL;
return(True);
}
else return(False);
}

int Empty(LinkQueue Q)//判断队列是否为空
{
if (Q.front == Q.rear) return(True);
else return(False);
}

int EnterQueue(LinkQueue *Q, int x)//入队
{
LinkQueueNode *NewNode;
NewNode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if (NewNode != NULL)
{
NewNode -> data = x;
NewNode -> next = NULL;
Q -> rear -> next = NewNode;
Q -> rear = NewNode;
return(True);
}
else return(False);
}

int DeleteQueue(LinkQueue *Q, int *x)//出队
{
LinkQueueNode *p;
if (Q -> front = Q -> rear)
return(False);
p = Q -> front -> next;
Q -> front -> next = p -> next;
if (Q -> rear == p)
Q -> rear = Q -> front;
*x = p -> data;
free(p);
return(True);
}

typedef struct ArcNode {
AdjType adj;
}ArcNode;//弧信息

typedef struct {
int vertex[MAX_VERTEX_NUM+1];//结点信息,这里用数字描述
ArcNode arcs[MAX_VERTEX_NUM+1][MAX_VERTEX_NUM+1];
int vexnum, arcnum;
}AdjMatrix;//邻接矩阵

void PrintMainMenue();
void BestPathMenue();
void ShortestPathMenue();
void AllPathMenue();

/*访问结点信息*/
void visit(int v0)
{
printf("%d ", v0);
}

/*创建一个校园网络图*/
void CreateUDG(AdjMatrix *G)
{
FILE *fp;
fp = fopen("VertexWeight.txt", "r");
int i, j, x, y, z;
G -> vexnum = 15;
G -> arcnum = 46;
for (i = 0; i < G -> vexnum; i++)
G -> vertex[i] = i;
for (i = 0; i < G -> vexnum; i++)//初始化邻接矩阵
{
for (j = 0; j < G -> vexnum; j++)
G -> arcs[i][j].adj = INFINITY;
}
for (i = 0; i < G -> vexnum; i++)
G -> arcs[i][i].adj = 0;
for (i = 0; i < G -> vexnum; i++)//从文件VertexWeight.txt中读取弧权值
{
fscanf(fp, " %d %d %d", &x, &y, &z);
G -> arcs[x][y].adj = G -> arcs[y][x].adj = z;
}
fclose(fp);
}

int visited1[MAX_VERTEX_NUM];//深度优先遍历访问标志数组

/*采用邻接矩阵的DepthFirstSearch*/
void DepthFirstSearch(AdjMatrix g, int v0)
{
int vj;
visit(v0);
visited1[v0] = True;
for (vj = 0; vj < g.vexnum; vj++)
if(! visited1[vj] && g.arcs[v0][vj].adj != INFINITY)
DepthFirstSearch(g, vj);
}

/*打印任意两个景点之间的所有简单路径(深度优先遍历)*/
void AllPath(AdjMatrix g)
{
int vi;
for (vi = 0; vi < g.vexnum; vi++) visited1[vi] = False;
for (vi = 0; vi < g.vexnum; vi++)
if (!visited1[vi])
DepthFirstSearch(g, vi);
system("PAUSE");
}

/*求v相当于w的下一个邻接点*/
int NextAdjVertex(AdjMatrix g, int v, int w)
{
int i;
for (i = w; i < g.vexnum; i++)
if (g.arcs[v][i].adj != INFINITY) return(i);
}

/*求v的第一个邻接点*/
int FirstAdjVertex(AdjMatrix g, int v)
{
int i;
for (i = 0; i < g.vexnum; i++)
if (g.arcs[v][i].adj != INFINITY) return(i);
}

int visited2[MAX_VERTEX_NUM];//广度优先遍历访问标志数组

/*最短简单路径查询(中转次数最少)广度优先遍历图g*/
void ShortestPath(AdjMatrix g, int v0, int v)
{
int vi, w;
for (vi = 0; vi < g.vexnum; vi++) visited2[vi] = False;
printf("\t\t");
visit(v0);
visited2[v0] = True;
LinkQueue Q;
InitQueue(&Q);
EnterQueue(&Q, v0);
while (!Empty(Q))
{
DeleteQueue(&Q, &v);
w = FirstAdjVertex(g, v);
while (w != -1)
{
if (!visited2[w])
{
visit(w);
visited2[w] = True;
EnterQueue(&Q, w);
}
w = NextAdjVertex(g, v, w);
}
}
printf("%d", v);
}

/*表尾添加操作*/
void AddTail(VertexSet *path, int vertex)
{
int i = path -> last;
path -> elem[i + 1] = vertex;
path -> last++;
}

/*判断vertex是否是s中的成员,如果是返回True,反之返回False*/
int Member(int vertex, VertexSet s)
{
int i;
int j = s.last;
for (i = 0; i < j; i++)
if ( s.elem[i] == vertex) return True;
return False;
}

/*Dijkstra计算最佳访问路线(路径长度最短)*/
void BestPath(AdjMatrix g, int v0, int v)
{
int i, j, k , t, min;
WeightType dist[MAX_VERTEX_NUM];
VertexSet s, path[MAX_VERTEX_NUM];
for (i = 0; i < g.vexnum; i++)
{
InitList(&path[i]);
dist[i] = g.arcs[v0][i].adj;
if (dist[i] < INFINITY)
{
AddTail(&path[i], g.vertex[v0]);
AddTail(&path[i], g.vertex[i]);
}
}
InitList(&s);
AddTail(&s, g.vertex[v0]);
for ( t = 1; t <= g.vexnum - 1; t++)
{
min = INFINITY;
for ( i = 0; i < g.vexnum; i++)
if (! Member(g.vertex[i], s) && dist[i] < min)
{
k = i;
min = dist[i];
}
if (min == INFINITY) return;
AddTail(&s, g.vertex[k]);
for ( i = 0; i < g.vexnum; i++)
if (! Member(g.vertex[i], s) && g.arcs[k][i].adj != INFINITY && (dist[k] + g.arcs[k][i].adj < dist[i]))
{
dist[i] = dist[k] + g.arcs[k][i].adj;
path[i] = path[k];
AddTail(&path[i], g.vertex[i]);
}
}
for (i = 1; i < g.vexnum; i++)
{
if (i == v)
{
printf("\t\t从%d到%d的最佳访问路线为:", v0, v);
for (j = 1; j <= path[i].last; j++)
{
printf("%d ", path[i].elem[j]);
}
}
else continue;
}
}

/*打印西安邮电学院简介*/
void PrintXUPTInfo()
{
printf("\n");
system("PAUSE");
PrintMainMenue();
}

/*校园景点信息菜单*/
void VertexInfoMenue()
{
system("cls");
int n;
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t| 西安邮电学院校园景点简介 |\n");
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t| 1. 行政楼 2. 基础教学楼 |\n");
printf("\t\t| 3. 实验楼 4. 图书馆 |\n");
printf("\t\t| 5. 大学生活动中心 6. 体育馆 |\n");
printf("\t\t| 7. 运动场 8. 旭日苑 |\n");
printf("\t\t| 9. 美食广场 10. 宿舍区 |\n");
printf("\t\t| 11. 洗浴中心 12. 校医院 |\n");
printf("\t\t| 13. 拨云见月湖 14. 水煮鸽子 |\n");
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t欢迎光临西安邮电学院校园景点简介系统,请选择地点,返回主菜单请输入0:");
scanf("%d", &n);
switch (n) {
case 0: PrintMainMenue();
case 1: printf("");
case 2: printf("");
case 3: printf("");
case 4: printf("");
case 5: printf("");
case 6: printf("");
case 7: printf("");
case 8: printf("");
case 9: printf("");
case 10: printf("");
case 11: printf("");
case 12: printf("");
case 13: printf("");
case 14: printf("");
}
}

/*校园景点问路查询菜单*/
void NavMenue()
{
system("cls");
int n;
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t| 校园景点问路查询 |\n");
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t| 1. 最短简单路径查询 |\n");
printf("\t\t| 2. 最佳访问路线查询 |\n");
printf("\t\t| 3. 打印所有简单路径 |\n");
printf("\t\t|--------------------------------------------------|\n");
printf("欢迎使用校园景点问路查询系统,请选择服务,返回主菜单请输入0:");
scanf("%d", &n);
switch (n) {
case 0: PrintMainMenue();
case 1: ShortestPathMenue();
case 2: BestPathMenue();
case 3: AllPathMenue();
}
}

/*打印所有简单路径*/
void AllPathMenue()
{
AdjMatrix G;
CreateUDG(&G);
AllPath(G);
}

/*最佳访问路线查询菜单*/
void BestPathMenue()
{
system("cls");
AdjMatrix G;
CreateUDG(&G);
int i, j;
int k = 1;
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t| 最佳访问路线查询 |\n");
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t|欢迎使用最佳访问路线查询服务,请根据下面提示使用!|\n");
printf("\t\t| 1. 行政楼 2. 基础教学楼 |\n");
printf("\t\t| 3. 实验楼 4. 图书馆 |\n");
printf("\t\t| 5. 大学生活动中心 6. 体育馆 |\n");
printf("\t\t| 7. 运动场 8. 旭日苑 |\n");
printf("\t\t| 9. 美食广场 10. 宿舍区 |\n");
printf("\t\t| 11. 洗浴中心 12. 校医院 |\n");
printf("\t\t| 13. 拨云见月湖 14. 水煮鸽子 |\n");
printf("\t\t|--------------------------------------------------|\n");
while (k == 1)
{
printf("\t\t请输入想要查询的地点编号,用空格分开,例如1 2:");
scanf("%d %d", &i, &j);
BestPath(G, i, j);
printf("\t\t如想继续查询请输入1,返回请输入0:");
scanf("%d", &k);
if (k == 0) NavMenue();
else continue;
}
}

/*最短简单路径查询菜单*/
void ShortestPathMenue()
{
system("cls");
AdjMatrix G;
CreateUDG(&G);
int i, j;
int k = 1;
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t| 最短简单路径查询 |\n");
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t|欢迎使用最短简单路径查询服务,请根据下面提示使用!|\n");
printf("\t\t| 1. 行政楼 2. 基础教学楼 |\n");
printf("\t\t| 3. 实验楼 4. 图书馆 |\n");
printf("\t\t| 5. 大学生活动中心 6. 体育馆 |\n");
printf("\t\t| 7. 运动场 8. 旭日苑 |\n");
printf("\t\t| 9. 美食广场 10. 宿舍区 |\n");
printf("\t\t| 11. 洗浴中心 12. 校医院 |\n");
printf("\t\t| 13. 拨云见月湖 14. 水煮鸽子 |\n");
printf("\t\t|--------------------------------------------------|\n");
while (k == 1)
{
printf("\t\t请输入想要查询的地点编号,用空格分开,例如1 2:");
scanf("%d %d", &i, &j);
ShortestPath(G, i, j);
printf("\t\t如想继续查询请输入1,返回请输入0:");
scanf("%d", &k);
if (k == 0) NavMenue();
else continue;
}
}

这一个帖子写不完了,写下面那个,要求也一起写上去~
...全文
263 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianshilei1992 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 anyidan 的回复:]

so long
[/Quote]哭,没人看我的……我解决了一些……有个问题解决不出来了……
AnYidan 2011-12-14
  • 打赏
  • 举报
回复
so long
tianshilei1992 2011-12-14
  • 打赏
  • 举报
回复
文件的问题解决了,运行输出结果貌似也对着呢,不过输出完了结果,系统会提示错误,说是什么堆栈错误……程序就停止了……
tianshilei1992 2011-12-14
  • 打赏
  • 举报
回复
/*打印关于系统*/
void PrintAboutSystem()
{
system("cls");
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t| 关于系统 |\n");
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t| 制作人:田世磊 |\n");
printf("\t\t| 制作时间:2011年12月 |\n");
printf("\t\t|--------------------------------------------------|\n");
system("PAUSE");
PrintMainMenue();
}

/*校园导航系统主菜单*/
void PrintMainMenue()
{

system("cls");
int m;
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t| 西安邮电学院校园导航系统 |\n");
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t| 1. 西安邮电学院简介 |\n");
printf("\t\t| 2. 西安邮电学院校园景点简介 |\n");
printf("\t\t| 3. 校园景点问路查询 |\n");
printf("\t\t| 4. 关于系统 |\n");
printf("\t\t| 5. 退出系统 |\n");
printf("\t\t|--------------------------------------------------|\n");
printf("\t\t|欢迎使用西安邮电学院校园导航系统,请选择服务:");
scanf("%d", &m);
switch (m) {
case 1: PrintXUPTInfo();
case 2: VertexInfoMenue();
case 3: NavMenue();
case 4: PrintAboutSystem();
case 5: exit(0);
}
}

void main()
{
PrintMainMenue();
}

要求如下:
1、设计学校的校园平面图,
地点(地点名称、地点介绍),
路线(公里数)均不少于10个。
2、提供图中任意地点相关信息的查询。
3、提供图中任意地点的问路查询:
1)任意两个地点之间的一条最短的简单路径
(最短路径长度——中转次数最少);
2)任意两个地点之间的一条最佳访问路线
(带权(公里数)最短路径长度);
3)任意两个地点之间的所有简单路径。
然后我的权值是通过文件VertexWeight.txt获取,文件内容如下:
1 14 200 2 3 30 2 14 100 3 5 200 3 4 180 3 7 70 4 5 100 4 6 180 4 7 70 4 8 260 5 13 30 5 14 80 6 7 210 6 8 120 6 13 330 7 8 290 7 9 50 7 11 100 8 9 130 8 10 70 9 11 70 9 12 20 10 13 470
用VS2010编译通过,运行的时候在读取文件的时候出错了……不知道怎么回事,用VC6.0运行以后读取文件正常,不过得出的结论不对……只能输出两个路径,我怎么找也找不出问题来……
求救啦大侠们!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧