#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_VERTEX_NUM 20 struct ArcNode{ int adjvex; ArcNode *nextarc; int *info; };//表结点 typedef struct{ char data; ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM];//头结点 struct ALGraph{ AdjList vertices; int vexnum; }; void CreateGraph(ALGraph *G) {scanf("%d",&G->vexnum); int i; for(i=0;i<G->vexnum;i++) {G->vertices[i].data=getchar(); G->vertices[i].firstarc=NULL; getchar(); } char num[20]; for(i=0;i<G->vexnum;i++) {char *token; int con[20];//存分割后的整型数 scanf("%s",num); token=strtok(num," "); int j=0; while(token!=NULL)//分割num,依次存入con {con[j]=atoi(token); j++; token=strtok(NULL," "); } int k=0; ArcNode *q; q=NULL; G->vertices[i].firstarc->nextarc=NULL; for(k=0;k<j;k++) {if(k%2==0) {q=(ArcNode*)malloc(sizeof(ArcNode));//?可能有问题 q->adjvex=con[k]; q->nextarc=G->vertices[i].firstarc; G->vertices[i].firstarc=q; } else {q->info=(int*)malloc(sizeof(int)); *(q->info)=con[k]; } } } } int main() {ALGraph *G0; CreateGraph(G0); int i; for(i=0;i<G0->vexnum;i++) {printf("%c ",G0->vertices[i].data); ArcNode *p; p=G0->vertices[i].firstarc; while(p) {printf("(%d,%d)%d ",i,p->adjvex,*(p->info)); p=p->nextarc; } } return 0; }
时间: 2023-12-08 19:05:18 浏览: 83
这段代码存在一些问题,我来一一指出并给出修改建议:
在结构体定义中,ArcNode 的成员变量 info 应该是一个指针,而不是一个 int 变量。因为每条弧可能会有不同的信息,如果使用一个 int 变量来存储信息,就无法满足这个要求。因此,应该将 info 声明为 int* 类型。
在 CreateGraph 函数中,G0 指针需要在函数内部被分配内存,否则会导致段错误。因此,应该在函数内部使用 malloc 分配内存,修改代码如下:
ALGraph *G0 = (ALGraph*)malloc(sizeof(ALGraph));
- 在 CreateGraph 函数中,为每个顶点的邻接表添加弧时,需要判断该顶点的邻接表是否为空。如果为空,则需要先为该顶点的邻接表分配内存。修改代码如下:
if (G->vertices[i].firstarc == NULL) {
G->vertices[i].firstarc = (ArcNode*)malloc(sizeof(ArcNode));
G->vertices[i].firstarc->nextarc = NULL;
}
- 在 CreateGraph 函数中,创建每个顶点的邻接表时,需要修改 con 数组的索引。因为 con 数组中存储的是一条弧的信息,其中奇数下标表示弧的终点,偶数下标表示弧的信息。因此,应该将 k 的初始值设置为 1,然后在循环中每次增加 2。修改代码如下:
for (k = 1; k < j; k += 2) {
q = (ArcNode*)malloc(sizeof(ArcNode));
q->adjvex = con[k];
q->nextarc = G->vertices[i].firstarc;
G->vertices[i].firstarc = q;
q->info = (int*)malloc(sizeof(int));
*(q->info) = con[k + 1];
}
- 在 main 函数中,应该释放 G0 指针所指向的内存,否则会导致内存泄漏。修改代码如下:
free(G0);
修改后的完整代码如下:
相关推荐



















