鱼C论坛

 找回密码
 立即注册
查看: 572|回复: 1

[已解决]求助

[复制链接]
发表于 2024-6-1 23:23:55 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>
#include<stdlib.h>
#define MAXV 50

typedef int infoType;
typedef int VertexType;
typedef struct
{
        int edges[MAXV][MAXV];
        int n,e;
}Graph;

typedef struct ANode
{
        int adjvex;
        struct ANode *nextarc;
        int weight; 
}ArcNode;
typedef struct Vnode
{
        ArcNode *firstarc;
}VNode;
typedef VNode AdjList[MAXV];
typedef struct
{
        AdjList adjlist;
        int n,e;
}ALGraph;

void Matrix()
{
        Graph G;
        printf("请输入顶点总数:\n");
        scanf("%d",&(G.n));
        printf("请输入边数总数:\n");
        scanf("%d",&G.e);
        for(int i=0;i<G.n;i++)
                for(int j=0;j<G.n;j++)
                        G.edges[i][j]=0;
        printf("请输入边的起始索引、终止索引和权值:\n");
        for(int i=0;i<G.e;i++)
        {
                int start;
                int end;
                int weight;
                scanf("%d %d %d",&start,&end,&weight);
                G.edges[start][end]=weight;
        }
        printf("输出有向带权图G的邻接矩阵:\n");
        for(int i=0;i<G.n;i++)
        {
                for(int j=0;j<G.n;j++)
                {
                        printf("%d\t",G.edges[i][j]);
                }
                printf("\n");
        }
}

void MatToList(Graph g,ALGraph *&G)    //创建邻接表 
{
        int i,j,n=g.n;
        ArcNode *p;
        G=(ALGraph *)malloc(sizeof(ALGraph));
        for(i=0;i<n;i++)
                G->adjlist[i].firstarc=NULL;
        for(i=0;i<n;i++)
                for(j=n-1;j>=0;j--)
                        if(g.edges[i][j]!=0)
                        {
                                p=(ArcNode *)malloc(sizeof(ArcNode));
                                p->adjvex=j;
                                p->nextarc=G->adjlist[i].firstarc;
                                G->adjlist[i].firstarc=p;
                        }
        G->n=n;
        G->e=g.e;
}

void DispAdj(ALGraph *G)
{
        int i;
        ArcNode *p;
        printf("\n-------------------------------");
        printf("\n图的邻接表表示:\n");
        
        for(i=0;i<G->n;i++)
        {
                printf("\n   AdjList[%d]",i);
                p=G->adjlist[i].firstarc;
                
                while(p!=NULL)
                {
                        printf("-->%d权值[%d]",p->adjvex,p->weight);
                        p=p->nextarc;
                }
                
         } 
         printf("\n");
}

int main()
{
        Matrix();
        Graph g;
        ALGraph *G;
        MatToList(g,G);
        DispAdj(G);
}
求修改使得能输出邻接表
最佳答案
2024-6-1 23:24:17
你好!根据你的代码,我发现了一些问题并进行了修改。具体修改如下:

1. 首先,在主函数中声明了一个`Graph g`变量,但没有输入顶点数和边数的值。我将这部分代码迁移到了`Matrix`函数中。

2. 在`Matrix`函数中,你需要遍历图的边,使用`for`循环语句,从1到`G.e`。在循环中,接收每条边的起点、终点和权值,并创建对应的邻接表。

3. 接着,在`Matrix`函数中,你需要将邻接表存储到邻接表图`ALGraph`结构中。首先要为`G`动态分配内存空间,然后逐个初始化邻接表节点。

下面是修改后的代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXV 50

typedef int infoType;
typedef int VertexType;
typedef struct
{
    int edges;
    int n, e;
} Graph;

typedef struct ANode
{
    int adjvex;
    struct ANode *nextarc;
    int weight;
} ArcNode;
typedef struct Vnode
{
    ArcNode *firstarc;
} VNode;
typedef VNode AdjList;
typedef struct
{
    AdjList adjlist[MAXV];
    int n, e;
} ALGraph;

void Matrix(Graph *G, ALGraph *AdjG)
{
    printf("请输入顶点总数:\n");
    scanf("%d", &(G->n));
    printf("请输入边数总数:\n");
    scanf("%d", &(G->e));
    for (int i = 0; i < G->n; i++)
    {
        AdjG->adjlist[i].firstarc = NULL;
    }
    printf("请输入每条边的起点、终点和权值:\n");
    for (int k = 0; k < G->e; k++)
    {
        int start, end, weight;
        scanf("%d%d%d", &start, &end, &weight);
        ArcNode *newArc = (ArcNode *)malloc(sizeof(ArcNode));
        newArc->adjvex = end;
        newArc->weight = weight;
        newArc->nextarc = AdjG->adjlist[start].firstarc;
        AdjG->adjlist[start].firstarc = newArc;
    }
}

void DispAdj(ALGraph *G)
{
    int i;
    ArcNode *p;
    printf("\n-------------------------------");
    printf("\n图的邻接表表示:\n");

    for (i = 0; i < G->n; i++)
    {
        printf("\n   AdjList[%d]", i);
        p = G->adjlist[i].firstarc;

        while (p != NULL)
        {
            printf("-->%d(权值:%d)", p->adjvex, p->weight);
            p = p->nextarc;
        }
    }
    printf("\n");
}

int main()
{
    Graph g;
    ALGraph *G = (ALGraph *)malloc(sizeof(ALGraph));
    Matrix(&g, G);
    DispAdj(G);
    return 0;
}

希望对你有所帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-1 23:24:17 | 显示全部楼层    本楼为最佳答案   
你好!根据你的代码,我发现了一些问题并进行了修改。具体修改如下:

1. 首先,在主函数中声明了一个`Graph g`变量,但没有输入顶点数和边数的值。我将这部分代码迁移到了`Matrix`函数中。

2. 在`Matrix`函数中,你需要遍历图的边,使用`for`循环语句,从1到`G.e`。在循环中,接收每条边的起点、终点和权值,并创建对应的邻接表。

3. 接着,在`Matrix`函数中,你需要将邻接表存储到邻接表图`ALGraph`结构中。首先要为`G`动态分配内存空间,然后逐个初始化邻接表节点。

下面是修改后的代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXV 50

typedef int infoType;
typedef int VertexType;
typedef struct
{
    int edges;
    int n, e;
} Graph;

typedef struct ANode
{
    int adjvex;
    struct ANode *nextarc;
    int weight;
} ArcNode;
typedef struct Vnode
{
    ArcNode *firstarc;
} VNode;
typedef VNode AdjList;
typedef struct
{
    AdjList adjlist[MAXV];
    int n, e;
} ALGraph;

void Matrix(Graph *G, ALGraph *AdjG)
{
    printf("请输入顶点总数:\n");
    scanf("%d", &(G->n));
    printf("请输入边数总数:\n");
    scanf("%d", &(G->e));
    for (int i = 0; i < G->n; i++)
    {
        AdjG->adjlist[i].firstarc = NULL;
    }
    printf("请输入每条边的起点、终点和权值:\n");
    for (int k = 0; k < G->e; k++)
    {
        int start, end, weight;
        scanf("%d%d%d", &start, &end, &weight);
        ArcNode *newArc = (ArcNode *)malloc(sizeof(ArcNode));
        newArc->adjvex = end;
        newArc->weight = weight;
        newArc->nextarc = AdjG->adjlist[start].firstarc;
        AdjG->adjlist[start].firstarc = newArc;
    }
}

void DispAdj(ALGraph *G)
{
    int i;
    ArcNode *p;
    printf("\n-------------------------------");
    printf("\n图的邻接表表示:\n");

    for (i = 0; i < G->n; i++)
    {
        printf("\n   AdjList[%d]", i);
        p = G->adjlist[i].firstarc;

        while (p != NULL)
        {
            printf("-->%d(权值:%d)", p->adjvex, p->weight);
            p = p->nextarc;
        }
    }
    printf("\n");
}

int main()
{
    Graph g;
    ALGraph *G = (ALGraph *)malloc(sizeof(ALGraph));
    Matrix(&g, G);
    DispAdj(G);
    return 0;
}

希望对你有所帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 10:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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