鱼C论坛

 找回密码
 立即注册
查看: 2147|回复: 3

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

[复制链接]
发表于 2020-12-27 19:43:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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[3];
        ArcNode *firstarc;               
}VNode, AdjList[MVNum]; //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[i].data); // 顶点值 
                G->vertices[i].firstarc = NULL; // 初始化表头结点指针域 
        }

        // 边依附的两个顶点值
        for(int k=0; k<G->vexnum; k++) {
                char s1[3], s2[3];
                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[i].firstarc == NULL) {
//                        G->vertices[i].firstarc = p1;
//                } else {
//                        linkLast(G->vertices[i].firstarc, p1);
//                }
//                
//                p2 = (ArcNode *)malloc(sizeof(ArcNode));
//                p2->adjvex = i;
//                // 将p2链接到j所在链表末尾 
//                if(G->vertices[j].firstarc == NULL) {
//                        G->vertices[j].firstarc = p2;
//                } else {
//                        linkLast(G->vertices[j].firstarc, p2);
//                }
                
                p1 = (ArcNode *)malloc(sizeof(ArcNode));
                p1->adjvex = j;
                p1->nextarc = G->vertices[i].firstarc; // 让p1的指针指向当前顶点指向的结点
                G->vertices[i].firstarc = p1; // 将当前顶点的指针指向p1
                
                p2 = (ArcNode *)malloc(sizeof(ArcNode));
                p2->adjvex = i;
                p2->nextarc = G->vertices[j].firstarc; // 让p2的指针指向当前顶点指向的结点
                G->vertices[j].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[i].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[i].data);
                ptr = G->vertices[i].firstarc;
                while(ptr != NULL) {
                        printf("->%s", G->vertices[ptr->adjvex].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

屏幕截图 2020-12-27 204136.png
卡在输出,程序就结束了
求助!感激不尽!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-29 14:31:58 | 显示全部楼层
或者说,你把31行的G = (ALGraph *)malloc(sizeof(ALGraph));放到121行main函数里面的ALGraph *G = NULL;下面。这样,通过址传递,G的值就会在CreateUDG之后改变。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-29 14:35:11 | 显示全部楼层
应该说是,你原来main里面的G,初始化的是NULL,然后在CreateUDG被赋予一个地址。而CreateUDG的变化都在这个地址里面。而你下面DispGraphAdjList(G);用的还是原来NULL的地址,也就自然访问不到。而你把G = (ALGraph *)malloc(sizeof(ALGraph));放到主函数,那么CreateUDG()变化的就是这个G的地址。然后下面DispGraphAdjList(G);也是访问它,所以数据正常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 06:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表