公交线路管理

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;
 }

程序写得不是那么简洁,有什么需要指导我的,欢迎前来骚扰哦!
最后祝大家新年快乐!幸福安康!

公交线路管理公交线路管理 闆運厷 发布了35 篇原创文章 · 获赞 8 · 访问量 1万+ 私信 关注
上一篇:数据结构(C语言版)---顺序表与链表的比较


下一篇:c数据结构 -- 线性表之 复杂的链式存储结构