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

时间:2017-04-25 10:11:08

标签: c++ linked-list

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 ++一般都很新。我似乎无法理解这个链表如何预先形成删除功能。

2 个答案:

答案 0 :(得分:0)

在此代码中,它将删除链接列表的节点,该节点的值为sk2,从调用函数传递。

我已对此发表评论,如果有什么不清楚,请参考,你可以问我:)

  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 
     }
}  

答案 1 :(得分:0)

您似乎想要删除sk2SKU成员的节点。

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

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

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

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