2

ユーザーに削除したいアイテムを尋ねるプログラムがあります。削除機能は、そのノードを正常に削除する必要があります。前のノードからアドレスを取得し、削除するノードの後のノードを指すようにしてから、ダングリング ノードを削除する必要があることを理解しています。これを機能させるための構文を理解するのに苦労しています。これが私のコードです。不要な機能は省いています。

#include <iostream> 
#include <cstddef> 
#include <string> 
using namespace std;

struct Node 
{
    string item; 
    int count; 
    Node *link; 
};

typedef Node* NodePtr;

void insert(NodePtr after_me, string an_item, int a_number); 
void list_remove(NodePtr& head, string an_item);
void head_insert(NodePtr& head, string an_item, int a_number); 
void show_list(NodePtr& head); 
NodePtr search(NodePtr head, string target);

int main() 
{ 
    string new_item, target, remove_item; 
    int new_count; 
    NodePtr head = NULL; 
    head_insert(head, "Tea", 2); 
    head_insert(head, "Jam", 3); 
    head_insert(head, "Rolls", 10);

    cout << "List contains:" << endl; 
    show_list(head);

    NodePtr after_me = head; 
    after_me = after_me ->link;
    cout << "Enter the item you wish to remove (string) \n"; 
    cin >> remove_item; 

    after_me = search(head, remove_item);

    if(after_me != NULL) 
    { 
        cout << "\nWill remove " << remove_item  << endl << endl;       

        list_remove(head, remove_item);

        cout << "List now contains:" << endl; 
        show_list(head); 
    }
    else 
    { 
        cout << "I can't find " << remove_item 
             << " in the list, so I can't remove anything \n"; 
    }

    system("PAUSE");
    return EXIT_SUCCESS; 
}

void list_remove(NodePtr& head, string remove_item)
{
    NodePtr remove_ptr; //pointer to the node that is being removed

    remove_ptr = search(head, remove_item); // finds the address for the item 
                                            // that is being removed and puts it
                                            // in remove_ptr


}

// Uses cstddef: 
void head_insert(NodePtr& head, string an_item, int a_number) 
{ 
    NodePtr temp_ptr; 
    temp_ptr = new Node;

    temp_ptr -> item = an_item; 
    temp_ptr -> count = a_number;

    temp_ptr->link = head; 
    head = temp_ptr; 
}

//Uses iostream and cstddef: 
void show_list(NodePtr& head) 
{ 
    NodePtr here = head;

    while (here != NULL) 
    { 
        cout << here-> item << "\t"; 
        cout << here-> count << endl; 
        here = here->link; 
    } 
}

NodePtr search(NodePtr head, string target) 
{ 
    // Point to the head node
    NodePtr here = head;

    // If the list is empty nothing to search 
    if (here == NULL) 
    { 
         return NULL; 
    }
    // Search for the item 
    else 
    { 
         // while you have still items and you haven't found the target yet 
         while (here-> item != target && here->link != NULL) 
             here = here->link;

         // Found the target, return the pointer at that location 
         if (here-> item == target) 
             return here;
         // Search unsuccessful, return Null 
         else 
             return NULL; 
    } 
}
4

2 に答える 2

2

削除するには、削除するノードの前にノードも必要になります。手順は次のとおりです。

// find the preceding_ptr
NodePtr preceding_ptr = head;
while(preceding_ptr != NULL && preceding_ptr->link != remove_ptr){
    preceding_ptr = preceding_ptr->link;
}

// now preceding_ptr is set, make it skip remove_ptr
preceding_ptr->link = remove_ptr->link;

// free up memory from remove_ptr
于 2013-10-22T20:17:59.757 に答える
0

したがって、何をしようとしているのかを実際に示していないため、特にどの「構文」が混乱しているのかわかりません。推測ですが...

私が正しく理解していれば、要するに、削除したいアイテムの直前に配置されたアイテムを見つけて、必要に応じて操作する方法を知りたいということですよね?メソッド
を使用する代わりに、自分でリストを反復処理するだけです。search()

void list_remove(NodePtr& head, string remove_item)
{
    NodePtr remove_ptr; //pointer to the node that is being removed

    remove_ptr = search(head, remove_item);
    if(remove_ptr != NULL) // indicates the item is part of the list and 
                           // we can remove it    
    {
         NodePtr predecessorNode = NULL;
         // Iterate the list to find the predecessor of remove_ptr
         for(NodePtr curNode = head; curNode != NULL; curNode = curNode->link)
         {
             if(curNode->link == remove_ptr) // Indicates that curNode is the
                                             // predecessor of remove_ptr
             {
                 predecessorNode = curNode;  // store it and ...
                 break;                      // ... exit the loop
             }
         }

         if(predecessorNode != NULL) // We have found a predecessor
         {
             // Now you have the predecessor for remove_ptr, 
             // manipulate it as necessary
         }
         else // indicates the item to remove is the head of the list
         {
             // You might need to manipulate head, depending on how your 
             // linked list is organized (set to remove_ptr->link most likely)
         }
    }
}
于 2013-10-22T20:04:10.297 に答える