0

operator+2 つの二重連鎖リストを連結するために、個別にオーバーロードしたいと考えています。私の考えは、最初のリストから最初の要素のアドレスを取得し、2 番目のリストから最初の要素のアドレスを取得することです。

クラスでは、コンストラクタ、デストラクタ、および正常に動作している次の 4 つのメソッドを除いて、指定されたリストから最初の要素のアドレスを取得することになってDoubleChainedListいるメソッドを作成しました。get_prim次に、メソッドget_currentを使用して、最初のリストを最後まで移動し、3 番目のリストに要素を追加してから、同じ原則を 2 番目のリストに適用します。

しかし、私には問題があります。

'get_prim' was not declared in this scope

'get_current' was not declared in this scope

コンパイル時の太字のタグ付き行 (以下のコードを参照)。私は何が欠けていますか?

#include <iostream>
#include <stdlib.h>
using namespace std;

//Create node class
class Node
{
private:
    float value;         
    Node *back;        
    Node *next;       
public:
    Node *set_value (Node *x, float element) { x->value=element; return x; }
    float get_value (Node *x) { return x->value; }
    Node *set_back (Node *x) { return x->back; }
    Node *set_next (Node *x) { return x->next; }
    Node *set_back_nod (Node *x, Node *y) { x->back=y; return x; }
    Node *set_next_nod (Node *x, Node *y) { x->next=y; return x; }
    void next_to_2next (Node *x) { x->next=x->next->next; }
    void next_back_to_origins (Node *x) { x->next->back=x; }
};

//Create list class
class DoubleChainedList : public Node
{
private:
    Node *prim;       
    Node *ultim;    
public:
    DoubleChainedList() { prim=NULL; ultim=prim; }           //Constructor
    ~DoubleChainedList();                                    //Destructor
    void insert_back(float element);                         //Inserts an element at the end of the list
    void delete_element_from_position(int delete_position);  //Deletes from the list the element whose position is equal to "delete_position"
    void show_left_right();                                  //Shows the list from the first element to the last one
    void show_right_left();                                  //Shows the list from the last element to the first one
    Nod *get_prim (DoubleChainedList myList) { return this->prim; };    //Intended to obtain the address of the first element from "myList"
    Nod *get_current (Node *x) { return set_next(x); };                  //Intended to move me through the list
};

DoubleChainedList operator+ (DoubleChainedList myList1, DoubleChainedList myList2)
{
    DoubleChainedList myList3;
    Nod *current1,*current2;
    current1=get_prim(myList1); // ERROR OVER HERE!
    current2=get_prim(myList2);
    cout<<get_value(current1)<<" "; // ERROR OVER HERE!
    cout<<get_value(current2)<<" ";
    return myList3;
}

int main()
{
    int i,number_elem_myList1,number_elem_myList2,element;
    DoubleChainedList myList1,myList2,myList3;
    cin>>number_elem_myList1;
    for (i=0;i<number_elem_myList1;i++)
    {
        cin>>element;
        myList1.insert_back(element);
    }
    cin>>number_elem_myList2;
    for (i=0;i<number_elem_myList2;i++)
    {
        cin>>element;
        myList2.insert_back(element);
    }
    myList3=myList1+myList2;
    return 0;
}
4

3 に答える 3

0

プログラムを次のように修正しましたが、まだ問題があります。プロシージャ「operator+」の外でリストを表示しようとすると、「Segmentation fault」が発生します (プログラムをデバッグすると、この命令「myList3=myList1+myList2;」の直後に発生しました)。その手順の中に表示すればOKです。これは、その「return」ステートメントと、「operator +」手順の終了後に存在しなくなる一時オブジェクトを返すために発生していると思いますが、それを修正する方法がわかりません。

#include <iostream>
using namespace std;

//Create node class
class Node
{
private:
    float value;         
    Node *back;        
    Node *next;       
public:
    Node *set_value (float element) { value=element; return this; }
    float get_value () { return value; }
    Node *set_back () { return back; }
    Node *set_next () { return next; }
    Nod *set_back_node (Node *y) { back=y; return this; }
    Nod *set_next_node (Node *y) { next=y; return this; }
    void next_to_2next () { next=next->next; }
    void next_back_to_origins () { next->back=this; }
};

//Create list class
class DoubleChainedList : public Node
{
private:
    Node *prim;       
    Node *ultim;    
public:
    DoubleChainedList() { prim=NULL; ultim=prim; }           //Constructor
    ~DoubleChainedList();                                    //Destructor
    void insert_back(float element);                         //Inserts an element at the end of the list
    void delete_element_from_position(int delete_position);  //Deletes from the list the element whose position is equal to "delete_position"
    void show_left_right();                                  //Shows the list from the first element to the last one
    void show_right_left();                                  //Shows the list from the last element to the first one
    Node *get_prim () { return prim; }                       //Intended to obtain the address of the first element from a list
};

DoubleChainedList operator+ (DoubleChainedList myList1, DoubleChainedList myList2)
{
    DoubleChainedList myList3;
    Node *current1,*current2,*current3;
    current1=myList1.get_prim();
    current2=myList2.get_prim();
    while ((current1!=NULL)||(current2!=NULL))
    {
        if (current1!=NULL)
        {
            myList3.insert_back(current1->get_value());
            current1=current1->set_next();
        }
        else
            if (current2!=NULL)
            {
                myList3.insert_back(current2->get_value());
                current2=current2->set_next();
            }
    }
    //myList3.show_left_right();
    //cout<<endl;
    //myList3.show_right_left();
    return myList3;
}

int main()
{
    int i,number_elem_myList1,number_elem_myList2,element;
    DoubleChainedList myList1,myList2,myList3;
    cin>>nr_elem_lista1;
    for (i=0;i<number_elem_myList1;i++)
    {
        cin>>element;
        myList1.insert_back(element);
    }
    cin>>number_elem_myList2;
    for (i=0;i<number_elem_myList2;i++)
    {
        cin>>element;
        myList2.insert_back(element);
    }
    myList3=myList1+myList2;
    myList3.show_left_right();
    myList3.show_right_left();
    return 0;
}

あなたが言ったように@Dukelingは「Node」クラスのメソッドを変更しました(そしてもちろん必要に応じてプログラムも)、それもOKです。

興味のある方は完全なコードを投稿できますが、200 行以上あり、変数/日付の名前、手順/メソッド、およびルーマニア語 (私の自然言語) で書かれたコメントがいくつかあり、初心者にとっては難しいでしょう。それを理解します。

于 2013-04-01T12:16:08.570 に答える
0

egsomeObject.function(...)またはsomeObject->function(...)(someObjectはそれぞれオブジェクトまたは関数を持つクラスのオブジェクトへのポインター) で呼び出される関数function(...)は、 のメンバーに直接アクセスできますsomeObject

したがって、クラスのメンバーである関数は、その関数で 2 つのオブジェクトを操作する場合を除き、そのクラスのオブジェクトをパラメーターとして渡す必要はありません。

の関数は、Nodeおそらく次のようになります。

void set_value (float element) { value = element; }
float get_value () { return value; }
Node *set_back () { return back; }
Node *set_next () { return next; }
void set_back_nod (Node *y) { back = y; }
void set_next_nod (Node *y) { next = y; }
void next_to_2next () { next = next->next; }
void next_back_to_origins () { next->back = this; }

また、get_prim:

Node *get_prim() { return prim; };

次に、operator+次のようになります:(const &トーマスが示唆したように)

DoubleChainedList operator+ (const DoubleChainedList &myList1,
                             const DoubleChainedList &myList2)
{
    DoubleChainedList myList3;
    Node *current1, *current2;
    current1 = myList1.get_prim();
    current2 = myList2.get_prim();
    cout << current1->get_value() << " ";
    cout << current2->get_value() << " ";
    // ...
    return myList3;
}

トーマスが提案したように使用operator+=することも、おそらくより良い考えです。

于 2013-03-31T18:12:36.123 に答える
0

メンバー関数として実装operator+=すると、他のリストの変数にアクセスできます。

を実装operator+=してから、他のリストをトラバースし、他のリストのノードをこのリストに追加します。

そして、他のリストを として渡しconst &ます。

于 2013-03-31T17:46:39.030 に答える