0

我用这种方法创建了一个链表......

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 类,但我不清楚。

我可能在我的程序中犯了一些愚蠢的错误,因为我是数据结构的新手,而且我对在线参考感到困惑。

4

2 回答 2

2

在构造函数中 -

head = NULL;
head -> data = str;

代码具有未定义的行为。您不应访问 NULL 指针上的成员。head指向正确的内存位置后,您还应该执行-

head -> next = NULL;

在附加操作可靠地工作的构造函数中。我认为Element::Append应该收到std::string你正在尝试做的参数 -

newnode->data = elem;
于 2013-09-01T18:22:40.887 回答
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。因此,在您的设计中,列表的开头被放在两个地方,这没有多大意义。我不认为这是你老师的意图,但我可能是错的。

于 2013-09-01T20:28:02.483 回答