我正在
错误:分配到类型' 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);
}
答案 0 :(得分:0)
首先,G->adj = malloc(G->V*sizeof(struct listnode));
已经分配了一个动态内存,其中包含G-V
个struct 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;
}
注意:我不知道算法是否正在执行您希望它执行的操作。我只修复了编译错误。