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++)
{
scanf("%d %d",&v1,&v2);
i=LocateVex(G,v1);j=LocateVex(G,v2); //定位
p=(ArcNode*)malloc(sizeof(ArcNode)); //申请一个结点
p->adjvex=j;p->nextarc=NULL; //赋值
p->nextarc=G.vertices[i].firstarc; //连接结点
G.vertices[i].firstarc=p; //连接结点
q=(ArcNode*)malloc(sizeof(ArcNode));
q->adjvex=i;q->nextarc=NULL;
q->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=q;
}
}
Linklist CreateList(Linklist h)
{
Node *p;
int n,i,s;
char sch1[30],sch2[30],sch3[30];
p=(Linklist)malloc(sizeof(Node));
scanf("%d",&n); //车号
scanf("%s%s%s",sch1,sch2,sch3); //时间,出发站,终点站
scanf("%d",&s); //站数
strcpy(p->time,sch1);
strcpy(p->start,sch2);
strcpy(p->end,sch3);
p->num=n;
p->score=s;
p->next=h;
h=p;
return h;
}
Linklist GetElem(Linklist L,int i)//按值查找
{
while(L!=NULL)
{
if(L->num==i)
break;
L=L->next;
}
if(L!=NULL)
return L;
else
return NULL;
}
Status InsertList(LinkList L,int i,ElemType e)
// 在 i个位置插入某个公交路线的信息
{
LinkList p,s;
p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1) return ERROR;
s=(struct LNode*)malloc(sizeof(LNode)); //生成新结点*s
s->data=e; //将结点*s的数据域置为e
s->next=p->next; //将结点*e的指针域指向结点ai
p->next=s; //将结点*p的指针域指向结点*s
return OK;
}
Status PutPoint(Linklist L) //查询的车号
{
if(L!=NULL)
printf("%d",L->num);
printf("-->%s",L->time);
printf("-->%s",L->start);
printf("-->%s",L->end);
printf("-->%d",L->score);
}
void Revise(Linklist L,int i)//修改公交信息
{
int choose1,y,a,b;
char sch[30];
Node *p=GetElem(L,i);
printf("%d号公交车的信息如下:\n",i);
PutPoint(p);
printf("\n请输入要修改的内容:\n");
printf("1、车号\n");
printf("2、发车时间\n");
printf("3、起始站\n");
printf("4、终点站\n");
printf("5、站数\n");
scanf("%d",&choose1);
while(choose1)
{
if(choose1==1)
{
printf("请输入新的车号\n");
scanf("%d",&y);
p->num=y;
printf("信息修改完成\n");
break;
}
if(choose1==2)
{
printf("请输入新的时间\n");
scanf("%s",sch);
strcpy(p->time,sch);
printf("信息修改完成\n");
break;
}
if(choose1==3)
{
printf("请输入新的出发点\n");
scanf("%s",sch);
strcpy(p->start,sch);
printf("信息修改完成\n");
break;
}
if(choose1==4)
{
printf("请输入新的终点站\n");
scanf("%s",sch);
strcpy(p->end,sch);
printf("信息修改完成\n");
break;
}
if(choose1==5)
{
printf("请输入新的站数\n");
scanf("%d",&y);
p->score=y;
printf("信息修改完成\n");
break;
}
}
}
Linklist DeleteList(Linklist L,int n) //删除第n路公交车
{
Linklist p,p1,L1,L2;
p=p1=L1=L2=L;
int k=0,x=0;
while(p1!=NULL)
{
k++;
p1=p1->next;
}
if(k==1)
{
p1=NULL;
return p1;
}
else if(L->num==n)
{
L=L->next;
return L;
}
while(L->next->num!=n)
{
x++;
L=L->next;
}
if(x==k-1)
{
L->next=NULL;
return p;
}
else
{
Node *q;
while(L1->next->num!=n)
L1=L1->next;
q=L1->next;
L1->next=q->next;
free(q);
return L2;
}
}
Status Putlist(Linklist L) //输出链表内容
{
if(L==NULL)
{
printf("没有公交路线!!\n");
return 0;
}
while(L)
{
printf("%d",L->num);
printf("-->%s",L->time);
printf("-->%s",L->start);
printf("-->%s",L->end);
printf("-->%d",L->score);
printf("\n");
L=L->next;
}
}
//使用界面
int main(void)
{
int x,y,k;
Linklist L1=NULL;
Node *p;
ALGraph G;
CreateUDG(G);
printf("\n******欢迎使用公交信息系统******\n");
printf("******* 1、建立信息*******\n");
printf("******* 2、查询信息*******\n");
printf("******* 3、修改信息*******\n");
printf("******* 4、删除信息*******\n");
printf("******* 5、显示信息*******\n");
printf("******* 0、退出*******\n");
int n,choose2=-1;
while(choose2!=0)
{
printf("\n请输入你要选择的功能前的序号:");
scanf("%d",&choose2);
if(choose2==0)
break;
else if (choose2==1)
{
printf("\n请输入要添加的信息,按照:车号->发车时间->起始站->终点站->站数 的顺序输入\n");
//for(k=0;k<G.arcnum;k++)
L1=CreateList(L1);
printf("添加成功!");
}
else if(choose2==2)
{
printf("\n请输入要查询的车号:");
scanf("%d",&y);
p=GetElem(L1,y);
PutPoint(p);
}
else if(choose2==3)
{
printf("\n请输入要修改信息的车号:");
scanf("%d",&y);
Revise(L1,y);
}
else if(choose2==4)
{
printf("\n请输入要删除的车号:");
scanf("%d",&y);
L1=DeleteList(L1,y);
printf("删除成功!\n");
}
else if(choose2==5)
{
printf("公交路线的信息为:\n");
Putlist(L1);
}
}
return 0;
}
程序写得不是那么简洁,有什么需要指导我的,欢迎前来骚扰哦!
最后祝大家新年快乐!幸福安康!