C ++双链表

时间:2013-11-06 11:30:15

标签: c++

我的双重链接列表出了问题。如何使输入唯一(我不希望它重复) 例如,我可以输入1然后再次1我将有一个1和1的列表。我需要以某种方式禁止这个:)所以列表只能包含不重复的数字。

#include <cstdlib>
#include <iostream>

using namespace std;

struct node
{
    int data;
    node* next;
    node* prev;
};
class Node
{
    public:
        Node();
        ~Node();
        void setKopa();
        void printForward();

     private:
        node* head;
        node* tail;
        node* n;
};
Node::Node()
{
    setKopa();
}
Node::~Node()
{
    delete n;
}
void Node::setKopa()
{
    int lenght;
    do
    {
        cout << "Input list lenght (how many elements): ";
        cin >> lenght;
        if(lenght<2)
        cout << "Error list has to have atleast 2 elements!" <<endl;
    }
    while(lenght<2);

    int fill;
    cout << "Input  "<< lenght <<" elements: "<<endl;

    for (int i=0; i<lenght; i++)
    {
        cin>>fill; 
        n = new node;
        n->data = fill;

        if (i==0)
        {
            n->prev = NULL;
            head = n;
            tail = n;
        }
        else if (i+1==lenght)
        {
            n->prev = tail;
            tail->next = n;
            tail = n;
            tail->next = NULL;
        }
        else
        {
            n->prev = tail;
            tail->next = n;
            tail = n;
        }                           
    }
}
void Node::printForward()
{
    node* temp = head;
    while(temp != NULL)
    {
        cout << temp->data << " ";
        temp = temp-> next;
    }
    cout << endl;
}
int main()
{
    Node a;
    a.printForward();    

    system("pause");
    return 0;
}

1 个答案:

答案 0 :(得分:1)

当您阅读输入时,请浏览列表以查看输入是否已存在。


有了这个(简单)的答案,我想解决一些关于你的代码的其他事情。首先是你有一个内存泄漏,你永远不会删除列表。第二个是你不需要类成员变量n,它也可能是setKopa循环中的局部变量。

你添加新节点的方式也很奇怪。在我看来,它应该更通用,而不是使用循环计数器来检查要做什么。我建议你创建一个成员函数来添加新节点,将整数数据作为参数。这样,您可以调用此函数在任何位置添加节点,而不仅仅是setKopa函数。事实上,我认为该列表根本不应该处理该输入,而应该是从main调用并且调用addNode函数的独立函数。

node结构也不需要在全局命名空间中,它可以是Node类中的私有结构。说到Node类,不应该真的被称为List吗?

因此,如果我建议,你可能想做这样的事情:

#include <iostream>

class List
{
public:
    List()
        : head(nullptr), tail(nullptr)
     {}

    ~List();

    void addNode(const int data);

    void printAll() const;

private:
    struct node
    {
        node()
            : next(nullptr), prev(nullptr)
        {}

        node* next;
        node* prev;
        int   data;
    };

    node* head;
    node* tail;
};

List::~List()
{
    for (node* next, *cur = head; cur; cur = next)
    {
        next = cur->next;
        delete cur;
    }
}

void List::addNode(const int data)
{
    node* n = new node;
    n->data = data;

    if (tail == nullptr)
    {
        // First node in list
        head = tail = n;
    }
    else
    {
        n->prev = tail;
        tail->next = n;
        tail = n;
    }
}

void List::printAll() const
{
    std::cout << "{ ";
    for (node* cur = head; cur != nullptr; cur = cur->next)
        std::cout << cur->data << ' ';
    std::cout << "}\n";
}

int main()
{
    List list;

    for (int i = 0; i < 10; ++i)
        list.addNode(i);

    list.printAll();
}

上面的代码应该打印

{ 0 1 2 3 4 5 6 7 8 9 }

用您自己的节点添加循环替换。