该功能应该从链接列表中删除元素。目前,它确实可以胜任工作,但是通过进一步测试,我发现使用该功能约2-3次后出现了分段错误。例如,假设listA包含1 2 3 4 4 5,则当我执行remove listA 4然后打印listA的元素时,输出应该是1 2 3 5。但是,当我在列表上再使用1-2次删除功能时,它停止工作,并且不断出现分段错误。我不确定为什么。任何帮助将不胜感激!

  void mylist::remove(int z)
            {
              Node *currP, *prevP;

              prevP = NULL;
              for (currP = head;
                   currP != NULL;
                   prevP = currP, currP = currP->next) {

                if (currP->key == z) {
                  if (prevP == NULL) {
                    head = currP->next;
                  } else{
                    prevP->next = currP->next;
                  }
                  delete currP;
                  currP=prevP;
                  numberofnodes--;
                }
              }
              return;
         }

最佳答案

您不处理删除第一个节点表单列表的情况,因为prevP为空。删除currP后,您将分配currP=prevP;。在下一次迭代中,当为下一次for循环迭代执行prevP = currP, currP = currP->next时,将导致分段错误。

您可以改用while循环,例如:

void mylist::remove(int z)
        {
          Node *currP, *prevP, *temp;

          prevP = NULL;
          currP = head;
          while(currP != NULL){

            if (currP->key == z) {
              if (prevP == NULL) {
                head = currP->next;
              } else{
                prevP->next = currP->next;
              }
              temp = currP;
              currP = currP->next;
              delete temp;
              numberofnodes--;
            }
           else
           {
               prevP = currP;
               currP = currP->next;
           }
          }
          return;
     }

09-27 18:07