从链表中删除节点(C ++)

时间:2016-06-15 13:38:37

标签: c++

我不明白这段代码如何删除节点,请帮忙!!!

 Node* del_place(Node* L, int S)
{

        int i=1;
        Node *p=L;
        while (p!=NULL&&i!=S-1)
        {
            p=p->next;
            i++;
        }
        p->next=p->next->next;//why can this code delete node in L...
              return L;
      }

2 个答案:

答案 0 :(得分:1)

让我们来看看这个功能是做什么的。它需要两个参数,链表和要删除的项的索引。

首先,它搜索正确的节点: p是链表的第一项。它开始单步执行列表,直到找到正确的索引(i=S-1)或直到达到列表的末尾(p=NULL)。

当找到正确的节点时,它会将指向下一个项目p-> next的链接设置为下一个项目的下一个项目。

现在,您还可以看到函数中的问题:

  • 删除某个项目时,该项目本身仍在列表中 只是不再指向它,这是像molbdnilo所说的内存泄漏。
  • 当到达列表的末尾(p = NULL)时,您尝试在NULL旁边设置p->这将导致程序抛出nullpointerexception。
  • 如果p本身是列表中的最后一项,则p-> Next将为null,并且由于您尝试在此项目上调用“Next”,因此您还将获得nullpointerexception。

答案 1 :(得分:1)

该行实际上并未从内存中删除Node。它将其从链表中删除。

代码会使您当前的Nodep)指向右侧的第二个Node,而不是右侧的第一个Node

此代码有几个问题:

  • 由于p->next=p->next->next;未从内存中删除而导致潜在的内存泄漏
  • 您需要在p之前进行一些检查,否则当p->nextNULL最终成为L时,您可能会遇到一些未定义的行为。例如S为NULL,<div class="col-md-4 col-sm-12"> <div class="contact-form bottom"> <h2>Send a message</h2> <form id="main-contact-form" name="contact-form" method="POST" action='http://creobox.ie/site/sendemail.php'> <div class="form-group"> <input type="text" name="name" class="form-control" required="required" placeholder="Name"> </div> <div class="form-group"> <input type="email" name="email" class="form-control" required="required" placeholder="Email Id"> </div> <div class="form-group"> <textarea name="message" id="message" required="required" class="form-control" rows="8" placeholder="Your text here"></textarea> </div> <div class="form-group"> <input type="submit" name="submit" class="btn btn-submit" value="Submit"> </div> </form> </div> </div> &gt;链表的大小......
相关问题