0 c++ linked-list delete-operator data-structures
我有以下数组结构(链表):
struct str_pair
{
char ip [50] ;
char uri [50] ;
str_pair *next ;
} ;
str_pair *item;
Run Code Online (Sandbox Code Playgroud)
我知道要创建一个新项目,我需要使用
item = new str_pair;
Run Code Online (Sandbox Code Playgroud)
但是,我需要能够遍历数组并删除特定项.我将循环部分排序.但是如何从结构数组中删除项目?
你所展示的不是一个数组struct,而是一个struct包含数组(类型char)的链表.
一个数组struct看起来像这样:
str_pair array_of_structs[10];
// or:
str_pair* dynamically_allocated_array_of_structs = new str_pair[10];
Run Code Online (Sandbox Code Playgroud)
如果你真的有这样的东西,你不需要delete从数组中单个项目.假设您已按如下方式初始化数组:
str_pair* array_of_structs = new str_pair[10];
Run Code Online (Sandbox Code Playgroud)
然后使用以下命令删除整个数组(包括其所有项目):
delete[] array_of_structs;
Run Code Online (Sandbox Code Playgroud)
同样,您不能delete在分配的数组中单个项目new[]; 你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
}
Run Code Online (Sandbox Code Playgroud)
或者,在英语:找到该项目(一个要删除(项目前)乙),然后调整一的'下一个’指针,以便乙将在列表中被跳过,然后删除乙.
您需要注意特殊情况,即要从列表中删除的项目是第一项还是最后一项.如果要删除列表中的第一个项目,上面的代码是不够的,因为没有previous_item.在这种情况下,您需要将指向列表的第一个元素的指针更改为第二个元素.
Run Code Online (Sandbox Code Playgroud)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将导致段错误.(你绝不能取消引用空指针!)
从列表中删除项目的代码完全不正确.最糟糕的是,删除节点而不更改上一项的下一个指针.因此,上一项将引用不再存在的项目.
细节:curr = head;在return声明之前没有做任何有用的事情.
分两步执行:一个函数通过附加查找要删除的节点uri,另一个函数删除节点.您可以将它分离得比下面的代码更好,但它应该是一个起点:
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;
}
}
Run Code Online (Sandbox Code Playgroud)