鱼C论坛

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

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

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

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

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

x
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define MVNum 100 //最大顶点数

  5. //边结点
  6. typedef struct ArcNode{
  7.         int adjvex;
  8.     struct ArcNode *nextarc;
  9. }ArcNode;

  10. //顶点信息
  11. typedef struct VNode{
  12.         char data[3];
  13.         ArcNode *firstarc;               
  14. }VNode, AdjList[MVNum]; //AdjList表示邻接表类型

  15. //邻接表
  16. typedef struct{
  17.         AdjList vertices;
  18.         int vexnum, arcnum;
  19. }ALGraph;

  20. void CreateUDG(ALGraph *G);
  21. void linkLast(ArcNode *vertice, ArcNode *node);
  22. int LocateVex(ALGraph *G, char *str);
  23. void DispGraphAdjList(ALGraph *G);

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

  33.         // 边依附的两个顶点值
  34.         for(int k=0; k<G->vexnum; k++) {
  35.                 char s1[3], s2[3];
  36.                 int i, j;
  37.                 printf("输入:\n");
  38.                 scanf("%s %s", s1, s2);
  39.                 i = LocateVex(G, s1); // 确定起点位置
  40.                 j = LocateVex(G, s2); // 确定终点位置
  41.                
  42.                 ArcNode *p1, *p2;
  43. //                p1 = (ArcNode *)malloc(sizeof(ArcNode));
  44. //                p1->adjvex = j;
  45. //                // 将p1链接到j所在链表末尾
  46. //                if(G->vertices[i].firstarc == NULL) {
  47. //                        G->vertices[i].firstarc = p1;
  48. //                } else {
  49. //                        linkLast(G->vertices[i].firstarc, p1);
  50. //                }
  51. //               
  52. //                p2 = (ArcNode *)malloc(sizeof(ArcNode));
  53. //                p2->adjvex = i;
  54. //                // 将p2链接到j所在链表末尾
  55. //                if(G->vertices[j].firstarc == NULL) {
  56. //                        G->vertices[j].firstarc = p2;
  57. //                } else {
  58. //                        linkLast(G->vertices[j].firstarc, p2);
  59. //                }
  60.                
  61.                 p1 = (ArcNode *)malloc(sizeof(ArcNode));
  62.                 p1->adjvex = j;
  63.                 p1->nextarc = G->vertices[i].firstarc; // 让p1的指针指向当前顶点指向的结点
  64.                 G->vertices[i].firstarc = p1; // 将当前顶点的指针指向p1
  65.                
  66.                 p2 = (ArcNode *)malloc(sizeof(ArcNode));
  67.                 p2->adjvex = i;
  68.                 p2->nextarc = G->vertices[j].firstarc; // 让p2的指针指向当前顶点指向的结点
  69.                 G->vertices[j].firstarc = p2; // 将当前顶点的指针指向p2
  70.         }
  71.         printf("创建无向图成功!\n");
  72. }

  73. //
  74. void linkLast(ArcNode *vertice, ArcNode *node) {
  75.     ArcNode *p = vertice;

  76.     while(p->nextarc)
  77.         p = p->nextarc;
  78.     p->nextarc = node;
  79.     printf("成功\n");
  80. }

  81. // 查找位置
  82. int LocateVex(ALGraph *G, char *str) {
  83.         int loc = 0;
  84.         for(int i=0; i<100; i++) {
  85.                 if(!(strcmp(G->vertices[i].data, str))) {
  86.                         return loc;
  87.                 }
  88.                 ++loc;
  89.         }
  90.         return -1;
  91. }

  92. // 输出无向图
  93. void DispGraphAdjList(ALGraph *G) {
  94.         int i;
  95.         ArcNode *ptr;
  96.         printf("邻接表为:\n");
  97.         for(i=0; i<G->vexnum; i++) {
  98.                 printf("%s", G->vertices[i].data);
  99.                 ptr = G->vertices[i].firstarc;
  100.                 while(ptr != NULL) {
  101.                         printf("->%s", G->vertices[ptr->adjvex].data);
  102.                         ptr = ptr->nextarc;
  103.                 }
  104.                 printf("\n");
  105.         }
  106. }

  107. int main() {
  108.         ALGraph *G = NULL;
  109.         printf("开始创建!\n");
  110.         CreateUDG(G);
  111.         printf("创建结束!\n");
  112.         printf("开始输出!\n");
  113.         DispGraphAdjList(G);
  114.         printf("结束输出!\n");
  115.        
  116.         return 0;
  117. }

复制代码


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

屏幕截图 2020-12-27 204136.png
卡在输出,程序就结束了
求助!感激不尽!
小甲鱼最新课程 -> https://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函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-29 14:31:58 | 显示全部楼层
或者说,你把31行的G = (ALGraph *)malloc(sizeof(ALGraph));放到121行main函数里面的ALGraph *G = NULL;下面。这样,通过址传递,G的值就会在CreateUDG之后改变。
小甲鱼最新课程 -> https://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);也是访问它,所以数据正常
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-3 17:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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