0

我的双向链表有问题。我怎样才能使输入唯一(我不希望它重复)例如我可以输入 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;
}
4

1 回答 1

1

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


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

您添加新节点的方式也很奇怪。在我看来,它应该更通用,而不是使用循环计数器来检查要做什么。我建议你创建一个成员函数来添加新节点,将整数数据作为参数。这样你就可以调用这个函数在任何地方添加节点,而不仅仅是在setKopa函数中。事实上,我认为列表根本不应该处理该输入,而应该是一个独立的函数,调用 frommain并调用该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 }

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

于 2013-11-06T11:34:44.150 回答