我的问题似乎只能用单个指针来回答。我正在尝试动态分配2d链表。尝试使用类llist构造函数将头和尾指针设置为NULL时遇到的问题:
//I've included only the parts that I see are neccesary
struct node {
int value ;
int weight ;
node* next ;
} ;
class llist{
private :
node* tail, *head ;
public :
llist(){tail = NULL ; head = NULL ;} /* this unneccesary retype is to make sure
that it wasn't a typo*/
}
class list_graph
{
private :
int size, s;
llist ** v ;
public :
list_graph(int s){
this -> s = s ;
size = 0 ;
v = new llist* [s] ;
}
}
我已经使用调试器并执行了所有步骤,并且在创建llist
类型的对象之后,似乎没有调用list_graph
的构造函数,因此依赖于此的所有其他函数失败并给我分段错误。我在做错什么吗?还是在使用STL列表之外是否有其他解决方法,非常感谢
答案 0 :(得分:2)
此:
v = new llist* [s] ;
创建一个指向类型llist
的指针数组,但不创建任何llist
对象。如果您想要一系列这样的东西,那么您想要:
llist * v ;
和:
v = new llist[s] ;
或者更好,如果这不是家庭作业,请使用std :: vector。而且不要将llist ** v
之类的东西视为“双指针”;认为它们是什么-指向指针的指针。
答案 1 :(得分:1)
如果您要分配2D指针数组,则可以通过以下几种方式进行:
在指定了width
和height
的情况下使用指针数组的动态数组:
llist** data = new llist*[width];
for (int i = 0; i < width; ++i){
data[i] = new llist[height]; // constructors get called here
}
// accessing a linked list, make sure x is in [0, width) and y is in [0, height):
data[x][y]->value;
使用单个指针数组:
llist* data = new llist[width * height]; // constructors get called here
// accessing a linked list:
// again, make sure x is in [0, width) and y is in [0, height)
data[x + (y * width)]->value;
答案 2 :(得分:0)
如果要将mov ax, [num1]
保留为指向v
对象的指针的数组,而不是llist
对象(由Neil Butterworth建议)的数组,则通过将您的llist
构造函数更改为
list_graph
编辑:为避免在for循环中调用 list_graph(int s) : size(0), s(s), v(new llist* [s]) {
for (int i(0); i < s; ++i)
v[i] = new llist();
}
new
次,您可以一次预分配所有s
s
个对象。但是,这意味着它们不能单独删除。您的课程看起来像
llist