You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ddd/城市地铁导航系统.c

206 lines
5.0 KiB

1 year ago
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
1 year ago
#define MAX 1000
typedef struct node {
1 year ago
char a[100];
struct node* next;
}edgenode;
1 year ago
typedef struct {
1 year ago
char name[100];
1 year ago
edgenode* firstnode;
1 year ago
}vexnode;
typedef struct {
1 year ago
vexnode adjust[7];
1 year ago
int e, n;
1 year ago
}list;
list nm;
void creatnode() {//对节点进行初始化
nm.e = 7;//边数
nm.n = 7;//站点数
strcpy(nm.adjust[0].name, "肇嘉浜路");
strcpy(nm.adjust[1].name, "东安路");
strcpy(nm.adjust[2].name, "上海体育场");
strcpy(nm.adjust[3].name, "嘉善路");
strcpy(nm.adjust[4].name, "大木桥路");
strcpy(nm.adjust[5].name, "徐家汇");
strcpy(nm.adjust[6].name, "上海体育馆");
int i;
for (i = 0; i < nm.n; i++) {
nm.adjust[i].firstnode = NULL;
}
}
void createlist() {
edgenode *p;
1 year ago
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "东安路");
p->next = nm.adjust[0].firstnode;
nm.adjust[0].firstnode = p;
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "嘉善路");
p->next = nm.adjust[0].firstnode;
nm.adjust[0].firstnode = p;
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "徐家汇");
p->next = nm.adjust[0].firstnode;
nm.adjust[0].firstnode = p;
//下面是东安路的邻接表
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "肇嘉浜路");
p->next = nm.adjust[1].firstnode;
nm.adjust[1].firstnode = p;
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "上海体育场");
p->next = nm.adjust[1].firstnode;
nm.adjust[1].firstnode = p;
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "大木桥路");
p->next = nm.adjust[1].firstnode;
nm.adjust[1].firstnode = p;
//下面是上海体育场的邻接表
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "东安路");
p->next = nm.adjust[2].firstnode;
nm.adjust[2].firstnode = p;
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "上海体育馆");
p->next = nm.adjust[2].firstnode;
nm.adjust[2].firstnode = p;
//下面是嘉善路的邻接表
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "大木桥路");
p->next = nm.adjust[3].firstnode;
nm.adjust[3].firstnode = p;
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "肇嘉浜路");
p->next = nm.adjust[3].firstnode;
nm.adjust[3].firstnode = p;
//下面是大木桥路
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "东安路");
p->next = nm.adjust[4].firstnode;
nm.adjust[4].firstnode = p;
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "嘉善路");
p->next = nm.adjust[4].firstnode;
nm.adjust[4].firstnode = p;
//下面是徐家汇
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "肇嘉浜路");
p->next = nm.adjust[5].firstnode;
nm.adjust[5].firstnode = p;
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "上海体育馆");
p->next = nm.adjust[5].firstnode;
nm.adjust[5].firstnode = p;
//下面是上海体育馆
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "徐家汇");
p->next = nm.adjust[6].firstnode;
nm.adjust[6].firstnode = p;
p = (edgenode*)malloc(sizeof(edgenode));
strcpy(p->a, "上海体育场");
p->next = nm.adjust[5].firstnode;
nm.adjust[6].firstnode = p;
1 year ago
}
int cont[100][100];//邻接矩阵
void aaa(){
int i,j;
for(i=0;i<nm.n;i++){
for(j=0;j<nm.n;j++) cont[i][j]=MAX;
}
1 year ago
}
void createjz(){//创建邻接矩阵函数
edgenode *p;
aaa();
int i;
for(i=0;i<nm.n;i++){
p=nm.adjust[i].firstnode;
while(p!=NULL){
int h;
for(h=0;h<nm.n;h++)
if(!strcmp(p->a,nm.adjust[h].name)) break;
cont[i][h]=1;
p=p->next;
}
}
}
void print() {
edgenode* p;
int i;
for(i=0;i<nm.n;i++){
printf("[%s]",nm.adjust[i].name);
p=nm.adjust[i].firstnode;
while(p!=NULL){
printf("-->[%s]",p->a);
p=p->next;
}
printf("\n");
}
1 year ago
}
1 year ago
int num2=0;
void Dijkstra(int v1,int v2){
int dist[MAX],s[MAX],path[MAX];//s判断v1是否已经判断最短路径path前驱
int min,i,j,u,pre;
for(i=0;i<nm.n;i++){
dist[i]=cont[v1][i];
s[i]=0;
if(cont[v1][i]<MAX) path[i]=v1;
else path[i]=-1;
}//初始化操作
s[v1]=1;
path[v1]=0;
for(i=0;i<nm.n;i++){
min=MAX;
u=-1;
for(j=0;j<nm.n;j++){
if(s[j]==0&&dist[j]<min){
u=j;
min=dist[j];
}
}
if(u!=-1){
s[u]=1;
for(j=0;j<nm.n;j++)
if(s[j]==0){
if(cont[u][j]<MAX&&dist[u]+cont[u][j]<dist[j]){
dist[j]=dist[u]+cont[u][j];
path[j]=u;
}
}
}
}
printf("智能推荐路线如下(逆序):\n");
for(i=0;i<nm.n;i++){
if(i!=v1&&i==v2){
if(s[i]==1){
num2=dist[i];
pre=i;
while(pre!=v1){
printf("%s-->",nm.adjust[pre].name);
pre=path[pre];
}
printf("%s",nm.adjust[pre].name);
}
else printf("路径不存在!\n");
}
}
}
1 year ago
int main()
{
creatnode();
createlist();
int n=10;
printf("正在初始化数据,请稍候!\n");
//proc();
printf("欢迎使用本系统!\n");
while(n){
printf("欢迎来到上海市地铁交通服务平台!\n");
printf(" 最佳出行线路推荐\n");
printf(" 退出系统!\n");
printf("请输入!\n");
scanf("%d",&n);
}
return 0;
}