我在这里有一个函数,它将从任何类型的排序列表中删除一个节点。 我遇到一个特定情况的困难:当列表中有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;
}
非常感谢您提供的任何帮助。谢谢。
答案 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;