风落平川 2023-11-23 18:52 采纳率: 96.7%
浏览 4
已结题

无向图邻接表深度优先函数修改

从文件读取无向图邻接表,进行深度优先遍历


#include <stdio.h>
#include <stdlib.h>
#define MAX 100
//定义邻接表
typedef struct node{
    int adjvex;//顶点编号
    struct node *next;//指向下一个结点
}edgenode;//
typedef struct vnode{
    int vertex;//顶点
    edgenode *firstedge;//指向第一个表结点
}vertexnode,AdjList[MAX];//头结点
typedef struct{
    AdjList vertices; //顶点数组
    int vexnum;//顶点数
    int arcnum;//弧的条数
}Graph;
int CreatGraph(Graph &G)//从文件读取并输出邻接表
{
    FILE *fp;edgenode *p;
    if((fp=fopen("graph.txt","r"))==NULL)
    {
      printf("文件打开失败\n");
      return 0;
    }

    fscanf(fp,"%d",&G.vexnum);
    G.arcnum=G.vexnum+1;
    printf("顶点个数%d\n",G.vexnum);
    int i;
    for (i = 1; i <= G.vexnum; i++) 
    {
      G.vertices[i].vertex = i ;
      G.vertices[i].firstedge = NULL;
 
      int a;
      while (1) 
      {
       fscanf(fp, "%d", &a);
       if (a == 0) break;
       else
        {
           p = (edgenode *)malloc(sizeof(edgenode));
           p->adjvex = a;
           p->next = G.vertices[i].firstedge;
           G.vertices[i].firstedge = p;
        }
       }
    }

    fclose(fp);

    //输出邻接表
    printf("创建无向图G2邻接表如下:\n");
    for(i=1;i<=G.vexnum;i++)
    {
       
        p=G.vertices[i].firstedge;//指向第一个表结点
        while(p!=NULL)
        {
          printf("%d->",p->adjvex);
          p=p->next;
        }
        printf("NULL\n");
    }
    return 1;
}
int Firstadjvex(Graph G,int v)//在邻接表中找结点v的第一个邻接点
{
 edgenode *p;
 p=G.vertices[v].firstedge;
 if(p)
     return (p->next->adjvex);
 else
     return 0;
}
int Nextadjvex(Graph G,int v,int w)//在邻接表中找结点v继邻接点w后的第一个结点
{
   edgenode *p;int i,j;
   p=G.vertices[v].firstedge;
   while(p)
   {
    i=p->next->adjvex;
    if(i==w)
        break;
   }
   j=Firstadjvex(G,i);
   return j;
}
void DFS(Graph G,int v,int visited[])
{
    printf("%d",G.vertices[v].vertex);
    visited[v]=1;int w;
    for(w= Firstadjvex(G,v);w;w=Nextadjvex(G,v,w))
        if(visited[w]==0)
            DFS(G,w,visited);
}
void DFStravel(Graph G)
{
    printf("G2深度优先遍历如下\n");
    int visited[MAX];
    int i;
    for(i=1;i<=G.vexnum;++i)
        visited[i]=0;
    for(i=1;i<=G.vexnum;++i)
        if(visited[i])
            DFS(G,i,visited);
}
int main(void)
{
    Graph G;
    G=*(Graph*)malloc(sizeof(Graph));
      CreatGraph(G);
    DFStravel(G);
    return 0;
}

运行结果只有一行G2深度优先遍历如下,请问出错在哪里了呢?如何修改?
文本文档内容为
3
3 2 1 0
3 1 2 0
2 1 3 0

  • 写回答

4条回答 默认 最新

  • 社区专家-Monster-XH 2023-11-23 19:30
    关注
    
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 100
    //定义邻接表
    typedef struct node{
        int adjvex;//顶点编号
        struct node *next;//指向下一个结点
    }edgenode;//
    typedef struct vnode{
        int vertex;//顶点
        edgenode *firstedge;//指向第一个表结点
    }vertexnode,AdjList[MAX];//头结点
    typedef struct{
        AdjList vertices; //顶点数组
        int vexnum;//顶点数
        int arcnum;//弧的条数
    }Graph;
    int CreatGraph(Graph &G)//从文件读取并输出邻接表
    {
        FILE *fp;edgenode *p;
        if((fp=fopen("graph.txt","r"))==NULL)
        {
          printf("文件打开失败\n");
          return 0;
        }
     
        fscanf(fp,"%d",&G.vexnum);
        G.arcnum=G.vexnum+1;
        printf("顶点个数%d\n",G.vexnum);
        int i;
        for (i = 1; i <= G.vexnum; i++) 
        {
          G.vertices[i].vertex = i ;
          G.vertices[i].firstedge = NULL;
     
          int a;
          while (1) 
          {
           fscanf(fp, "%d", &a);
           if (a == 0) break;
           else
            {
               p = (edgenode *)malloc(sizeof(edgenode));
               p->adjvex = a;
               p->next = G.vertices[i].firstedge;
               G.vertices[i].firstedge = p;
            }
           }
        }
     
        fclose(fp);
     
        //输出邻接表
        printf("创建无向图G2邻接表如下:\n");
        for(i=1;i<=G.vexnum;i++)
        {
           
            p=G.vertices[i].firstedge;//指向第一个表结点
            while(p!=NULL)
            {
              printf("%d->",p->adjvex);
              p=p->next;
            }
            printf("NULL\n");
        }
        return 1;
    }
    int Firstadjvex(Graph G, int v) {
        edgenode *p = G.vertices[v].firstedge;
        if (p != NULL)
            return p->adjvex;
        else
            return 0;
    }
    
    int Nextadjvex(Graph G, int v, int w) {
        edgenode *p = G.vertices[v].firstedge;
        while (p != NULL) {
            if (p->adjvex == w) {
                if (p->next != NULL) {
                    return p->next->adjvex;
                }
                break;
            }
            p = p->next;
        }
        return 0;
    }
    
    void DFS(Graph G,int v,int visited[])
    {
        printf("%d",G.vertices[v].vertex);
        visited[v]=1;int w;
        for(w= Firstadjvex(G,v);w;w=Nextadjvex(G,v,w))
            if(visited[w]==0)
                DFS(G,w,visited);
    }
    void DFStravel(Graph G) {
        printf("G2深度优先遍历如下\n");
        int visited[MAX];
        int i;
        for (i = 1; i <= G.vexnum; ++i)
            visited[i] = 0;
        for (i = 1; i <= G.vexnum; ++i)
            if (!visited[i])
                DFS(G, i, visited);
    }
    
    int main(void)
    {
        Graph G;
        if (!CreatGraph(G)) {
            printf("创建图失败。\n");
            return 1;
        }
        DFStravel(G);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 12月1日
  • 已采纳回答 11月23日
  • 创建了问题 11月23日

悬赏问题

  • ¥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 关于川崎机器人调速问题