我在c ++中遇到链接列表的问题。 我上课看起来像那样:
class list {
private: struct node {
node * next;
int val;
};
node * head;
node * current;
public: list();
list(const list & l);
list & operator = (const list & l);~list();
void insert(int a);
void goToHead();
int getCurrentData();
void advance();
bool moreData();
};
我不会在这里描述所有函数,我确定它们正常工作但是有运算符声明=:
list & list::operator = (const list & l) {
if ( & l == this) return *this;
current = NULL;
node * src, * * dst;
head = ( * this).head;
src = l.head;
dst = & head;
while (src) {
if (!( * dst)) { * dst = new node;
}
( * dst) - > val = src - > val;
if (src == l.current) current = * dst;
src = src - > next;
dst = & (( * dst) - > next);
}
while (( * dst) != NULL) {
node * t = ( * dst) - > next;
delete * dst;
( * dst) = t;
}
return *this;
}
它必须将值从一个列表复制到另一个列表,添加节点或在必要时删除它们。如果列表相等或第二个更长(因此必须删除节点),它可以工作。但是当它应该添加一些时节点然后:
==4582== Conditional jump or move depends on uninitialised value(s)
==4582== at 0x8048C52: list::operator=(list const&) (list.cpp:103)
==4582== by 0x804891B: main (testlist.cpp:38)
==4582== Uninitialised value was created by a heap allocation
==4582== at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==4582== by 0x8048BDE: list::operator=(list const&) (list.cpp:93)
==4582== by 0x804891B: main (testlist.cpp:38)
我不知道这个声明有什么问题。谢谢你的帮助。
很抱歉,如果格式错误,我有一些问题,这就是原因。也许有一些例子,但我必须使用这个,我有一个任务这样做,我的意思是我有代码示例,只是必须完成它。我还有同样的问题: 第93行是:
* dst = new node;
103只是最后一个结束
}
再次感谢您的帮助。
答案 0 :(得分:0)
如果第93行
* dst =新节点;
和103
node *t=(*dst)->next;
您可能希望在NULL旁边发送dst->(在您创建新内容之后),否则它会指向未初始化的内存。