1

私の現在の割り当てのこの部分は、私を完全に困惑させました:

静的メソッド(* makeCopy())を呼び出すコピーコンストラクターを含むLinkedListクラスを構築しようとしています。makeCopyメソッドを機能させる方法がわかりません(すべてのメソッドヘッダーが割り当てで提供されました)。

class ListNode
{
public:
    ListNode(double v, ListNode *p)
{
   value = v; 
   next = p;
}
private:    
   double value;
   ListNode *next;
   friend class LinkedList;    // LinkedList  has friend status 
};

// The linked list class itself
class LinkedList
{
public:
//Add number to Linked List
void add(double x)
{
    if (head == NULL)
    {
        head = new ListNode(x, NULL);
        return;
    }
    else
    {
        ListNode *nodePtr = head;
        head = new ListNode(x, nodePtr);
    }

}
LinkedList() { head = NULL; }

//Default destructor
~LinkedList()
{
    ListNode *nodePtr = head;
    while (nodePtr != NULL)
    {
        ListNode *garbage = nodePtr;
        nodePtr = nodePtr->next;
        delete garbage;
    }
}

//Copy Constructor
LinkedList(LinkedList &);

//Copy function
static ListNode *makeCopy(ListNode *pList);

private:
   ListNode * head;    

};

以下は、makeCopy関数を作成しようとしている方法です。

LinkedList::LinkedList(LinkedList &list)
{
    *makeCopy(list.head);
}

static ListNode *makeCopy(ListNode *pList)
{
   if(pList->value == NULL)
   {        
       return NULL;
   }
   else
   {
    ListNode *node = pList;

    while(node != NULL)
    {
        ListNode newOne = *node;
        node = node->next;
    }
}

return;
}

まず、「member ListNode ::valueisinnaccesible」というエラーが引き続き表示されます。第二に、私はC ++に非常に慣れていないので、かなり離れていると確信しています。誰かが私を正しい方向に動かすのを手伝ってくれるなら、それは大いにありがたいです。どうも

これは、コピーコンストラクターとmakeCopyメソッドの現在の反復です。残念ながら、ListNodeコンストラクターは、すべてのメソッドヘッダーとともに、割り当ての一部です。それらのコードを作成する必要があります。私が今得ているエラーはこれです:両方のreturnステートメントは「エラー:コンストラクタまたはデストラクタは値を返さないかもしれません」と言います。これは単なるreturnステートメントであり、コンストラクターもデストラクタも表示されないため、これは完全に失われています。

LinkedList::LinkedList(LinkedList &list)
{
    LinkedList *copy = new LinkedList();

    while(list.head != NULL)
    {
        ListNode node = *makeCopy(list.head);
        copy->add(node.value);
        list.head = head->next;
    }

    return *copy;
 }

 ListNode * LinkedList::makeCopy(ListNode *pList)
 {
    ListNode node = *pList;

    return *node;
 }
4

3 に答える 3

1

<編集1>最初にmakeCopyのリンクを正しく取得する必要があります-その説明については、Luchianの回答を参照してください。</編集1>

最初の問題は、makeCopyの開始時に、value(double)をNULL(すべての目的と目的でゼロ)と比較し、それらが一致する場合はnullポインターを返すことです。

あなたが実際に言っているのは、pListそれ自体がNULLの場合、NULLを返すという意味だと思います。

次に、makeCopyで実際に何かのコピーを作成することはありません。whileループ内では、スタック上に新しいノードを作成していますが、ループの反復ごとに作成/破棄されます。

次のようなものを使用して、各ノードのコピーを作成する必要があります

ListNode * newNode = new Node();
newNode->value = node->value;
newNode->next = ???;

newを使用して新しい要素を作成することに注意してください。

あなたが解決する必要があるのは(そして宿題の本当の目標だと思うので、ここではあなたにスプーンで餌をやらない)、あなたがその->nextフィールドをどのように設定するかです。

リストが小さいことがわかっている場合は、再帰を検討することをお勧めします。ただし、これはあまりスケーラブルではありません。

それ以外の場合は、次の要素をコピーした後で次のポインターを設定する方法を見つける必要があります(これがより良い方法です)。

<編集2> makeCopyも何も返しません。ヘッドノードのコピーへのポインタを返す必要があります(覚えておく必要があります)。

LinkedListコピーコンストラクターも実際には何もしていません。makeCopyを呼び出し、返されたポインターを逆参照してから、すべて破棄します。あなたはのようなことをしたいと思うでしょうhead = makeCopy(list.head)。または、フィールド初期化について学習した場合は、代わりにフィールド初期化を使用してください。 /<編集2>*

于 2012-08-03T04:39:55.757 に答える
1
static ListNode *makeCopy(ListNode *pList)

する必要があります

ListNode * LinkedList::makeCopy(ListNode *pList)

あなたのバージョンは、内部リンケージを持つ無料の関数を定義しており、メンバーを定義していません。

于 2012-08-03T04:35:46.837 に答える
0

あなたの割り当てを正しく理解していれば、「makeCopy」はノードのリンクリストへのポインターを取り、このリンクリストのコピーを作成して最初の要素へのポインターを返す必要がありますよね?

これが私が行う必要があると思うことです:

LinkedList::LinkedList(LinkedList &list)
    : head(makeCopy(list.head))
{
}

ListNode* LinkedList::makeCopy(ListNode *pList)
{
   if (!pList)
   {
       return 0;
   }

   ListNode* head = new ListNode(plist->value, 0);
   ListNode* back = head;
   plist = plist->next;

   while (pList)
   {
       ListNode* newNode = new ListNode(plist->value, 0);
       back->next = newNode;
       back = newNode;
       plist = plist->next;
   }

   return head;
}
于 2012-08-03T05:02:57.130 に答える