0

我已经为此工作了一段时间,但我似乎无法弄清楚如何正确地遍历我的链表。现在,我可以运行程序,它运行了,但我没有从链表中得到任何结果。这是我到目前为止的代码,这是应该发生的。在此处输入图像描述

这是我的结果。在此处输入图像描述但这也立即崩溃

#ifndef LList_h
#define LList_h

#include <iostream>
#include "node.h"

class LList
{
public:
    LList(void);            //constructor
    LList(const LList &);   //copy constructor
    ~LList();           //destructor

    LList *next;            //points to next node
    void push_back(const string &str);
    void push_front(const string &str);
    friend ostream& operator<<(ostream& out, const LList& llist);
    LList &operator=(const LList &l);       
private:
    Node *_head;
    Node *_tail;

    string _str;
};

inline LList::LList(void) {
    cerr << "head = tail = 0 at 0024f8d0\n";

    _head = 0;
    _tail = 0;
}

inline void LList::push_back(const string &_str) {
    Node *p = new Node(_str);
    if (_tail == 0) {
        _tail = p;
    } else {
        _tail ->next(p);
        _tail = p;
    }        
}

inline void LList::push_front(const string &_str) {
    Node *p = new Node(_str);

    if (_head == 0) {
        _head  = p;
    } else {
        _head ->next(p);
        _head = p;
    }
}

ostream &operator <<( ostream &out, const LList & llist ) {
    for( LList *p = llist.front; p != 0; p = p -> next )
        out << p;

    return out;
}

LList & LList::operator=(const LList &l) {
    _head = 0;
    _tail = 0;

    return *this;
}
#endif
4

2 回答 2

1

看来您的原始代码可能存在多个问题。鉴于上面的讨论和一些回应,我建议从更简单的开始。让它发挥作用,然后逐渐扩展它,直到你拥有最初的目标。

我将首先实现一个非常简单的单链表而不使用类。定义一个结构,其中包含一个指向相同类型结构的指针和一个数据字段(可能只是一个整数)。

创建此结构的三个左右变量并将它们链接在一起,以便第一个指向第二个,第二个指向第三个,第三个指向 NULL(通过它可以识别列表的末尾)。

然后演示遍历列表。C中一个非常常见的习语如下:

for (ptr = &first; ptr; ptr = ptr->next)
{
   printf("%p %d\n", ptr, ptr->data);
}

确保你理解它为什么起作用,并用它来熟悉指针和链表是如何工作的。练习使用调试器单步执行您的列表,并确保您了解当您到达列表末尾时循环如何终止。

一旦你对此感到满意,一定要把它包装在一个类中,并添加诸如 push_back() 和 push_front() 之类的方法,并重载一些运算符。

但请确保您首先掌握了基础知识。

于 2013-02-14T14:39:24.757 回答
0

函数有什么Node::next(Node *p)作用?如果它将下一个字段设置为thisto ,那么您的函数中p的这段代码可能是错误的:push_front

else
{
    _head ->next(p);
    _head = p;
}

而是应该:

  1. 设置p.next_head. (头现在跟随p
  2. 设置_headp. (新头是p
于 2013-02-14T14:08:27.517 回答