版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、全代碼:#include<iostream>#include<cstring>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<queue>using namespace std;/公交線路結構體typedef struct route_arc /公交線路中站點信息 int sta_num; /站點編號 struct route_arc *next; route_arc;typedef struct route_v /公交線路信息 int route
2、_num; /線路編號 char route_name20; /公交線路名稱 int sta_sum; /該線路中站點的總數(shù) route_arc *head; /公交站點的頭結點 route_v *r_next; /指向下一條公交線路的指針route_v;typedef struct route_graph int route_sum; /城市公交線路總數(shù) route_v *r_node; /公交線路的頭結點route_graph; / 站點圖結構體typedef struct sta_route/公交線路映射到站點的結構體int route_num;/線路編號struct sta_route
3、 *r_next; sta_route;typedef struct sta_arc/弧信息 int sta_num;/站點編號 int sta_dis;/站點之間的路徑長度 struct sta_arc *next; sta_arc;typedef struct sta_v /站點信息 int sta_num; /站點編號 char sta_name20; /站點名稱 int arc_sum;/ 與這個站點臨近的站點的總數(shù) int route_sum; /經(jīng)過這個站點的公交線路總數(shù) sta_arc *head;/路徑的頭指針 sta_route *r_head; /公交線路的頭指針 sta_
4、v *v_next;/指向下一個站點信息的指針sta_v;typedef struct sta_graph int sta_sum;/城市公交站點總數(shù)。 sta_v *v_node;/城市公交站點記錄指針sta_graph; /用戶信息 typedef struct user char userId10; char loginName20; char loginPassword7; char userName20; char userSex2; char userAge3; char userAddr20; struct user *next;user;route_v* location_ro
5、ute(route_graph *Gr,int n);void sta_query(sta_graph *G,route_graph *Gr)int i,j,flag=1;char name20;printf("=nn");printf("請輸入你要查詢的站點名稱:n");printf("=nn");scanf("%s",name);sta_v *p;p=G->v_node;for (i=0;i<G->sta_sum;i+)if (strcmp(p->sta_name,name)=0)fla
6、g=0;printf(" %s 站信息如下 :n",p->sta_name);printf("與 %s 站相鄰的站點及距離:n",p->sta_name);sta_arc *q;q=p->head;for (j=0;j<p->arc_sum;j+)sta_v *tail=sta_location(G,q->sta_num);printf("%10s ->%10s%5dn",p->sta_name,tail->sta_name,q->sta_dis);q=q->next;
7、printf("經(jīng)過此站點的公交路線(共有 %d 條)依次是:n",p->route_sum);sta_route *pr;pr=p->r_head;for (j=0;j<p->route_sum;j+)route_v *tail=location_route(Gr,pr->route_num);printf("%8sn",tail->route_name);pr=pr->r_next;p=p->v_next;if (flag)printf("不存在此站點!n");system(&quo
8、t;pause");return ;void route_query(sta_graph *G,route_graph *Gr)char name20;int i,j,flag=1;route_v *p;printf("請輸入要查詢的線路名稱:n");scanf("%s",name);printf("您查詢的線路 %s 信息如下:n",name);p=Gr->r_node;for (i=0;i<Gr->route_sum;i+)route_arc *q;if (strcmp(p->route_name
9、,name)=0)printf("共經(jīng)過 %d 站(起點到終點依次為:)n",p->sta_sum);flag=0;q=p->head;for (j=0;j<p->sta_sum;j+)sta_v *tail=sta_location(G,q->sta_num);if (j!=0)printf(">");printf("%s",tail->sta_name);q=q->next;p=p->r_next;if (flag)printf("不存在此線路!");pri
10、ntf("n");system("pause");return ;void DijkstraPath(MGraph g,int*dist,int*path,int v0) int i,j,k; bool *visited=(bool*)malloc(sizeof(bool)*g.n); for(i=0;i<g.n;i+) disti=g.matrixv0i; if (g.matrixv0i<INT_MAX&&i!=v0)pathi=v0;else pathi=-1; visitedi=false; visitedv0=true
11、;distv0=0; for(i=1;i<g.n;i+) int min=INT_MAX; int u=v0; for(j=0;j<g.n;j+) /尋找未被擴展的權值最小的頂點 if(visitedj=false&&distj<min) min=distj; u=j; visitedu=true; for(k=0;k<g.n;k+) /更新dist數(shù)組的值和路徑的值 if(visitedk=false&&g.matrixuk<INT_MAX&&min+g.matrixuk<distk) distk=min+g
12、.matrixuk; pathk=u; int location_sta(MGraph g,int n)int i;for (i=0;i<g.n;i+)if (n=g.sta_numi)return i;return -1;void query_sta(sta_graph *G,route_graph *Gr,int sta_b,int sta_e)MGraph g; g.n=G->sta_sum;int *dist=(int*)malloc(sizeof(int)*g.n); int *path=(int*)malloc(sizeof(int)*g.n);int i,j,x,y;
13、sta_v *p=G->v_node;for (i=0;i<G->sta_sum;i+)g.sta_numi=p->sta_num;p=p->v_next;for (i=0;i<g.n;i+)for (j=0;j<g.n;j+)g.matrixij=INT_MAX;p=G->v_node;for (i=0;i<G->sta_sum;i+)x=location_sta(g,p->sta_num);sta_arc *q;q=p->head;for (j=0;j<p->arc_sum;j+)y=location_st
14、a(g,q->sta_num);g.matrixxy=g.matrixyx=q->sta_dis;q=q->next;p=p->v_next;x=location_sta(g,sta_b);y=location_sta(g,sta_e);DijkstraPath(g,dist,path,x);int stackBus_Size,top=0;int dis=disty;stacktop+=g.sta_numy;while (y!=x)y=pathy;stacktop+=g.sta_numy;printf("此路線共經(jīng)過 %d 站(依次是):n",top
15、);for (i=top-1;i>=0;i-)p=sta_location(G,stacki);printf("%s ",p->sta_name);if (i!=0)printf(">>");printf("n路徑長度為 %d :n",dis);int cmp(int sta_num,sta_graph *G)int i;for (i=0;i<G->sta_sum;i+)if (sta_num=visitedi.flag)return i+1;return 0;int bfs(sta_graph *
16、G,route_graph *Gr,sta_v* sta_b,sta_v* sta_e)queue<sta_v>qq;sta_v temp;temp=*sta_b;int i,j,n=0; qq.push(temp);visitedn.flag=temp.sta_num;visitedn.sta_num=temp.sta_num;visitedn.dir=-1;n+; while(!qq.empty()sta_v now = qq.front(); qq.pop();sta_route *q;q=now.r_head; for(i=0;i<now.route_sum;i+)r
17、oute_v *qr=location_route(Gr,q->route_num);route_arc *qs=qr->head;for (j=0;j<qr->sta_sum;j+)if (!cmp(qs->sta_num,G)sta_v *tail=sta_location(G,qs->sta_num);sta_v t=*tail;qq.push(t);visitedn.flag=tail->sta_num;visitedn.dir=qr->route_num;visitedn.sta_num=now.sta_num;n+;if (qs-&g
18、t;sta_num=sta_e->sta_num)return 1;qs=qs->next;q=q->r_next;return 0; void query_route(sta_graph *G,route_graph *Gr,sta_v*sta_b,sta_v*sta_e) sta_v*p;route_v *q;int i=0;p=G->v_node;while (p)visitedi+.flag=0;p=p->v_next;if (!bfs(G,Gr,sta_b,sta_e)printf("沒有公交車可達!");else/*for (i=0
19、;i<G->sta_sum;i+)printf("%d %d %dn",visitedi.flag,visitedi.sta_num,visitedi.dir);p=sta_location(G,visitedi.flag);q=location_route(Gr,visitedi.dir);if (p)printf("%s ",p->sta_name);if (q)printf("%s ",q->route_name);p=sta_location(G,visitedi.sta_num);if (p)prin
20、tf("%s n",p->sta_name);*/printf("共需換乘 %d 次:n",step);printf("乘車方式為:");for (i=0;i<G->sta_sum;i+)if (sta_e->sta_num=visitedi.flag)break;int top=0;while (visitedi.flag!=sta_b->sta_num)p=sta_location(G,visitedi.flag);q=location_route(Gr,visitedi.dir);bustop.st
21、a_num=visitedi.flag;bustop.route_num=visitedi.dir;top+;i=cmp(visitedi.sta_num,G)-1;printf("從 %s 開始:n",sta_b->sta_name);for (i=top-1;i>=0;i-)p=sta_location(G,busi.sta_num);q=location_route(Gr,busi.route_num);printf("乘 %s ",q->route_name);printf("到 %s 下車n",p->
22、sta_name);printf("到達目的地!n");void bus_query(sta_graph *G,route_graph *Gr)char b_name20,e_name20;int sta_bb,sta_ee,flag=0;sta_v *sta_b,*sta_e;printf("請輸入您要查詢的兩個站點>>:n");printf("請輸入起點:n");scanf("%s",b_name);printf("請輸入終點:n");scanf("%s",e
23、_name);sta_v *p;p=G->v_node;while (p)if (strcmp(p->sta_name,b_name)=0)sta_bb=p->sta_num;sta_b=p;flag+;break;p=p->v_next;p=G->v_node;while (p)if (strcmp(p->sta_name,e_name)=0)sta_ee=p->sta_num;sta_e=p;flag+;break;p=p->v_next;if (flag!=2)printf("不存在此站點n");return ;prin
24、tf("最短路徑方式為:n");query_sta(G,Gr,sta_bb,sta_ee);printf("最少換乘方式為:n");query_route(G,Gr,sta_b,sta_e);return ;#define Bus_Size 100#define INT_MAX 2147483647 typedef struct node int matrixBus_SizeBus_Size; /鄰接矩陣 int sta_numBus_Size;/站點編號int n; /頂點數(shù) MGraph; typedef struct stackchar bus_n
25、ame20;int bus_num;char sta_name20;int sta_num;stack;typedef struct noint sta_num,dir;int flag;Fn;Fn visitedBus_Size;typedef struct bus_routeint sta_num,route_num;buss;buss busBus_Size;#include"head_file.h"#include"bus_query.h"#include"station_manage.cpp"#include"ro
26、ute_manage.cpp"#include"bus_query.cpp"#include"user_manage.cpp"void admin_login_success(user *U) /管理員登陸成功界面函數(shù)sta_graph *G; G=(sta_graph*)malloc(sizeof(sta_graph);route_graph *Gr; Gr=(route_graph*)malloc(sizeof(sta_graph); if (!read_stafile(G)|!read_routefile(Gr)/如果讀取文件失敗 pri
27、ntf("初次使用n"); ini_stafile(G); /創(chuàng)建站點文件,初始化站點圖的圖節(jié)點 if (!read_stafile(G) printf("數(shù)據(jù)讀取失??!n"); ini_routefile(Gr); if (!read_routefile(Gr) printf("數(shù)據(jù)讀取失敗!n"); int flag=1;while (flag)system("cls");printf("n=nn");printf(" 1 用戶注銷 2 站點管理 3 路線管理 4 返回nn&quo
28、t;);printf("=nn");int n;scanf("%d",&n);switch (n)case 1:user_del(U);break; /調(diào)用用戶注銷函數(shù)case 2:station_manage(G,Gr);break;/調(diào)用站點管理函數(shù)case 3:route_manage(G,Gr);break;/調(diào)用線路管理函數(shù)case 4: /system("pause");flag=0;break;default :printf("您的輸入有誤!n");break;if (write_stafil
29、e(G)&&write_routefile(Gr)return;elseprintf("數(shù)據(jù)保存出錯!n");system("pause");exit(0);int admin_main() /管理員登陸界面,管理員賬號已給定!默認root,密碼123456 system("cls"); printf("=nn"); printf(" 管理員登錄nn"); printf("=nn"); int t=3;/定義標記變量,用于記錄輸入錯誤次數(shù) char root_
30、name20,root_psw7; /定義中介變量,用于匹配管理員賬號和密碼 while (t) printf("請輸入您的賬號:n"); scanf("%s",root_name); if (strcmp(root_name,"root")=0)/匹配賬號,如果成功將標記變量置為3,表示還有3次輸入機會 t=3;break; else printf("賬號有誤!n"); if (t=2)/輸入兩次錯誤后給予提示 printf("您已輸入兩次錯誤,三次錯誤后系統(tǒng)將結束您此次操作!請慎重操作!n"
31、); t-; if (t=0) /3次輸入錯誤后,退出 printf("您輸入三次錯誤!系統(tǒng)將強制退出!n");return 4; while (t) printf("請輸入您的密碼:n"); scanf("%s",root_psw); if (strcmp(root_psw,"123456")=0) /匹配密碼,成功則返回3,表示登陸成功 return 3; else printf("密碼有誤!n"); if (t=2) printf("您已輸入兩次錯誤,三次錯誤后系統(tǒng)將結束您此次操
32、作!請慎重操作!n"); t-; if (t=0) printf("您輸入三次錯誤!系統(tǒng)將強制退出!n");return 4; return 3;int main() user *U=(user*)malloc(sizeof(user);U->next=NULL;if(!read_userfile(U)printf("初次使用!n");ini_userfile();if(!read_userfile(U)printf("數(shù)據(jù)讀取失敗!n"); while (1) system("cls");int
33、n;int flag=0; /標記變量,用于記錄調(diào)用函數(shù)的返回值,然后根據(jù)返回選擇要調(diào)用的函數(shù)。printf("=nn");printf(" 歡迎使用城市公交系統(tǒng):nn");printf(" 1 用戶注冊 2 用戶登錄 3 管理員 4 退出nn");printf("=n"); scanf("%d",&n); switch (n) case 1: flag=user_register(U);break; case 2: flag=user_login(U);break; /返回值為2時表示
34、登陸成功,否則返回4,退出系統(tǒng) case 3: flag=admin_main();break; /返回值為3時表示登陸成功,否則返回4,退出系統(tǒng) case 4: flag=4;break; default : printf("您的輸入有誤!n");break; if (flag=4) /標記變量為4時退出系統(tǒng)break;else if (flag=2)/標記變量為2時調(diào)用戶用登陸成功界面函數(shù)user_login_success();else if (flag=3)admin_login_success(U);/標記變量為3時調(diào)用管理員登陸成功界面函數(shù) return 0;
35、int read_routefile(route_graph *Gr) /讀文件函數(shù) FILE *fp; if (fp=fopen("route_file","rb")=NULL) /打開文件,只讀 return 0; else int i,j; fread(Gr,sizeof(route_graph),1,fp); /讀入線路圖的首節(jié)點 Gr->r_node=NULL; for (i=0;i<Gr->route_sum;i+) route_v *p; p=(route_v*)malloc(sizeof(route_v); /分配線路結
36、構體空間 fread(p,sizeof(route_v),1,fp);/讀入文本信息p->head=NULL; for (j=0;j<p->sta_sum;j+) route_arc *q; q=(route_arc*)malloc(sizeof(route_arc); fread(q,sizeof(route_arc),1,fp); q->next=p->head; p->head=q; p->r_next=Gr->r_node; Gr->r_node=p; fclose(fp); return 1; return 0;int write
37、_routefile(route_graph *Gr) /寫入文件函數(shù) FILE *fp; if (fp=fopen("route_file","wb")=NULL)/打開文件只寫 printf("系統(tǒng)數(shù)據(jù)出錯!n"); getchar(); return 0; else int i,j; fwrite(Gr,sizeof(route_graph),1,fp); route_v *p; p=Gr->r_node; for (i=0;i<Gr->route_sum;i+)/根據(jù)線路總數(shù)確定循環(huán)次數(shù) fwrite(p,s
38、izeof(route_v),1,fp);/寫入路徑 route_arc *q; q=p->head; for (j=0;j<p->sta_sum;j+)/寫入站點 fwrite(q,sizeof(route_arc),1,fp); q=q->next; p=p->r_next; fclose(fp); /關閉文件 return 1; return 0;void ini_routefile(route_graph *Gr)/初始化線路文件 FILE *fp; if (fp=fopen("route_file","wb")=N
39、ULL)/如果打開線路文件失敗 printf("初始化失敗n"); return ; Gr->route_sum=0;/初始化 Gr->r_node=NULL; fwrite(Gr,sizeof(route_graph),1,fp); fclose(fp);route_v* location_route(route_graph *Gr,int n)/定位函數(shù) route_v *p; p=Gr->r_node; while (p)/遍歷一次 if (n=p->route_num) /找到要查找的那個線路 return p;/返回找到后的那個線路指針 p
40、=p->r_next; return NULL;void insert_route(route_graph *Gr,sta_graph *G) int i,n,m,j; printf("請輸入要新增的線路個數(shù):n"); scanf("%d",&n); for (i=1;i<=n;i+) route_v *p; p=(route_v*)malloc(sizeof(route_v);/開辟線路結點 p->head=NULL; p->sta_sum=0; printf("請輸入第 %d 個新增線路編號:n",
41、i); scanf("%d",&p->route_num); if (location_route(Gr,p->route_num)/判斷輸出的線路是否已經(jīng)存在 printf("此路線已存在!n"); i-; continue; printf("請輸入第 %d 個新增線路名稱:n",i); scanf("%s",p->route_name); printf("請輸入該線路經(jīng)過的站點個數(shù):n"); scanf("%d",&m); p->s
42、ta_sum=m; sta_v* tail;/開辟站點結點 for (j=0;j<m;j+) route_arc *q;q=(route_arc*)malloc(sizeof(route_arc);printf("請輸入站點編號:n");scanf("%d",&q->sta_num);if (tail=sta_location(G,q->sta_num)/如果站點存在的時候printf("經(jīng)過的站點為:%sn",tail->sta_name);sta_route *temp;tail->route
43、_sum+;temp=(sta_route*)malloc(sizeof(sta_route);temp->route_num=p->route_num;/進行站點結點頭插temp->r_next=tail->r_head;tail->r_head=temp;elsej-;printf("此站點不存在!n");continue;q->next=p->head;p->head=q; p->r_next=Gr->r_node;/進行線路結點的頭插 Gr->r_node=p; Gr->route_sum=Gr
44、->route_sum+n;/將線路的總數(shù)重新賦值給它 return;void show_route(route_graph *Gr,sta_graph *G)/輸出路線int i,j;route_v *p;p=Gr->r_node;printf("%dn",Gr->route_sum);for (i=0;i<Gr->route_sum;i+)/遍歷路徑route_arc *q;q=p->head;printf("%sn",p->route_name);for (j=0;j<p->sta_sum;j+
45、)sta_v *tail=sta_location(G,q->sta_num);/輸出該路線經(jīng)過的站點if (j!=0)printf(">");printf("%s",tail->sta_name);q=q->next;printf("n");p=p->r_next;return ;void del_route(route_graph *Gr,sta_graph *G)/刪除路徑int route,flag=1,i;printf("請輸入您要刪除的路線編號:n");scanf(&quo
46、t;%d",&route);route_v *p,*pr=NULL;/pr指向p的前一個位置便于刪除sta_v * q,*qs=NULL;p=Gr->r_node;for (i=0;i<Gr->route_sum;i+)/遍歷路徑if (route=p->route_num)/找到要刪除的路徑flag=0;/判斷是否刪除的標志printf("您要刪除的路線為%s:",p->route_name);if (!pr)/當要刪除的路徑為第一個結點的時候Gr->r_node=p->r_next;else/當要刪除的路徑不為第一個結點pr->r_next=p->r_next;route_arc *ps;ps=p->head;while (ps)q=sta_location(G,ps->sta_num);/找到刪除線路中有的站點sta_route *qr=q->r_head,*tail=NULL;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 加盟店合同模板完整版
- 空調(diào)供銷合同模板
- 鄉(xiāng)村工廠員工聘請合同模板
- 單位活動策劃合同模板
- 審查加工承攬合同模板
- 購銷輔料合同模板
- 報廢廠房拆除合同模板
- 液化油氣生產(chǎn)合同模板
- 拍賣房購房合同模板
- 2024大數(shù)據(jù)采集標準
- 6.1 友誼的真諦 課件-2024-2025學年統(tǒng)編版道德與法治七年級上冊 -1
- 2024年云南大理州州級機關統(tǒng)一公開遴選公務員16名高頻500題難、易錯點模擬試題附帶答案詳解
- 國開2024年秋《機電控制工程基礎》形考任務4答案
- 第二單元測試卷-2024-2025學年語文三年級上冊統(tǒng)編版
- 2024年輔警招聘考試試題庫含完整答案(各地真題)
- 2024年極兔速遞有限公司招聘筆試參考題庫附帶答案詳解
- Unit2+Lesson1The+Underdog+讀后續(xù)寫課件【知識精研+培優(yōu)拓展】高中英語北師大版2019必修第一冊
- 新生兒護理月嫂知識培訓動態(tài)PPT
- 正統(tǒng)道藏目錄[共3頁]
- 新建牛羊屠宰場建設項目建議書寫作模板
- 醫(yī)院門診三病((乙肝、梅毒、艾滋))陽性登記表
評論
0/150
提交評論