在C中删除一个节点的列表

时间:2015-10-01 23:24:14

标签: c pointers sortedlist

我在这里有一个函数,它将从任何类型的排序列表中删除一个节点。 我遇到一个特定情况的困难:当列表中有1个节点并且您想删除它时。

在这种情况下,我想让列表为空,所以当打印出列表时,屏幕上没有打印数据,但我似乎无法得到那个结果。只是说,例如,列表是double类型,列表只包含一个节点2.0。如果此节点是删除目标,则前进输出应为空列表。相反,我的代码打印出0.0。

我不确定如何处理此错误。我已经找到了要处理的函数的特定部分,但它的实现让我感到厌烦。我首先检查前一个节点是否为空,然后检查列表长度是否等于1.

如果成功则返回1,如果失败则返回0。

 int SLRemove(SortedListPtr list, void *newObj) {

   Node ptr, iterptr, prev = NULL;

   if(list==NULL || newObj ==NULL) {
      return 0;
   }

   int size= listlength(list);

   for(ptr=list->start; ptr!=NULL; ptr=ptr->next) {
     if(list->cf(newObj, ptr->info)==0){//found matching entry in list
       //deleting first node;
       if(prev==NULL) {
         if(size == 1) {
            printf("attempting to delete list with 1 node\n");
            /*code to delete node where it's the only element in the ist, should make the list empty.*/
            return 1;
         }

         list->start = ptr->next;
         destroyNode(ptr);
         return 1;
       } else {
         prev->next = ptr->next;
         destroyNode(ptr);
         return 1;
       }
    }
    prev = ptr;
  }

  return 0;
}

非常感谢您提供的任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

第一次检查应该是:

   if(list==NULL || list->start == NULL || newObj ==NULL) {
      return 0;
   }

一旦通过此检查,列表中至少有一个节点。如果prev == NULL,则需要设置list-> start = list-> start->然后删除第一个节点。如果有一个节点或多个节点,则无关紧要。

您需要检查列表的其他函数 - > start == NULL(或size == 0)以避免打印垃圾。

使用双指针可以消除对prev == NULL的检查,但我无法解释您的代码,因为我不知道节点是如何定义的,并且它并不是真正需要的,因为检查prev == NULL也一样好。举个例子:

typedef struct Node_{
    struct Node_ *next;
    ...
}Node;

/* in the delete function */
Node **ppNode = &list->start; /* ptr to list->start or ...->next */

/* to advance ppNode */
ppNode = &(*ppNode->next);

/* to remove a node from the list */
*ppNode = (*ppNode)->next;