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

入力を読み取るときは、リストを調べて、入力が既に存在するかどうかを確認します。


その(単純な)答えが邪魔にならないので、コードに関する他のいくつかのことに対処したいと思います。1 つ目は、リストを削除しないというメモリ リークがあることです。2 つ目は、クラス メンバー variable が必要ないことです。これは、ループ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 }

ノード追加ループを独自のものに置き換えます。

于 2013-11-06T11:34:44.150 に答える