2016-04-18 6 views
-1

私は2つのリストを読み込み、オーバーロード+演算子を連結しようとしています。私はクラスでかなり新しいので、私が欲しいのは覚えておいてください。私はストリームの演算子をオーバーロードして、オブジェクトを通常のものと逆のものを読み書きすることができます。 My +演算子はリストを連結しますが、問題はmain(list1 = list1 + list2;またはlist3を書き込んだ後、list1とlist2を連結した後)のようです。私はインターネット上のほぼすべての場所で答えを探しましたが、私はこれを投稿し終えました。より速く、より簡単に成長できるリンクやチュートリアルがあれば、私は新しいアイデアを公開しています。リストクラス2つの二重リストを連結する+演算子のオーバーロード

はメイン
class Lista 
{ 
private: 
    nod *head; 
    nod *tail; 
    int size; 
public: 
    Lista(); 
    ~Lista(); 
    friend istream &operator >>(istream &input, Lista &a) 
    { 
     int i; 
     cout << "Size of the list: "; 
     input >> a.size; 
     nod *q = new nod; 
     q->prev = NULL; 
     cout << "\nFrist node: "; 
     input >> q->data; 
     a.head = q; 
     a.tail = a.head; 
     for (i = 1; i < a.size; i++) 
     { 
      nod *q = new nod; 
      cout << "\nNode number " << i + 1 << " is: "; 
      input >> q->data; 
      a.tail->next = q; 
      q->prev = a.tail; 
      a.tail = q; 
      a.tail->next = NULL; 
     } 
     return input; 
    } 

    friend ostream& operator <<(ostream &output, Lista &a) 
    { 
     output << "\n\nNormal writing: "; 
     nod *q = new nod; 
     q = a.head; 
     while (q != NULL) 
     { 
      output << q->data << " "; 
      q = q->next; 
     } 
     q = a.tail; 
     output << "\n\nReverse writing: "; 

     while (q != NULL) 
     { 
      output << q->data << " "; 
      q = q->prev; 
     } 
     return output; 
    } 
    Lista &operator+(Lista &rec) 
    { 
     Lista temp; 
     temp.head = head; 
     temp.tail = tail; 
     temp.tail->next = rec.head; 
     rec.head->prev = temp.tail; 
     temp.tail = rec.tail; 
     temp.size = size; 
     temp.size = temp.size + rec.size; 
     return temp; 
    } 
}; 

class nod 
{ 
public: 
    int data; 
    nod *next; 
    nod *prev; 
    friend class Lista; 
    nod(); 
}; 

:これを読んで、^^

ノードクラスを支援するtryngのためにたくさんありがとうござい

int main() 
{ 
    Lista a,b,c; 
    cin>>a; 
    cin>>b; 
    c=a+b; 
    cout<<c; 
    return 0; 
} 
+2

あなたは(http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)[3の規則]を、次のされていません。ユーザ定義のコピーコンストラクタを書くまでは、 'operator +'で何かをすることはできません。また、このタイプのコーディングは初心者向けではなく、経験豊富なC++コーダー向けです。私は初心者が基本的に経験豊富なコーダを持っていなくても、この問題を解決することはまだありません。 – PaulMcKenzie

+0

私は "c = a + b"を使いたいと思ったら、=演算子をオーバーロードする必要がありますか? –

+1

3のルールに従う必要があります。つまり、コピーコンストラクタ、代入演算子、デストラクタ、*を実装する必要があります。*正しく動作する必要があります。既にコーディングしたものについては、別のやり方で済むべきことがたくさんあります。リストに項目を追加したいのですが、ストリームを使いたくないのですが?私の最初のコメントが示唆しているように、これは私または他のSOのメンバーに、既に書かれたコードを指示するか、またはこれを正しく行う方法を示すために全部を書くことになるでしょう。初心者*決して*これは正しい、私を信じて取得します。 – PaulMcKenzie

答えて

0

あなたoperator+が偶数の近くではありません正しい実装です。まず、終了時に範囲外になるローカル変数への参照を返し、リストを破棄し、呼び出し元に無効なメモリへの参照を残します。しかし、悪いことに、入力リストのノードにそのローカル変数ポイントを作成していて、それらのリスト内のさまざまなポインタを操作していて、両方のリストが壊れています。

operator+は、2つの入力リストからコピーのデータを返す必要があります。これは、出力リストに全く新しいノードセットを割り当てることを意味します。

代わりに、より多くのこのような何かを試してみてください:今すぐ

class nod 
{ 
public: 
    int data; 
    nod *next; 
    nod *prev; 

    nod(int value = 0) : 
     data(value), next(NULL), prev(NULL) 
    { 
    } 
}; 

class Lista 
{ 
private: 
    nod *head; 
    nod *tail; 
    int size; 

public: 
    Lista() : 
     head(NULL), tail(NULL), size(0) 
    { 
    } 

    Lista(const Lista &src) : 
     head(NULL), tail(NULL), size(0) 
    { 
     *this = src; 
    } 

    ~Lista() 
    { 
     Clear(); 
    } 

    void Add(int value) 
    { 
     node *n = new nod(value); 
     n->prev = tail; 
     if (!head) head = n; 
     if (tail) tail->next = n; 
     tail = n; 
     ++size; 
    } 

    void Clear() 
    { 
     nod *n = head; 
     head = tail = NULL; 
     size = 0; 
     while (n) 
     { 
      nod *next = n->next; 
      delete n; 
      n = next; 
     } 
    } 

    Lista& operator=(const Lista &rhs) 
    { 
     Clear(); 
     nod *n = rhs.head; 
     while (n) 
     { 
      Add(n->data); 
      n = n->next; 
     } 
     return *this; 
    } 

    Lista operator+(const Lista &rhs) 
    { 
     Lista temp; 

     nod *n = head; 
     while (n) 
     { 
      temp.Add(n->data); 
      n = n->next; 
     } 

     n = rhs.head; 
     while (n) 
     { 
      temp.Add(n->data); 
      n = n->next; 
     } 
     return temp; 
    } 

    friend std::istream& operator >>(std::istream &input, Lista &a); 
    friend std::ostream& operator <<(std::ostream &output, const Lista &a); 
}; 

std::istream& operator >>(std::istream &input, Lista &a) 
{ 
    // NOTE: this kind of code really does not 
    // belong in an 'operator>>' implementation! 

    int i, size, data; 
    std::cout << "Size of the list: "; 
    input >> size; 
    for (i = 0; i < size; ++i) 
    { 
     std::cout << "\nNode number " << i + 1 << ": "; 
     input >> data; 
     a.Add(data); 
    } 
    return input; 
} 

std::ostream& operator <<(std::ostream &output, const Lista &a) 
{ 
    output << "\n\nNormal writing: "; 
    nod *n = a.head; 
    while (n) 
    { 
     output << n->data << " "; 
     n = n->next; 
    } 

    n = a.tail; 
    output << "\n\nReverse writing: "; 
    while (n) 
    { 
     output << n->data << " "; 
     n = n->prev; 
    } 

    return output; 
} 

int main() 
{ 
    Lista a, b, c; 
    std::cin >> a; 
    std::cin >> b; 
    c = a + b; 
    std::cout << c; 
    return 0; 
} 

、そうは言って、あなたが真剣にマニュアルリンクリストの実装を取り除く必要があります代わりにSTL std::listクラスを使用してください。これはノードのリンクリストを管理します。 dは自身のコピーを作成する方法を知っている:

#include <list> 
#include <algorithm> 
#include <iterator> 

class Lista 
{ 
private: 
    std::list<int> data; 

public: 
    void Add(int value) 
    { 
     data.push_back(value); 
    } 

    void Clear() 
    { 
     data.clear(); 
    } 

    Lista operator+(const Lista &rhs) 
    { 
     Lista temp; 
     std::copy(data.begin(), data.end(), std::back_inserter(temp)); 
     std::copy(rhs.data.begin(), rhs.data.end(), std::back_inserter(temp)); 
     return temp; 
    } 

    friend std::istream& operator >>(std::istream &input, Lista &a); 
    friend std::ostream& operator <<(std::ostream &output, const Lista &a); 
}; 

std::istream& operator >>(std::istream &input, Lista &a); 
{ 
    // NOTE: this kind of code really does not 
    // belong in an 'operator>>' implementation! 

    int i, size, data; 
    std::cout << "Size of the list: "; 
    input >> size; 
    for (i = 0; i < size; ++i) 
    { 
     std::cout << "\nNode number " << i + 1 << ": "; 
     input >> data; 
     a.Add(data); 
    } 
    return input; 
} 

std::ostream& operator <<(std::ostream &output, const Lista &a) 
{ 
    output << "\n\nNormal writing: "; 
    for (std::list<int>::const_iterator iter = a.data.begin(), end = a.data.end(); iter != end; ++iter) 
    { 
     output << *iter << " "; 
    } 

    output << "\n\nReverse writing: "; 
    for (std::list<int>::const_reverse_iterator iter = a.data.rbegin(), end = a.data.rend(); iter != end; ++iter) 
    { 
     output << *iter << " "; 
    } 

    return output; 
} 
関連する問題