あなたが示したのは、の配列ではなく、(タイプの)配列を含むstruct
リンクされたリストです。struct
char
の配列はstruct
次のようになります。
str_pair array_of_structs[10];
// or:
str_pair* dynamically_allocated_array_of_structs = new str_pair[10];
実際にこのようなものがある場合はdelete
、配列から項目を 1 つにする必要はありません。次のように配列を初期化したとしましょう。
str_pair* array_of_structs = new str_pair[10];
次に、以下を使用して配列全体 (すべての項目を含む) を削除します。
delete[] array_of_structs;
繰り返しますが、 ;delete
で割り当てられた配列内の項目を 1 つにすることはできません。アレイ全体new[]
で a を実行します。delete[]
一方、「のリンクされたリストstruct
」と言うつもりなら、通常、次のようにアイテムを削除します。
str_pair* previous_item = ...;
str_pair* item_to_delete = previous_item->next;
if (item_to_delete != 0)
{
previous_item->next = item_to_delete->next; // make the list "skip" one item
delete item_to_delete; // and delete the skipped item
}
または、英語で: 削除する項目 ( B ) の前にある項目 ( A ) を見つけ、Aの「次の」ポインターを調整して、 Bがリストでスキップされるようにし、 B を削除します。
特殊なケース、つまりリストから削除するアイテムが最初のアイテムまたは最後のアイテムである場合には注意が必要です。リストの最初の項目を削除したい場合、上記のコードは十分ではありませんprevious_item
。この場合、リストの最初の要素へのポインターを 2 番目の要素に変更する必要があります。
あなたのコード:
void deleteitem(char *uri)
{
str_pair *itemtodelete;
curr = head;
while (curr->next != NULL) {
if ((strcmp(curr->uri, uri)) == 0) {
itemtodelete = curr;
curr = itemtodelete->next;
delete itemtodelete;
curr = head;
return;
}
curr = curr->next;
}
}
ここでいくつかのことが間違っています:
head
null の場合、テストcurr->next != NULL
によってセグメンテーション違反が発生します。(null ポインターを逆参照してはいけません!)
リストからアイテムを削除するためのコードは完全に間違っています。最悪なのは、前の項目の次のポインターを変更せずにノードを削除することです。したがって、前のアイテムは、もう存在しないアイテムを参照します。
詳細:ステートメントcurr = head;
の前では、return
何も役に立ちません。
推奨コード:
2 つのステップで実行します。1 つの関数は、アタッチされた を介して削除するノードを検索し、uri
もう 1 つの関数はノードを削除します。以下のコードよりもうまく分離できますが、出発点にする必要があります。
str_pair* finditemwithuri(char* uri)
{
str_pair* current = head;
while (current)
{
if (strcmp(current->uri, uri) == 0) return current;
current = current->next;
}
return 0;
}
void deleteitem(char* uri)
{
// find linked list node with that uri; abort if uri not in list
str_pair* itemtodelete = finditemwithuri(uri);
if (!itemtodelete) return;
// special case: node to be deleted is the list's head
if (itemtodelete == head)
{
head = itemtodelete->next;
delete itemtodelete;
return;
}
// else, iterate over list nodes
// up to the one preceding the node to be deleted
str_pair* current = head;
while (current)
{
if (itemtodelete == current->next)
{
current->next = itemtodelete->next;
delete itemtodelete;
return;
}
current = current->next;
}
}