风落平川 2023-11-15 21:43 采纳率: 96.7%
浏览 5
已结题

C语言无向图邻接表运行错误

想建立的图如下

img

代码如下


#include <stdio.h>
#include <stdlib.h>
#define MAX 20
typedef struct node{
    int adjvex;//顶点编号
    struct node *next;//指向下一个结点
}edgenode;//
typedef struct vnode{
    int vertex;//顶点V_{i}
    edgenode *firstedge;//指向第一个邻接的结点
}vertexnode;//头结点
void Creatlist(vertexnode g[],int n,int e)//n为顶点数,e为边数
{
  edgenode *p;int i;//数组从1开始使用,0闲置
  for(i=1;i<=n;i++)//头结点结构体数组初始化
  {
    g[i].vertex=i;
    g[i].firstedge=NULL;
  }
  printf("已建立顶点如下\n");
  for(i=1;i<=n;i++)
      printf("V%d\n",i);
  int j,k;
  for(k=1;k<=e;k++)
  {
      printf("输入要建立的边:i,j\n");
      scanf("%d,%d",&i,&j);
      //在结点i的单链表插入结点j
      p=(edgenode*)malloc(sizeof(edgenode));
      p->adjvex=j;
      p->next=g[j].firstedge;
      g[i].firstedge=p;
      //在结点j的单链表插入结点i
      p=(edgenode*)malloc(sizeof(edgenode));
      p->adjvex=i;
      p->next=g[i].firstedge;
      g[j].firstedge=p;
  }
}
void PrintfList(vertexnode g[],int n)//顶点数n,边数e
{
    edgenode *p;
    int i;
    for(i=1;i<=n;i++)
    {
        printf("V%d->",i);
        p=g[i].firstedge;//指向第一个表结点
        while(p!=NULL)
        {
          printf("%d->",p->adjvex);
          p=p->next;
        }
        printf("NULL\n");
    }
}
int main(void)
{
    vertexnode g[MAX];
    int n,e;
    printf("输入顶点数\n");
    scanf("%d",&n);
    printf("输入边数\n");
    scanf("%d",&e);
    Creatlist(g,n,e);
    PrintfList(g,n);
    return 0;
}

运行结果如下

img


感觉是打印函数哪里出错了,还是p指针没有处理对?所以是哪里出错了呢,如何解决?

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-11-16 16:23
    关注

    引自强大而免费的微信小程序:皆我百晓生

    你的代码在建立无向图的邻接表时存在一些问题。在插入边的过程中,你没有正确地更新每个顶点的邻接表。你需要将第15行的g[i].firstedge=p;和第20行的g[j].firstedge=p;修改为:

    g[i].firstedge=p;
    p->next=g[j].firstedge;
    g[j].firstedge=p;
    

    这样,你就可以正确地构建无向图的邻接表了。以下是修改后的完整代码:

    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 20
    typedef struct node{
        int adjvex;//顶点编号
        struct node *next;//指向下一个结点
    }edgenode;//
    typedef struct vnode{
        int vertex;//顶点V_{i}
        edgenode *firstedge;//指向第一个邻接的结点
    }vertexnode;//头结点
    void Creatlist(vertexnode g[],int n,int e)//n为顶点数,e为边数
    {
      edgenode *p;int i;//数组从1开始使用,0闲置
      for(i=1;i<=n;i++)//头结点结构体数组初始化
      {
        g[i].vertex=i;
        g[i].firstedge=NULL;
      }
      printf("已建立顶点如下
    ");
      for(i=1;i<=n;i++)
          printf("V%d
    ",i);
      int j,k;
      for(k=1;k<=e;k++)
      {
          printf("输入要建立的边:i,j
    ");
          scanf("%d,%d",&i,&j);
          //在结点i的单链表插入结点j
          p=(edgenode*)malloc(sizeof(edgenode));
          p->adjvex=j;
          p->next=g[j].firstedge;
          g[i].firstedge=p;
          //在结点j的单链表插入结点i
          p=(edgenode*)malloc(sizeof(edgenode));
          p->adjvex=i;
          p->next=g[j].firstedge;
          g[j].firstedge=p;
      }
    }
    void PrintfList(vertexnode g[],int n)//顶点数n,边数e
    {
        edgenode *p;
        int i;
        for(i=1;i<=n;i++)
        {
            printf("V%d->",i);
            p=g[i].firstedge;//指向第一个表结点
            while(p!=NULL)
            {
              printf("%d->",p->adjvex);
              p=p->next;
            }
            printf("NULL
    ");
        }
    }
    int main(void)
    {
        vertexnode g[MAX];
        int n,e;
        printf("输入顶点数
    ");
        scanf("%d",&n);
        printf("输入边数
    ");
        scanf("%d",&e);
        Creatlist(g,n,e);
        PrintfList(g,n);
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月16日
  • 已采纳回答 11月16日
  • 赞助了问题酬金15元 11月16日
  • 创建了问题 11月15日

悬赏问题

  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题