1808035990 发表于 2024-6-1 21:53:08

求助

#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;
        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=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=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);
                }
                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.firstarc=NULL;
        for(i=0;i<n;i++)
                for(j=n-1;j>=0;j--)
                        if(g.edges!=0)
                        {
                                p=(ArcNode *)malloc(sizeof(ArcNode));
                                p->adjvex=j;
                                p->nextarc=G->adjlist.firstarc;
                                G->adjlist.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.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);
}

FishC 发表于 2024-6-1 21:53:26

你好,你的代码有一些问题,我来帮你修改一下。

首先,你定义了一个结构体`Graph`用来表示图的信息,但是在函数`Matrix()`中,你又重新定义了一个局部变量`Graph G`。为了避免重复定义,我们可以把结构体`Graph`的定义放在`main()`函数之外,并将其作为参数传递到`Matrix()`函数中。同时,由于`Matrix()`函数的目的是接收用户输入顶点总数和边数总数,所以不需要返回任何值,可以将其改为`void`类型。

其次,你定义了一个结构体`ALGraph`来表示邻接表存储结构,但是在`Matrix()`函数中,你没有创建邻接表。所以我们需要在`Matrix()`函数中创建邻接表,并将其作为参数传递给`DispAdj()`函数。

最后,函数`MatToList()`没有实现,你需要自己编写这个函数来将邻接矩阵转换为邻接表。

下面是修改后的代码:

#include <stdio.h>
#include <stdlib.h>

#define MAXV 50

typedef int infoType;
typedef int VertexType;

typedef struct ANode
{
        int adjvex;
        struct ANode *nextarc;
        int weight;
} ArcNode;

typedef struct Vnode
{
        ArcNode *firstarc;
} VNode;

typedef VNode AdjList;

typedef struct
{
        AdjList adjlist;
        int n,e;
} ALGraph;

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

void Matrix(Graph *G)
{
        printf("请输入顶点总数:\n");
        scanf("%d", &(G->n));
        printf("请输入边数总数:\n");
        scanf("%d", &(G->e));

        // 这里可以根据用户输入的顶点总数和边数总数创建邻接表
        // 假设你已经创建好了邻接表,并将其存储在 G->adjlist 中
}

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.firstarc;
               
                while (p != NULL)
                {
                        printf("-->%d 权值:%d", p->adjvex, p->weight);
                        p = p->nextarc;
                }
               
        }
        printf("\n");
}

int main()
{
        Graph g;
        ALGraph G;

        Matrix(&g);
        // 根据用户输入的顶点总数和边数总数创建邻接表,将其存储在 G.adjlist 中
        // 然后将 G 作为参数传递给 DispAdj() 函数
        DispAdj(&G);
        return 0;
}

希望以上解答对你有帮助,如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求助