我的LinkedList类有什么问题?

时间:2010-03-22 06:57:15

标签: c++

class LinkedList
{
  private:
    int data;  
    LinkedList *ptr;  
public:
  LinkedList(int i_data)  
  { 
    data = i_data;  
    ptr = 0;  
  }  
  ~LinkedList()  
  {  
    delete ptr ;  
  }  
  void insert(LinkedList *node)  
  {  
    while(this->ptr!= 0)  
    this = this->ptr;  

    this->ptr= node;  
  }  
}

我将创建一个类似head = new LinkedList(4)的头节点,然后将调用 head->insert(new LinkedList(5))随后。你能否告诉我上面的课程代表一个链表。我想是的它有包含下一个节点地址的节点。如果我错了,请纠正我

6 个答案:

答案 0 :(得分:2)

是的,这种类型肯定代表一个单独链接的列表结构,因为它有一个数据槽和一个下一个指针。

我要改变的一件事是insert方法。恕我直言,这种方法采用数据类型更方便,在本例中为int,让LinkedList类承担分配数据结构的工作。

例如。

void insert(int data) {
    while(this->next != 0)  
    this = this->next;  

    this->next = new LinkedListNode(data);  
}

答案 1 :(得分:1)

您已将最后一个节点的下一个指向NULL

void insert(LinkedList * node)
  {
    while(this-> next!= 0)
    this = this-> next;

this->next = node; 
node->next = 0;

}

答案 2 :(得分:1)

如果您需要链接列表,请使用它的STL版本。它已经实施和测试,在大多数情况下,大多数人都无法实现比这更好的任何东西。

从代码的角度来看,你不能分配给this,所以insert方法不会编译 - 在这里使用尾递归来考虑。在更高级别,您应该首选初始化列表来在构造函数体中进行赋值。您可以考虑使用智能指针来减轻手动管理内存的需要,即使在这种简单的情况下也不会有问题。

您应该首先考虑界面,然后再考虑如何为其提供实现。特别是您可能想要的最简单的界面是:

class List {
public:
  List();                   // creates an empty list

  void append( int value ); // adds a new element at the tail of the list
     // push_front( value ) in STL sequence containers

  void insert( int value ); // inserts a new element before the head of the list
     // push_back( value ) in STL sequence containers

  // some way of iterating (I like STL iterators,
  // but Java style iterator --even if worse-- could suffice)
};

实际上我想在界面中有更多的东西,但上面的集合是一个最小的方法(不包含析构函数,但当然我希望资源由实现管理!)。现在,通过定义LinkedList(实际上更接近节点的定义),您无法创建空列表。您可以在列表末尾append,但不能在列表的第一个元素之前插入。您没有提供从列表中提取数据的工具(!!)

如果您需要几分钟的时间来考虑链接列表中可能需要的额外功能(通过迭代器删除给定元素,以便您可以搜索值X并将其从列表中删除,在给定的位置插入在列表中的位置,而不仅仅是头部或尾部...)您将在界面中提出其他要求,然后您只需要在代码中满足这些要求,这总是更简单:)

答案 3 :(得分:0)

  1. 你的课程没有关闭。最后添加};
  2. 应该关闭构造函数的大括号是一个开头的。
  3. 这是一个链接列表,但是使用单独的nodelist类更简单,因为在您的情况下,内存管理完全落在用户身上,使得这个类的使用变得很痛苦。 / LI>

答案 4 :(得分:0)

成员'next'在哪里定义?

你的insert()使用'this-> next', 但是只有成员'数据'和'ptr'。

答案 5 :(得分:0)

我的问题是你没有从列表的节点中对列表进行分类 这会导致您没有空指针而没有空指针的问题:

  

我将创建一个头节点,如head = new LinkedList(4)

  • 所以我会有一个链表类(不需要动态分配)
  • 我会有一个节点类(内部),它保存数据和指向下一个
  • 的指针
  • 我会更新接口以获取数据对象(如Jared Par所描述的)。

代码:

class LinkedList
{
    struct Node
    {
         Node(int d): data(d) {next = NULL;}
        ~Node()               {delete next;}
        int                   data;
        Node*                 next;
    };

    std::auto_ptr<Node>   head;

    Insert(int data)
    {
        if (head.get() == NULL)
        {
            head.reset(new Node(data));
        }
        else
        {
            Node* loop;
            for(loop = head.get();loop->next != NULL;loop = loop->next) {};
            loop->next = new Node(data);
        }
    }
};

LinkedList   list;