STL和元素插入中列表的动态分配
Dynamic allocation of list in STL and element insertion
应该在图中读取以下代码,然后在相邻节点的动态分配列表中介绍一定数量的边缘。由于某种原因,该程序在read_graf()
中调用add_edge()
功能时停止,而IDE(又称CB)为stl_list
打开了主文件。谁能指出问题?谢谢!
这是代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<list>
#define grafMAX 101
FILE *fin = fopen("grafin.txt","r");
FILE *fout = fopen("grafout.txt","w");
struct Graf{
int nrV;
std::list <int> *ad;
};
void init_graf(Graf g, int nr){
g.nrV = nr;
g.ad = new std::list <int> [g.nrV];//(std::list <int> *)malloc(g.nrV * sizeof(std::list <int>));
}
void add_edge(Graf g, int n1, int n2){
g.ad[n1].push_back(n2);
g.ad[n2].push_back(n1);
}
inline int min(const int a, const int b){
if(a < b)
return a;
return b;
}
void read_graf(Graf g){
int n,m;
fscanf(fin,"%d%d",&n,&m);
init_graf(g,n);
while(m){
int x,y;
fscanf(fin,"%d%d",&x,&y);
add_edge(g,x,y);
--m;
}
}
这是一个输入:
10 - # of nodes
11 - # of edges to be read
1 2
1 3
1 10
2 4
3 4
3 5
5 6
5 7
6 7
7 8
7 9
您是通过值将Graf
传递给函数。这意味着更改都是您通过的参数的副本。原件没有变化。
如果您希望更改在功能之外可见,则应将其引用到Graf
,例如void init_graf(Graf& g, int nr)
。
在我开始之前,这是两种C编码样式的奇怪组合,只有少量的C 扔进来访问列表类。这从来不是一个好主意。您的大部分代码都是用C编写的,因此您应该使用通过Malloc获得的C阵列。如果要使用C 列表类,则应使用C 类重写此程序,并包括文件和构造。
解决您的问题...
当您调用init_graf时,您将按值传递GRAF G,因此INIT_GRAF完成的任何初始化在init_graf返回时都会丢失。您需要通过C中的参考将其传递,以便您可以更新它。
稍后,当您调用add_edge时,g仍未实现,因此" AD"字段仍然不可原始化,因此G.AD [N1]会删除一个不好的指针,导致例外,您的程序将停止:
void add_edge(Graf g, int n1, int n2){
g.ad[n1].push_back(n2);
g.ad[n2].push_back(n1);
为了解决此问题,init_graf应该获得指向GRAF结构的指针,同样,add_edge也应获得G的指针。这是删除类列表(使其成为真正的C程序)的解决方案。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// #include<list>
#define grafMAX 101
FILE *fin = fopen("grafin.txt","r");
FILE *fout = fopen("grafout.txt","w");
struct Edge {
int startNode;
int endNode;
};
struct Graf{
int nrV;
int edgeCount; // Added to keep track of number allocated
Edge *ad;
};
void init_graf(Graf *g, int nr){
g->nrV = 0;
g->edgeCount = nr;
g->ad = malloc(graphMax*sizeof(Edge));
}
void add_edge(Graf *g, int n1, int n2){
// Check array bound before adding a new edge
if (g->nrV < g->edgeCount) {
// Add the edge to the edge array and increment nrV
g->ad[g->nrV].startNode = n1;
g->ad[g->nrV].endNode = n2;
g->nrV++;
}
}
inline int min(const int a, const int b){
if(a < b)
return a;
return b;
}
void read_graf(Graf *g){
int n,m;
fscanf(fin,"%d%d",&n,&m);
init_graf(g,n);
while(m){
int x,y;
fscanf(fin,"%d%d",&x,&y);
add_edge(g,x,y);
--m;
}
}
如果您真的想使用C ,则BO的建议使用&amp;通过引用传递GRAF参数非常好,但是我建议您重组程序以使用类而不是结构并使用C 标头而不是C标头(例如Cstdio而不是STDIO.H)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 动态分配Q_Property变量
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- 通过动态分配插入列表元素
- 如何删除列表中的动态分配类对象<T>?
- STL和元素插入中列表的动态分配
- 为什么动态分配的数组不能从列表初始值设定项推断其大小
- 实现对象列表时,如何处理动态分配
- 当为将被放入数组中的字符串列表动态分配内存时,是否可以在程序的稍后添加到该列表中
- 在动态分配时将C++11对象添加到列表中