C ++ Linked List混淆

时间:2015-12-03 23:37:36

标签: c++ class templates linked-list

我一直试图弄清楚如何实现一个可以容纳任何内容的NODE链接列表(通过模板)。

我已经准备好Node类并且正在工作(使用我的Stack类测试)。

我很好奇我在创建名为insertAtIndex的函数时可能会出错,我在其中存储要存储的数据以及应该存储它的索引。

我的节点类

template <class T>
class Node
{
    public:
    T *data; //the object information
    Node<T> *next; //pointer to the next node element

    Node()
    {
        next = 0;
        data = 0;
    }
};

到目前为止,这是我的Linked List类

template <class T>
class LinkedList
{
private:
    Node<T> *head;
    int count;
public:
    LinkedList()
    {
        head = 0;
        count = 0;
    }
    int getCount()
    {
        return count;
    }

    void insertAtIndex(T* dat, int index)
    {   
        Node<T> * temp = new Node<T>(dat);

        if(index == 0)
        {

            temp = head;
            temp->data  = dat;
            temp->next = temp->next;
            temp->next = temp;
            delete temp;
            count++;
        }

        else if(index <= count)
        {
            Node<T> *cursor = new Node<T>();

            for(int i = 0; i < index - 1; i++)
            {
                cursor = cursor->next;
            }

            Node<T> * temp = new Node<T>();
            temp->data  = dat;
            temp->next = cursor->next;
            cursor->next = temp;
            count++;
        }

    }

    void Print()
    {

        // Temp pointer
        Node<T> *tmp = head;

        // No nodes
        if ( tmp == NULL ) {
        cout << "EMPTY" << endl;
        return;
        }

        // One node in the list
        if ( tmp->next == NULL ) {
        cout << *tmp->data;
        cout << " --> ";
        cout << "NULL" << endl;
        }
        else 
        {
        // Parse and print the list
        do
        {
            cout << *tmp->data;
            cout << " --> ";
            tmp = tmp->next;
        }
        while ( tmp != NULL );

        cout << "NULL" << endl;
        }
    }
};

3 个答案:

答案 0 :(得分:0)

您应该将Node(T *)构造函数添加到Node类:

template <class T>
class Node
{
    public:
    T *data; //the object information
    Node<T> *next; //pointer to the next node element

    Node()
    {
        next = 0;
        data = 0;
    }

    Node(T* newData) { // <<---------- Here it is
        next = 0;
        data = newData;
    }
};

答案 1 :(得分:0)

您需要重新考虑如何将节点添加到列表中。这是您的代码,其中包含对实际操作的评论。

   Node<T> * temp = new Node<T>(dat);  // Create new node, good

    if(index == 0)
    {

        temp = head;                  // Throw away pointer to new node, bad. temp is now head.
        temp->data  = dat;            // Overwrite head's data, bad
        temp->next = temp->next;      // Set a variable to itself, does nothing.
        temp->next = temp;            // Change head's next to point to itself, bad
        delete temp;                  // delete the head node, bad
        count++;
    }

你真正想做的是:

  • 使用正确的数据创建新节点(您已经这样做了)
  • 如果您将其放在列表的开头:
    • 将新节点的下一个指针指向head
    • 改变头部指向新节点

这就是全部 - 不要删除任何内容。

一旦你有了这个工作,继续前进到将节点添加到中间或列表(你的其他部分)的更复杂的部分。

调试器(或至少是输出语句)对于了解代码出错的地方至关重要。您可以在每个点查看变量的状态。

答案 2 :(得分:0)

您可能想要考虑只有下一个指针作为成员的基节点类,然后是添加模板数据成员的继承类。公共列表函数可用于基类。