Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链表(删除节点)_C++_Linked List_Delete Operator - Fatal编程技术网

C++ 链表(删除节点)

C++ 链表(删除节点),c++,linked-list,delete-operator,C++,Linked List,Delete Operator,我的问题是,如果用户输入一个姓氏,并且在链接列表中有多个相同的姓氏,并且其中一个姓氏在head节点中。如何在不删除头部节点的情况下删除另一个姓氏。我尝试了一些我能想到的方法,但是删除了所需的节点(这很好),包括头部节点(这不是我想要的…) void NumberList::deleteCertainRecord() { 字符串lname=“”; ListNode*ptr; ptr=头部; 字符串回答; cout data.person.getLastName(); if(lname==应答){

我的问题是,如果用户输入一个姓氏,并且在链接列表中有多个相同的姓氏,并且其中一个姓氏在head节点中。如何在不删除头部节点的情况下删除另一个姓氏。我尝试了一些我能想到的方法,但是删除了所需的节点(这很好),包括头部节点(这不是我想要的…)

void NumberList::deleteCertainRecord()
{
字符串lname=“”;
ListNode*ptr;
ptr=头部;
字符串回答;
cout data.person.getLastName();
if(lname==应答){
num++;

cout执行此操作所使用的代码数量之多,使实际意图变得模糊

  • 您有一个人员的链接列表
  • 给定要枚举列表以查找匹配项的姓氏
  • 发现匹配项后,您希望提示用户确认删除
  • 如果确认要删除,请将发现的节点解压出来,否则列表将保持不变,然后将其删除
  • 否则,如果未确认,请跳到下一个节点,查找更多匹配项
如果节点实际上是头节点,则删除部分显然存在问题。对于刚接触链表的人来说,特殊情况下的头节点逻辑总是很棘手。幸运的是,如果使用正确的算法,可以完全避免这种情况。假设列表正确地以NULL结尾,如果列表为空,这样的算法如下:

ListNode ** pp = &head;
while (*pp)
{
    if ((*pp)->data.person.getLastName() == answer &&
         confirmDelete((*pp)->data.person)) // <== TODO: write this function
    {
        ListNode *victim = *pp;
        *pp = victim->next;
        delete victim;
    }
    else
    {   // just advance to next person
        pp = &(*pp)->next;
    }
}
ListNode**pp=&head;
而(*pp)
{
if((*pp)->data.person.getLastName()==answer&&
confirmDelete((*pp)->data.person))//下一步;
删除受害者;
}
其他的
{//只需前进到下一个人
pp=&(*pp)->下一步;
}
}
这将正确地删除用户,即使他们是列表中的第一个节点,并为您正确地推进头部指针。它还适用于具有或不具有匹配条件的单节点列表,甚至是
head
为空的空列表。此技术使用列表中的指针作为枚举列表的机制;n不仅仅是它们的值,实际的指针


最后,如果您对列表进行排序,这将大大提高效率,但我将此留给您。

您应该能够删除链接列表中的head节点。将指针指向next,删除head,然后将head指向next。要删除具有相同姓氏的链接列表中的所有元素,您必须遍历整个列表。如果您不想删除head节点,只需在第一次迭代中跳过它。创建一个函数来执行此操作。我不确定我是否理解您的问题:您有一个包含姓氏的链接列表,您想使用delete函数删除包含给定姓氏的节点,但跳过head节点吗?
ListNode ** pp = &head;
while (*pp)
{
    if ((*pp)->data.person.getLastName() == answer &&
         confirmDelete((*pp)->data.person)) // <== TODO: write this function
    {
        ListNode *victim = *pp;
        *pp = victim->next;
        delete victim;
    }
    else
    {   // just advance to next person
        pp = &(*pp)->next;
    }
}