阿康康康 发表于 2020-12-27 19:43:53

求助!用C写的顺序表创建的无向图无法输出...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MVNum 100 //最大顶点数

//边结点
typedef struct ArcNode{
        int adjvex;
    struct ArcNode *nextarc;
}ArcNode;

//顶点信息
typedef struct VNode{
        char data;
        ArcNode *firstarc;               
}VNode, AdjList; //AdjList表示邻接表类型

//邻接表
typedef struct{
        AdjList vertices;
        int vexnum, arcnum;
}ALGraph;

void CreateUDG(ALGraph *G);
void linkLast(ArcNode *vertice, ArcNode *node);
int LocateVex(ALGraph *G, char *str);
void DispGraphAdjList(ALGraph *G);

void CreateUDG(ALGraph *G) {
        G = (ALGraph *)malloc(sizeof(ALGraph));
        ArcNode *ptr; // 边表指针类型
       
        scanf("%d %d", &G->vexnum, &G->arcnum);
        for(int i=0; i<G->vexnum; i++) {
                scanf("%s", G->vertices.data); // 顶点值
                G->vertices.firstarc = NULL; // 初始化表头结点指针域
        }

        // 边依附的两个顶点值
        for(int k=0; k<G->vexnum; k++) {
                char s1, s2;
                int i, j;
                printf("输入:\n");
                scanf("%s %s", s1, s2);
                i = LocateVex(G, s1); // 确定起点位置
                j = LocateVex(G, s2); // 确定终点位置
               
                ArcNode *p1, *p2;
//                p1 = (ArcNode *)malloc(sizeof(ArcNode));
//                p1->adjvex = j;
//                // 将p1链接到j所在链表末尾
//                if(G->vertices.firstarc == NULL) {
//                        G->vertices.firstarc = p1;
//                } else {
//                        linkLast(G->vertices.firstarc, p1);
//                }
//               
//                p2 = (ArcNode *)malloc(sizeof(ArcNode));
//                p2->adjvex = i;
//                // 将p2链接到j所在链表末尾
//                if(G->vertices.firstarc == NULL) {
//                        G->vertices.firstarc = p2;
//                } else {
//                        linkLast(G->vertices.firstarc, p2);
//                }
               
                p1 = (ArcNode *)malloc(sizeof(ArcNode));
                p1->adjvex = j;
                p1->nextarc = G->vertices.firstarc; // 让p1的指针指向当前顶点指向的结点
                G->vertices.firstarc = p1; // 将当前顶点的指针指向p1
               
                p2 = (ArcNode *)malloc(sizeof(ArcNode));
                p2->adjvex = i;
                p2->nextarc = G->vertices.firstarc; // 让p2的指针指向当前顶点指向的结点
                G->vertices.firstarc = p2; // 将当前顶点的指针指向p2
        }
        printf("创建无向图成功!\n");
}

//
void linkLast(ArcNode *vertice, ArcNode *node) {
    ArcNode *p = vertice;

    while(p->nextarc)
      p = p->nextarc;
    p->nextarc = node;
    printf("成功\n");
}

// 查找位置
int LocateVex(ALGraph *G, char *str) {
        int loc = 0;
        for(int i=0; i<100; i++) {
                if(!(strcmp(G->vertices.data, str))) {
                        return loc;
                }
                ++loc;
        }
        return -1;
}

// 输出无向图
void DispGraphAdjList(ALGraph *G) {
        int i;
        ArcNode *ptr;
        printf("邻接表为:\n");
        for(i=0; i<G->vexnum; i++) {
                printf("%s", G->vertices.data);
                ptr = G->vertices.firstarc;
                while(ptr != NULL) {
                        printf("->%s", G->vertices.data);
                        ptr = ptr->nextarc;
                }
                printf("\n");
        }
}

int main() {
        ALGraph *G = NULL;
        printf("开始创建!\n");
        CreateUDG(G);
        printf("创建结束!\n");
        printf("开始输出!\n");
        DispGraphAdjList(G);
        printf("结束输出!\n");
       
        return 0;
}



输入样例是:
4 4
v0 v1 v2 v3
v0 v1
v0 v2
v0 v3
v2 v3


卡在输出,程序就结束了
求助!感激不尽!{:10_254:}

2269099035 发表于 2020-12-29 14:20:40

因为作用域的问题,你main里面的G在CreateUDG之后也没有改变。所以你传进去DispGraphAdjList的G只是NULL。NULL肯定没有东西,所以你这里for(i=0; i<G->vexnum; i++)访问G->vexnum直接就错误了。所以才导致没有输出。你可以在CreateUDG通过return G,然后G=CreateUDG(G)的方法,把创建好的G搞回来main函数

2269099035 发表于 2020-12-29 14:31:58

或者说,你把31行的G = (ALGraph *)malloc(sizeof(ALGraph));放到121行main函数里面的ALGraph *G = NULL;下面。这样,通过址传递,G的值就会在CreateUDG之后改变。

2269099035 发表于 2020-12-29 14:35:11

应该说是,你原来main里面的G,初始化的是NULL,然后在CreateUDG被赋予一个地址。而CreateUDG的变化都在这个地址里面。而你下面DispGraphAdjList(G);用的还是原来NULL的地址,也就自然访问不到。而你把G = (ALGraph *)malloc(sizeof(ALGraph));放到主函数,那么CreateUDG()变化的就是这个G的地址。然后下面DispGraphAdjList(G);也是访问它,所以数据正常
页: [1]
查看完整版本: 求助!用C写的顺序表创建的无向图无法输出...