数据结构之用数组存储图
题目
从给定的ctiy.dat文件中读取顶点数据,从distance.dat文件中读取边上的权值,先以矩阵表示法来存储这个图,然后采用深度优先遍历的方式访问这个图。
题目大意
emmmm,简单来说就是建一个图,然后找到两个点的最短距离。
方法
这个题主要是老师给的文件要处理,不会文件处理我也没有办法,然后就是把数据储存起来了,遍历一遍就行。
#include<stdio.h>
#include<string.h>
char city[40][20];
int distance[40][40];
int max(int x,int y)
{
return (x>y?x:y);
}
int min(int x,int y)
{
return (x<y?x:y);
}
int main()
{
printf("重点!!!!!请把文件和程序放在同一目录下!!!\n");
FILE*fp;
char *aa;
char filename[]="city.dat",da[10000]={},temp[20000];
int i,j,pre,z,cit=0;
//读取城市信息,将他那个5行合成一行处理
fp=fopen(filename,"r");
fseek(fp, 0L, SEEK_SET);
for(i = 0 ; i < 1002700 ; i++)
{
aa=fgets(temp,400,fp);
//把换行符删去
temp[strlen(temp)-1]='\0';
//合成到da数组里面
strcat(da,temp);
if(aa==NULL)
break;
}
fclose(fp);
//根据dat文件的规律划分每个城市
pre=0;
for(j=pre; j<strlen(da); j++)
{
if(da[j]==',')
{
for(z=pre; z<j-1; z++)
{
city[cit][z-pre]=da[z];
}
cit++;
//莫名有些多一个空格所以分情况处理空格
if(da[j+1]==' ')
pre=j+2;
else
pre=j+1;
}
}
//因为数字我当时计算是按照个位数计算的,所以0-9没有问题,但是后面出现的10-30就会多一个数字与空格,就要单独处理
for(i=0; i<30; i++)
{
for(j=strlen(city[i])-1; j>=0; j--)
{
if( (city[i][j]==' ') || (city[i][j]>'0'&&city[i][j]<='9') )
city[i][j]='\0';
}
}
strcpy(filename,"distance.dat");
//读取城市距离信息
fp=fopen(filename,"r");
fseek(fp, 0L, SEEK_SET);
for(i = 0 ; i < 32 ; i++)
{
for(j=0;j<=i;j++){
fscanf(fp,"%d",&distance[i][j]);
}
}
fclose(fp);
char city1[30]={},city2[30]={};
while(printf("请输入出发城市与到达城市\n"))
{
scanf("%s %s",city1,city2);
for(i=0;i<33;i++){
if(strcmp(city1,city[i])==0)break;
}
for(j=0;j<33;j++){
if(strcmp(city2,city[j])==0)break;
}
if(i==33||j==33)
printf("没找到相应的城市\n");
else
printf("路程为%d\n",distance[max(i,j)][min(i,j)]);
}
}
此代码仅供参考使用,请勿直接抄袭!!!