C++ 邻接列表的图形声明
我越来越 错误:从类型“struct listnode*”分配给类型“struct listnode”时,类型不兼容 错误:'->'的无效类型参数have('struct listnode') 这里的指针有什么问题?提前谢谢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; };
#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;
}
注意:我不知道该算法是否正在执行您希望它执行的操作。我只修复了编译错误