邻接列表的图形声明

时间:2016-01-31 09:17:22

标签: c++ graph

我正在

  

错误:分配到类型' struct listnode'时出现不兼容的类型来自类型' struct listnode *'

     

错误:' - >'的无效类型参数有(' 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);


   }

1 个答案:

答案 0 :(得分:0)

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

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

G->adj[i].next的类型为struct listnode*G->adj[i]的类型为struct listnode。将G->adj[i]->next=G->adj[i];更改为G->adj[i].next = &( G->adj[i] );G->adj[i]i元素本身,而不是指向i元素的指针。

注意&( G->adj[i] )G->adj + i类似。 adj[i]*(adj + i)类似,&(adj[i])adj + i类似。

注意G->adj[i].next = &( 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;
} 

注意:我不知道算法是否正在执行您希望它执行的操作。我只修复了编译错误。

相关问题