有人可以解释一下这个代码段吗?

Posted

技术标签:

【中文标题】有人可以解释一下这个代码段吗?【英文标题】:Can someone please explain this code segment? 【发布时间】:2017-04-25 10:11:07 【问题描述】:
void removeNode(string sk2) 
  nodelist *nodePtr, *previousNode;  // keeps the list in memory

  if (head->SKU == sk2) 
    nodePtr = head->next;
    delete head;
    head = nodePtr;
   else 
    nodePtr = head;

    previousNode = NULL;

    while (nodePtr != NULL && nodePtr->SKU != sk2) 
      previousNode = nodePtr;
      nodePtr = nodePtr->next;
    
    previousNode->next = nodePtr->next;
    delete nodePtr;
  

对不起,如果格式错误,我是这个网站的新手,一般来说是 c++。我似乎无法理解这个链表是如何执行删除功能的。

【问题讨论】:

这是一个成员函数吗?看起来head 是一个成员变量,否则我不知道它来自哪里。 【参考方案1】:

在这段代码中,它删除了链表的节点,该节点的值是从调用函数传递的sk2

我已经把cmets放在上面了,如果有不清楚的地方可以问我:)

  void removeNode(string sk2) // function having string as a argument 

    nodelist *nodePtr, *previousNode; //keeps the list in memory Variable of type nodelist 


 // here it is checking with the head of the link list whether that matches with the argument, as all linked list start with the Head 

    if (head->SKU == sk2)  
       nodePtr = head->next;
       delete head;  // if so then delete that node
       head = nodePtr;  // and reassign the head to new node 
     

 // if head parameter is not matching 
    else 
    
       nodePtr = head;

       previousNode = NULL;

     // travel up-to the node which has a data as a string passed as argument 
       while (nodePtr != NULL && nodePtr->SKU != sk2)
       

         previousNode = nodePtr;
         nodePtr = nodePtr->next; 
          
        previousNode->next = nodePtr->next;
        delete nodePtr;  // if found then delete that node 
     
  

【讨论】:

【参考方案2】:

您似乎想要删除一个具有sk2 作为SKU 成员的节点。

第一个if 只是检查head 节点是否是那个节点,如果是则删除它。

如果不是,则 else 块正在尝试找到它。 nodePtr 是当前要检查的节点,循环条件是:“只要我有一个节点要检查,而且它不是正确的”。 所以循环每次只获取->next 元素。此外,循环始终保留前一个节点,因为必须相应地设置 ->next 字段。

如果循环结束,会发生以下两种情况之一:

    nodePtr 包含正确的节点,它将被删除并以有效的方式恢复链接 nodePtrNULL。然后会发生未定义的行为。

【讨论】:

以上是关于有人可以解释一下这个代码段吗?的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释一下这个与 Js 回调函数有关的代码吗?我对这段代码很困惑,可能是因为我是初学者。问题是:

我可以将多个线程分配给 OpenMP 中的代码段吗?

有人可以解释这段代码如何返回 4

有人能解释一下这段代码中的法线是如何计算的吗?

递归函数:有人能解释一下这段代码是如何打印 1 到 5 的吗?

有人可以解释一下这个 c++ 代码有啥问题并提供解决方案吗