根据我到目前为止所学到的知识,如果我创建了指向大小为array
的变量struct adjlistnode
的变量v*sizeof(struct adjlistnode)
指针,我正在尝试使用邻接表实现图数组每个索引
struct adjlistnode
型节点的地址
意味着数组的每个索引都将指向类型为struct adjlistnode
的节点,但是当我分配G->array[i]=NULL
时会出现错误
||=== Build: Debug in teeest (compiler: GNU GCC Compiler) ===|
C:\Users\Mahi\Desktop\DATA STR\teeest\main.c||In function 'creategraph':|
C:\Users\Mahi\Desktop\DATA STR\teeest\main.c|59|error: incompatible types when assigning to type 'struct adjlistnode' from type 'void *'|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
为什么我无法将NULL分配给数组的索引
如果我要访问邻接列表,例如使用G->array[i]
=与图的第i
个顶点相邻的第一个节点地址,以后该怎么办,以后我将根据需要添加另一个节点
struct adjlistnode{
int dest;
struct adjlistnode* next;
};
struct graph{
int V;
struct adjlistnode* array;
};
struct adjlistnode* getnewnode(int dest){
struct adjlistnode* newnode =(struct adjlistnode*)malloc(sizeof(struct adjlistnode));
newnode->dest=dest;
newnode->next=NULL;
return newnode;
}
struct graph* creategraph(int v){
struct graph* G=(struct graph*)malloc(sizeof(struct graph));
G->V=v;
G->array=(struct adjlistnode*)malloc(v*sizeof(struct adjlistnode));
for(int i=0;i<v;i++){
G->array[i] =NULL;
}
return G;
}
答案 0 :(得分:2)
G->array
的类型为struct adjlistnode *
但是
G->array[i]
的类型为struct adjlistnode
。
因此,您无法将NULL
(类型void *
)分配给类型G->array[i]
的{{1}}
您可能应该将struct adjlistnode
中的array
定义为指针的指针
struct graph
然后以下内容将为您工作
struct graph{
int V;
struct adjlistnode** array;
};
** Note1 (也由@alk在注释中提到),至少在C89标准中,struct graph* creategraph(int v){
struct graph* G=malloc(sizeof(struct graph));
G->V=v;
G->array=malloc(v*sizeof(struct adjlistnode*));
for(int i=0;i<v;i++){
G->array[i] =NULL;
}
return G;
}
返回C malloc
。可以将void *
分配给任何其他指针类型(反之亦然),因此不需要强制转换void *
的返回值。
** Note2 (也由@alk指出)malloc
签名是使用类型malloc
而不是size_t
的参数定义的,因此最好进行修改编写一些代码并使用正确的类型(有关更多信息,请阅读comparing int with size_t和size_t vs int in C++ and/or C)
答案 1 :(得分:1)
array
是指向struct adjlistnode
的(单个)指针。因此可以将其设置为NULL。
G->array = NULL; //is okay
但这不是指针数组,因此您无法访问该数组的元素,也不能将它们设置为NULL。
对于动态分配,您应该这样做:
struct graph{
int V;
struct adjlistnode** array;
};
struct graph* creategraph(int v){
struct graph* G = malloc(sizeof(struct graph));
G->V = v;
G->array = malloc(v * sizeof(struct adjlistnode*)); //allocation for an array of v pointers
for(int i = 0; i < v; i++){
G->array[i] = NULL;
}
return G;
}
如@alk所建议,最好将v
传递为size_t
而不是int
,因为malloc
需要size_t
。
答案 2 :(得分:1)
G->array[i]
返回*(array + i * sizeof(struct adjlistnode))
,就像array
是struct adjlistnode array[]
。
您要做的是存储struct
的v对象,但是您尝试使用NULL初始化它们,就像使用指针一样。
您可能想要的是
struct graph{
int V;
struct adjlistnode** array;
};
[...]
G->array=(struct adjlistnode**)malloc(v*sizeof(struct adjlistnode*));
这将使array
指向指针数组。
然后G->array[i]
将返回一个指向结构对象的struct adjlistnode*
指针,然后可以用getnewnode()
进行初始化。