1 项目简介
本项目是对公交车线路信息的简单模拟,以完成建立公交路线信息、修改公交路线信息和删除公交路线信息等功能。
2 设计思路
本项目的实质是完成对公交线路信息的建立、查找、插入、修改、删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。
3 数据结构
公交站点之间的关系可以是任意的,任意两个站点之间都可能相关。而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。所以可以用图形结构来表示n个公交站点之间以及站点之间可能设置的公交路线,其中网的顶点表示公交站点,边表示两个站点之间的路线,赋予边的权值表示相应的距离。
因为公交路线是有一定的连续关系的,如果想输出从某一个起始点开始到某一终点结束的公交路线,就需要找到从某一顶点开始的第一个邻接点和下一个邻接点。因为在邻接表中容易找到任一顶点的第一个邻接点和下一个邻接点,所以本项目使用了图的邻接表存储结构。邻接表是图的一种链式存储结构。在邻接表中,对图的每一个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对有向图是以顶点vi为尾的弧)。每个结点由三个域组成,其中邻接点域(adjvex)指示与顶点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的结点;数据域(info)存储和边或弧相关的信息,如权值等。每个链表上附设一个表头结点,在表头结点中,除了设有链域(firstarc)指向链表中第一个结点之外,还设有存储顶点vi的名或其它有关信息的数据域(data)。这些表头结点通常以顺序结构的形式存储,以便随机访问任意顶点的链表。程序代码如下:
【完整代码】
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define MAX_VERTEX_NUM 20
typedef int Status;
typedef char VerTexType;
typedef struct bus
{
int num; //车号
char time[30]; //发车时间
char start[30]; //起始站
char end[30]; //终点站
int score; //站数
struct bus *next;
}Node,*Linklist;
typedef bus ElemType;
typedef struct LNode
{
ElemType data; // 数据域
struct LNode *next; //指针域
}LNode,*LinkList;
//构造邻接表
typedef struct ArcNode //弧的结构
{
int adjvex; //该弧所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
int *info; //该弧相关信息的指针
}ArcNode;
typedef struct VNode //顶点结构
{
VerTexType data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct //图的构造
{
AdjList vertices;
int vexnum,arcnum; //图的当前顶点数和弧数
int kind; //图的种类标志
}ALGraph;
Status LocateVex(ALGraph G,int v)//查找顶点的位置
{
int i;
for(i=0;i<G.vexnum;i++)
{
if(i==G.vertices[i].data)
return i;
}
}
Linklist CreateUDG(ALGraph G)
{
ArcNode *p,*q;
int i,j,k,v1,v2;
printf("\n请输入总地点数和总路线数:");
scanf("%d %d",&G.vexnum,&G.arcnum);
printf("请输入各个地点名称:");
for(i=0;i<G.vexnum;i++)
{
scanf("%d",&G.vertices[i].data);
G.vertices[i].firstarc=NULL; //初始化
}
printf("请输入起始站和终点站;\n");
for(k=0;k<G.arcnum;k++)
{