我正在编写代码来接受c中的加权邻接表。每条边都以结构体的形式存储。我创建了一个指针数组,其中每个指针都指向一个节点的列表。这就是我所做的:
#include<stdio.h>
#include<stdlib.h>
struct edge{
int u;
int v;
int w;
};
// taking a weighted adjacency list
int main(){
int n; // number of nodes
scanf("%d ",&n);
struct edge** list[n];
int p=n;
while(p){
struct edge* n_list=(struct edge*)malloc(n*sizeof(struct edge));
int num=1;
for(int i=0;i<n;i++){
n_list[i].u=n-p;
scanf("%d ",&n_list[i].v);
if(n_list[i].v==-1) {
n_list[i].w=-1;
break;
}
else{
num++;
scanf("%d ",&n_list[i].w);
}
}
n_list=(struct edge*)realloc(n_list,num*sizeof(struct edge));
list[n-p]=&n_list;
struct edge* ptr=*list[n-p];
for(int j=0;j<num-1;j++){
printf("%d %d %d\n",ptr[j].u,ptr[j].v,ptr[j].w);
}
p--;
}
}
问题是边被正确打印,但在 p(节点数)上的整个迭代之后,指针数组(列表)中的每个元素都存储了相同的地址。我猜测每次我对 n_list 使用 malloc 时,它都会在同一位置分配内存,从而在我开始接受输入时擦除前一个节点的列表。我怎样才能确保这种情况不会发生?也欢迎使用任何更简单的方法来完成此任务。
这就是你的问题
list[n-p]=&n_list;
// ^ address of
这会将
n_list
的地址放入 list[n-p]
中。这将是堆栈上的地址 - n_list
的位置。
list
的元素属于 struct edge**
类型,但您将 struct edge*
类型的项目放入其中。你的间接性太多了。幸运的是,您还取消引用指针以在迭代结束之前进行打印,并且 n_list
会在下一次进行 malloc。
struct edge* ptr=*list[n-p];
// ^ dereference
要解决此问题,请按如下方式声明
list
struct edge** list[n];
并删除“地址”/取消引用
list[n-p] = n_list;
struct edge* ptr = list[n-p];