2017-12-08 9 views
0

私はリストの最初の要素を取得してそれを削除しようとしています。基本クラスの変数を返して削除するにはどうすればよいですか?

ノード(ListNode*)が返された場合、削除することはできません。私が戻ってくる前にそれを取り除くと、既に取り除かれているので、何も返されません。

別のremove()機能を作成する代わりに、機能getFirst()の中で削除機能を維持しようとしています。一時ポインタを作成することによって、私は同じ問題に遭遇します(削除することはできません)。私は削除を実装しようとし、要件の取得部分を無視しました。

ListNode* LinkedList::getFirst(){ 
    ListNode *nodePtr; //traverse the list 
    if(head == nullptr){ 
     std::cout << "List is empty no node to remove"<< std::endl; 
     return nullptr; 
    } 
    else{ 
     nodePtr = head; 
     head = head->next; 
     delete nodePtr; 
    } 

    return nullptr; 
} 

ポインタを返して削除するにはどうすればよいですか?

+2

理想的には、しないでください。 See [std :: queue :: pop戻り値。](https://stackoverflow.com/q/25035691/10077) –

+0

あなたはどんなポインタを返そうとしていますか? –

答えて

1

あなたが直面している問題は、関数内で多すぎることをしようとしたことが原因です。

「最初のノードを取得する」以外は、getFirstを使用しないでください。

さらに、リンクされたリストから最初のノードを削除することは、リンクされたリストの最初のノードを削除することとは異なります。

ここに私の提案があります。

// Return the first node of the linked list. 
ListNode* LinkedList::getFirst() 
{ 
    return head; 
} 

// Remove the first node from the linked list. 
void LinkedList::removeFirst() 
{ 
    if(head != nullptr) 
    { 
     ListNode *nodePtr = head; 
     head = head->next; 

     delete nodePtr; 
    } 
} 

// Detach the first node from the linked list and return the detached node. 
LinkedNode* LinkedList::detachFirst() 
{ 
    if(head == nullptr){ 
     return nullptr; 
    } 

    ListNode *nodePtr = head; 
    head = head->next; 

    return nodePtr; 
} 

使用法:あなたはノードの値のみを返すようにしたい場合は

LinkedList l; 

// 
// Fill up the linked list with nodes. 
// 

ListNode* first = l.getFirst(); 
if (first != nullptr) 
{ 
    // Use the first node. 
} 

// Delete the first node from the linked list. 
l.removeFirst(); 

// Detach the first node from the linked list. 
ListNode* first = l.detachFirst(); 
if (first != nullptr) 
{ 
    // Use the first node. 
    // ... 

    // Then delete it. 
    delete first; 
} 
+0

これは最適なアイデアです。責任を分ける。 'removeFirst()'が 'detachFirst()'を呼び出して、共通のコードを共有できるようにすることさえできます。例えば:void LinkedList :: removeFirst(){delete detachFirst(); } ' –

0

オブジェクトを削除しないでください。オブジェクトを削除しないでください。リストから削除する必要があります。あなたはリストの外でそれを削除する必要があります。

すなわち:

Node * list::get_head() 
{ 
if(!head) 
return nullptr; 
else 
{ 
Node * ptr = head; 
head = head->next; 
ptr->next=mullptr; 
return ptr; 
} 
} 

、その後:

list l; 
Node * ptr = l.getFirst(); 
... 
delete ptr 

そして、これが大幅テンプレートによって改善されるものの一種であることに注意し、あなたのノード店のデータを作ることができ、のコピーを取りますデータ、実際のノードを削除し、最後にコピーされたデータを返します。

+0

誰かが 'getFirst()'を呼び出し、返されたポインタを 'delete'することを忘れた場合、メモリリークが発生します。これは一般的には良い考えではありません。 –

0

、あなたはこれを試すことができます。

int LinkedList::getFirst(){ 
    ListNode *nodePtr; //traverse the list 
    int node_value; 
    if(head == nullptr){ 
     std::cout << "List is empty no node to remove"<< std::endl; 
     return nullptr; 
    } 
    else{ 
     nodePtr = head; 
     node_value = nodePtr->value; 
     head = head->next; 
     delete nodePtr; 
    } 

    return node_value; 
} 

を明らかに、あなたはの戻り値を変更する必要がありますあなたの関数(私はそれが整数であると仮定します)。

+0

' return nullptr; 'は' int'戻り値に対しては機能しません。代わりに 'return 0;'を使用しなければなりません。値が0の要素があった場合はどうなりますか?これは良い考えではありません。 –

関連する問題