求助!用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:} 因为作用域的问题,你main里面的G在CreateUDG之后也没有改变。所以你传进去DispGraphAdjList的G只是NULL。NULL肯定没有东西,所以你这里for(i=0; i<G->vexnum; i++)访问G->vexnum直接就错误了。所以才导致没有输出。你可以在CreateUDG通过return G,然后G=CreateUDG(G)的方法,把创建好的G搞回来main函数 或者说,你把31行的G = (ALGraph *)malloc(sizeof(ALGraph));放到121行main函数里面的ALGraph *G = NULL;下面。这样,通过址传递,G的值就会在CreateUDG之后改变。 应该说是,你原来main里面的G,初始化的是NULL,然后在CreateUDG被赋予一个地址。而CreateUDG的变化都在这个地址里面。而你下面DispGraphAdjList(G);用的还是原来NULL的地址,也就自然访问不到。而你把G = (ALGraph *)malloc(sizeof(ALGraph));放到主函数,那么CreateUDG()变化的就是这个G的地址。然后下面DispGraphAdjList(G);也是访问它,所以数据正常
页:
[1]