首页 > 代码库 > 校园导游图的课程设计(一)

校园导游图的课程设计(一)

思路:

1.  使用两个文件 arc 和 vex 分别存放 节点和弧信息

 存放格式为:

typedef struct data{char placename[NAMEMAX];char placedata[DATAMAX];}Data;typedef struct arc{int forvex;int backves;int weight;}Arc;//文件存储结构体
View Code

2. 为了方便删除和添加,使用邻接表,邻接表的结构体

typedef struct arcnode{        int adjvex;        int weight;        struct arcnode* next;}ArcNode;typedef struct vertexnode{        Data vexdata;        ArcNode * next;}VertxNode;typedef struct {        VertxNode vertex[NUMMAX];        int vexnum;        int arcnum;}ListMatrix;
View Code

3. 为了方便操做和模块化,将地图的节点和弧的添加分别抽象成模块

int  AddArc( ListMatrix * G  )/* * 增加弧 * 成功返回1 * 失败返回0 */{     char forvextemp[NAMEMAX];      char backvextemp[NAMEMAX];     int forvex;     int backvex;     ArcNode * temp;     ArcNode * p;     printf("输入起始点:");     scanf("%s",forvextemp);    if( (forvex = NametoNum( G, forvextemp )) == 0  )    {            return 0;    }    printf("输入终点:");    scanf("%s",backvextemp);    if( (backvex = NametoNum( G,backvextemp)) == 0 )    {            return 0;    }//读取起点和终点    G->arcnum++;//弧数加一    temp = (ArcNode*)malloc(sizeof(ArcNode));    printf("输入路径长度:");    scanf("%d",&temp->weight);    temp->adjvex = backvex;    temp->next = NULL;//赋值    p = G->vertex[forvex].next;    while( p&&p->next )  p = p->next;    if( !p )  G->vertex[forvex].next = p;    else      p->next = temp; //挂链    return 1;}
View Code

4.整个程序,只有在开始时读 arc vex 文件,建立map,在退出时写文件,将可能被修改过的map,覆盖写入 arc vex 文件

     其他所有操作都建立在内存中的map,不再对文件进行操作

int  MakeMap( ListMatrix *G )/* * 利用文件建立地图 * 输入存放节点的文件 fp1 ,存放弧的文件fp2 **/{         FILE  * fp1;        FILE  * fp2;   int  nodecount = 0;   int  arccount = 0;   Data nodedata;   Arc  arcdata;   ArcNode * p;   ArcNode * temp;        if( (fp1=fopen("vex","ab+")) == NULL )        {             printf("vex打开错误");             return 0;        }        if( (fp2=fopen("arc","ab+")) == NULL )        {                printf("arc打开错误\n");                return 0;        }      while( fread(&nodedata,sizeof(Data),1,fp1) == 1 )   {            nodecount++;            strcpy(G->vertex[nodecount].vexdata.placename,nodedata.placename);           strcpy(G->vertex[nodecount].vexdata.placedata,nodedata.placedata);             G->vertex[nodecount].next = NULL;   }//读取节点   if( nodecount != 0 )   {        while( fread( &arcdata,sizeof(Arc),1,fp2) == 1 )        {                arccount++;                temp->next = ( ArcNode *)malloc(sizeof(ArcNode));                temp->next->adjvex = arcdata.backves;                temp->next->weight = arcdata.weight;                temp->next->next = NULL;                 p = G->vertex[arcdata.forvex].next;                while( p && p->next )  p = p->next;                if( !p )    G->vertex[arcdata.forvex].next = temp;                else        p->next =temp;//挂链        }   }//读取弧   G->vexnum = nodecount;   G->arcnum = arccount;   fclose(fp1);   fclose(fp2);}
View Code

 

校园导游图的课程设计(一)