C++ 邻接列表的图形声明

C++ 邻接列表的图形声明,c++,graph,C++,Graph,我越来越 错误:从类型“struct listnode*”分配给类型“struct listnode”时,类型不兼容 错误:'->'的无效类型参数have('struct listnode') 这里的指针有什么问题?提前谢谢 #include <stdio.h> #include <stdlib.h> struct listnode{ int vertex; struct listnode *next; };

我越来越

错误:从类型“struct listnode*”分配给类型“struct listnode”时,类型不兼容

错误:'->'的无效类型参数have('struct listnode')

这里的指针有什么问题?提前谢谢

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

     struct listnode{
     int vertex;
    struct listnode *next;
     };
 struct Graph{
  int V;
  int E;
  struct listnode *adj;
 };


 void print(struct Graph *G);

  struct Graph* initategraph(){
    int i,source,dest;
    struct listnode *temp;
    struct Graph *G=(struct Graph*)malloc(sizeof(struct Graph));
    if(!G)
       {printf("Memory not available");
         return;
       }
    printf("Enter the vertex no. and edges \n");
    scanf("%d %d",&G->V,&G->E);
    G->adj = malloc(G->V*sizeof(struct listnode));
    for(i=0;i<G->V;i++)
    {
        G->adj[i] =(struct listnode *)malloc(sizeof(struct listnode));
        G->adj[i]->vertex = i;
        G->adj[i]->next=G->adj[i];
    }
    for(i=0;i<G->E;i++){
        scanf("%d %d",&source,&dest);

      temp= (struct listnode *)malloc(sizeof(struct listnode));
        temp->vertex=dest;
        temp->next=G->adj[source];
        G->adj[source]->next=temp;

        temp =(struct listnode *)malloc(sizeof(struct listnode));
        temp->vertex=source;
        temp->next=G->adj[dest];
        G->adj[dest]->next=temp;


      }
    return G;
 } 
  void print(struct Graph *G){
   int i;
   struct listnode *temp;
    for(i=0;i<G->V;i++){
    temp=G->adj[i];
    while(temp)
    {
        printf("%d --> ",temp->vertex);
        temp=temp->next;
     }
     printf("\n\n");
   }
 }

 void main()
   {
   struct Graph *G;
   G=initategraph();
   print(G);


   }
#包括
#包括
结构列表节点{
int顶点;
结构listnode*next;
};
结构图{
INTV;
INTE;
结构列表节点*adj;
};
作废打印(结构图*G);
结构图*initategraph(){
int i,来源,目的地;
结构列表节点*temp;
结构图*G=(结构图*)malloc(sizeof(结构图));
if(!G)
{printf(“内存不可用”);
返回;
}
printf(“输入顶点编号和边\n”);
扫描频率(“%d%d”,&G->V,&G->E);
G->adj=malloc(G->V*sizeof(struct listnode));
对于(i=0;iV;i++)
{
G->adj[i]=(struct listnode*)malloc(sizeof(struct listnode));
G->adj[i]->顶点=i;
G->adj[i]->next=G->adj[i];
}
对于(i=0;即;i++){
scanf(“%d%d”,&source,&dest);
temp=(struct listnode*)malloc(sizeof(struct listnode));
温度->顶点=dest;
temp->next=G->adj[源];
G->adj[源]->next=温度;
temp=(struct listnode*)malloc(sizeof(struct listnode));
温度->顶点=源;
临时->下一步=G->调整[目的地];
G->adj[dest]->next=温度;
}
返回G;
} 
无效打印(结构图*G){
int i;
结构列表节点*temp;
对于(i=0;iV;i++){
温度=G->adj[i];
while(临时)
{
printf(“%d-->”,temp->vertex);
温度=温度->下一步;
}
printf(“\n\n”);
}
}
void main()
{
结构图*G;
G=initategraph();
印刷品(G);
}

首先
G->adj=malloc(G->V*sizeof(struct listnode))
已经分配了一个动态内存,其siez为
G-V
元素的类型为
struct listnode
。因此,从循环内部删除这个语义不正确的语句:
G->adj[i]=(struct listnode*)malloc(sizeof(struct listnode))

G->adj[i]
的类型是
struct listnode
而不是
struct listnode*
。将
G->adj[i]->顶点
更改为
G->adj[i]。顶点

G->adj[i]的类型。下一个
struct listnode*
,而
G->adj[i]
的类型是
struct listnode
。更改
G->adj[i]->next=G->adj[i]
G->adj[i]。下一步=&(G->adj[i])
G->adj[i]
i
th元素本身,而不是指向
i
th元素的指针

&(G->adj[i])
类似于
G->adj+i
adj[i]
类似于
*(adj+i)
&(adj[i])
类似于
adj+i

注释在
G->adj[i]之后。下一步=&(G->adj[i])
成员
next
引用其自己的
struct listnode
。我不知道你是不是想这么做

调整您的代码,如下所示:

struct Graph* initategraph(){
    int i,source,dest;
    struct listnode *temp;
    struct Graph *G=(struct Graph*)malloc(sizeof(struct Graph));
    if( G =0 NULL )
    {
        printf("Memory not available");
        return NULL;
    }
    printf("Enter the vertex no. and edges \n");
    scanf("%d %d",&G->V,&G->E);
    G->adj = malloc(G->V*sizeof(struct listnode));
    for( i=0; i<G->V; i++ )
    {
        G->adj[i].vertex = i;
        G->adj[i].next = &( G->adj[i] );
    }
    for( i=0; i<G->E; i++ ){
        scanf("%d %d",&source,&dest);
        temp= (struct listnode *)malloc(sizeof(struct listnode));
        temp->vertex=dest;
        temp->next = &( G->adj[source] );
        G->adj[source].next = temp;

        temp =(struct listnode *)malloc(sizeof(struct listnode));
        temp->vertex=source;
        temp->next = &( G->adj[dest] );
        G->adj[dest].next = temp;
    }
    return G;
} 
struct Graph*initategraph(){
int i,来源,目的地;
结构列表节点*temp;
结构图*G=(结构图*)malloc(sizeof(结构图));
如果(G=0 NULL)
{
printf(“内存不可用”);
返回NULL;
}
printf(“输入顶点编号和边\n”);
扫描频率(“%d%d”,&G->V,&G->E);
G->adj=malloc(G->V*sizeof(struct listnode));
对于(i=0;iV;i++)
{
G->adj[i]。顶点=i;
G->adj[i].next=&(G->adj[i]);
}
对于(i=0;即;i++){
scanf(“%d%d”,&source,&dest);
temp=(struct listnode*)malloc(sizeof(struct listnode));
温度->顶点=dest;
temp->next=&(G->adj[source]);
G->adj[源]。下一步=温度;
temp=(struct listnode*)malloc(sizeof(struct listnode));
温度->顶点=源;
临时->下一步=&(G->调整[目的地];
G->adj[dest]。下一步=温度;
}
返回G;
} 
注意:我不知道该算法是否正在执行您希望它执行的操作。我只修复了编译错误