C ++:Linked List Class将空节点添加为Head和Tail

时间:2014-03-27 04:28:52

标签: c++ linked-list

我构建一个LinkedList类作为项目的基础。我已经实现了基于LinkedList的但是有一个我无法解决的奇怪错误。基本上我的列表的头部和尾部总是空的。除了这个奇怪的问题,一切似乎都很好。我有三个文件:一个定义节点和列表的头,一个实现文件,最后一个文件来运行一切。谁能发现我的错误?我认为我的错误在于add方法。

头文件:

class Node
{
    private:
        int data;
        Node *next;
        Node *prev;
        friend class LinkedList;
};

class LinkedList
{
    private:
        Node *head;
        Node *tail;

    public:
        LinkedList();
        ~LinkedList();

        bool empty();

        void insert_left(int v);
        void insert_right(int v);
        Node* get_first();
        Node* get_last();
        void print_list();
        void print_node(Node *n);
        void remove_left();
        void remove_right();


    protected:
        void add(Node *v, int d);
        void remove(Node *v);
};

类实现文件:

#include <iostream>
#include "node.h"
using namespace std;

LinkedList :: LinkedList()
{
    head  = new Node;
    tail = new Node;

    head->next = tail;
    tail->prev = head;
}

LinkedList :: ~LinkedList()
{
    while(!empty())
    {
        remove_left();
    }
    delete head;
    delete tail;
}

void LinkedList :: add(Node *v, int d)
{
    Node *u = new Node;
    u->data = d;
    u->next = v;
    u->prev = v->prev;
    v->prev->next = v->prev = u;
}

void LinkedList :: insert_left(int v)
{
    /**
    if (head == NULL)
        add(head, v);
    else
        add(head->next, v);
    **/

    //add(head->prev,v);
    add(head->next,v);

}

void LinkedList :: insert_right(int v)
{
     add(tail,v);
}

void LinkedList :: remove(Node *v)
{
    Node *u = v->prev;
    Node *w = v->next;

    u->next = w;
    w->prev = u;

    delete v;
}

void LinkedList :: remove_left()
{
    remove(head->next);
}

void LinkedList :: remove_right()
{
    remove(tail->prev);
}

bool LinkedList :: empty()
{
    return (head->next == tail);
}

void LinkedList :: print_list()
{
    Node *tmp = head;
    while(tmp != NULL)
    {
        cout << tmp->data << endl;
        tmp = tmp->next;
    }
}

void LinkedList :: print_node(Node *n)
{
    Node *tmp = n;
    cout << tmp->data << endl;
}

Node* LinkedList :: get_first()
{
    return head;
}

Node* LinkedList :: get_last()
{
    return tail;
}

主文件:

#include <cstdlib>
#include <iostream>
#include "list.cpp"
using namespace std;

int main(int agrc, char  **argv)
{
    LinkedList *l = new LinkedList();
    //LinkedList *m = new LinkedList();

    l->insert_left(200);
    l->insert_left(700);
    l->insert_left(300);

    //Node *temp = l->get_first();
    l->print_list();

    //l->print_node(temp);

    delete l;

    return 0;
}
运行main之后

获得以下输出,说明问题:

0
300
700
200
0

1 个答案:

答案 0 :(得分:0)

1)在insert_left函数中使用head而不是head-&gt; next 2)在add()中你已经在head的左边添加了新节点,所以现在应该更新你的头了。

head = u

3)head和tail是你班级的数据成员,那么为什么你需要在函数中传递它们。直接使用它们。 像这样更新你的insert_left函数

void LinkedList :: insert_left(int v)
{   
    Node *u = new Node;
    u->data = d;
    u->next = NULL;

    if (head == NULL)
    {    
        head = u;
    }
    else
    {
         u->next = head;
         u->next->prev = u;
         head = u;
    }
}

同样,您可以使用tail修改insert_right函数。