图实现

构造一个有向图

边关系:5 a b 7 a d 4 b c 8 c a 9 c f 5 d c 6 d f 5 e d 1 f e 3 f a

#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 100
typedef char VertexType;//顶点节点的数据类型
typedef int EdgeType;//边权值的数据类型
typedef struct{
    VertexType Vertex[MaxVertexNum];//顶点表
    EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表
    int vertexnum,arcnum;//顶点数和边数
}MGraph;//邻接矩阵的存储结构
typedef struct ArcNode{
    int adjvex;//该弧所指向的顶点的位置
    struct ArcNode *next;//指向下一条弧的指针
}ArcNode;//边表节点
typedef struct VNode{
    VertexType data;//顶点信息
    ArcNode *first;//指向第一条依附该顶点的弧的指针
}VNode,AdjList[MaxVertexNum];//顶点表节点
typedef struct{
    AdjList vertices;//邻接表
    int vexnum,arcnum;//图的顶点数和弧数
}ALGraph;//邻接表的存储结构
int Locate(VertexType v){
    if(v>=97){return (int)v-97;}
    else {return (int)v-65;}
}//将顶点转换为相应的位置
void CreatGraph(MGraph &M){
    EdgeType e;
    VertexType v1,v2;
    printf("输入节点数和边数:");
    scanf("%d %d",&M.vertexnum,&M.arcnum);
    printf("输入节点:");
    for(int i=0;i<M.vertexnum;i++){
        getchar();
        scanf("%c",&M.Vertex[i]);
    }
    for(int i=0;i<M.vertexnum;i++){
        for(int j=0;j<M.vertexnum;j++){
            M.Edge[i][j]=0;
        }
    }
    fflush(stdin);//清除缓存,防止下一次的scanf()函数失效
    printf("输入路径的权值及其两个节点:\n");
    for(int i=0;i<M.arcnum;i++){
        scanf("%d %c %c",&e,&v1,&v2);
        M.Edge[Locate(v1)][Locate(v2)]=e;
    }
}//构造一个有向图
void PrintGraph(MGraph &M){
    printf("邻接矩阵\n");
    for(int i=0;i<M.vertexnum;i++){
        printf("     %c ",M.Vertex[i]);
        for(int j=0;j<M.vertexnum;j++){
            if(M.Edge[i][j]!=0){
                printf("%d ",M.Edge[i][j]);
            }
            else{printf("0 ");}
        }
        printf("\n");
    }
}//打印邻接矩阵
void CreatMGtoNG(MGraph &M,ALGraph &G){
    ArcNode *p;
    G.vexnum=M.vertexnum;
    G.arcnum=M.arcnum;
    for(int i=0;i<G.vexnum;i++){
        G.vertices[i].data=M.Vertex[i];
        G.vertices[i].first=NULL;
    }
    for(int i=0;i<G.vexnum;i++){
        for(int j=0;j<G.vexnum;j++){
            if(M.Edge[i][j]!=0){
                p=(ArcNode*)malloc(sizeof(ArcNode));
                p->adjvex=j;
                p->next=G.vertices[i].first;
                G.vertices[i].first=p;
            }
        }
    }
}//将邻接矩阵转换成邻接表
void PrintALGraph(ALGraph &G){
    ArcNode *p;
    printf("邻接表\n")   
for(int i=0;i<G.vexnum;i++){ p=G.vertices[i].first; printf(" %c",G.vertices[i].data); while(p){ printf("->%c<%d>",p->adjvex+'a',p->adjvex); p=p->next; } printf("\n"); } }//打印邻接表 int main(){ MGraph M; ALGraph G; CreatGraph(M); PrintGraph(M); CreatMGtoNG(M,G); PrintALGraph(G); return 0; }

猜你喜欢

转载自www.cnblogs.com/Yshun/p/11370612.html
今日推荐