我在这个方法中创建了一个链表...
class stack
{
struct node
{
int data;
node *link;
}*top;
void insert()
{ ... }
void display()
{ ... }
};
并且它工作正常...现在我尝试使用自包含链表执行相同的操作但最终出现错误。这是我的代码
class Element
{
public:
Element(const std::string& str)
{
head = NULL;
head -> data = str;
}
void Append(const Element& elem)
{
node *newnode;
newnode=new node;
newnode->data = elem;
node *target=head;
while(target->next != NULL)
target = target->next;
target -> next = newnode;
}
private:
struct node
{
string data;
node *next;
}*head;
};
void main()
{
Element *root = new Element("Hello");
root->Append(Element("World"));
}
我只想修改我的Element类,但我不清楚。
我可能在我的程序中犯了一些愚蠢的错误,因为我是数据结构的新手,我对在线引用感到困惑。
答案 0 :(得分:2)
在构造函数中 -
head = NULL;
head -> data = str;
代码具有未定义的行为。您不应该访问NULL指针上的成员。在head
指向正确的内存位置后,您还应该 -
head -> next = NULL;
在构造函数中为append操作可靠地工作。我认为Element::Append
应该收到std::string
参数,假设您正在尝试 -
newnode->data = elem;
答案 1 :(得分:0)
我认为你的设计是错误的。我可能会猜测你老师的意思,但我认为自包含列表应该是这样的。
class Element
{
public:
Element(const std::string& str)
{
data = str;
next = NULL;
}
void Append(const Element& elem)
{
Element* tail = this;
while (tail->next)
tail = tail->next;
tail->next = new Element(elem.data);
}
private:
string data;
Element *next;
};
换句话说,Element
是节点类。我认为这就是老师所说的'自包含链表类','元素不是经理类'。
在main
代码中,您会注意到列表的开头是如何在变量root
中。但是你也试图在Element::head
中保持列表的开头。因此,对于您的设计,列表的开头是在两个地方举行,这没有多大意义。我不认为这是你老师的意图,但我可能是错的。