-2

我一直在玩链表,并通过 AND 操作了解了 While 循环的一些不寻常特征(我猜是这样)。

这是什么:

这是我的删除功能。我正在寻找要删除的密钥。

void delet(Mynode** head,int value) {
    printf(" deleting... %d\n",value);
    Mynode *temp = *head,*prev;
    if(temp->val == value) { 
        *head = (*head)->next;
        free(temp);
        return;
    } else {
        while( temp->val != value && temp != NULL) {
            prev = temp;
            temp=temp->next;
        }
    }
    if(temp == NULL) {
        printf("..and %d is not in the list\n",value );
    } else{
        prev->next = temp->next;
    }
}

在 while 循环中,我一直在检查这样的条件。并且仅适用于列表中的值。

如果要删除的值不在列表中,则会引发分段错误。

while( temp->val != value && temp != NULL) {
    prev = temp;
    temp=temp->next;
}

但有趣的是,如果我在 while 循环中交换条件,它可以正常工作而不会出现任何错误。那是:

    while( temp != NULL && temp->val != value)

我想在 while 循环中交换条件应该不会影响输出。

任何人都可以告诉我为什么会这样,或者我一直在出错。

感谢您的时间。

4

1 回答 1

2

条件

temp->val != value && temp != NULL

需要temp不为空temp->val才能工作。正在测试的第一位。如果temp为null,它将崩溃。

因此首先测试 if tempis not null ,然后查看 指向的内容temp

IE

temp != NULL && temp->val != value

ps:&& 是一个短路运算符,一旦知道答案,它就会停止评估

于 2016-01-16T10:56:55.393 回答