数据结构之用数组存储图

数据结构之用数组存储图

题目

从给定的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)]);
 
    }
}

此代码仅供参考使用,请勿直接抄袭!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值