函数表示节点已删除但未删除

Function says node is deleted but is not deleted

所以我有这个函数 deleteNode,它在单向链表中的 struct PersonalInfo 中删除给定一个人的 firstName 的节点。它 returns 1,意味着它删除了节点,但是当我打印链表时,它在内存中留下了名字,好像什么都没发生过一样。如果有人能帮我解决这个问题,我将不胜感激。

int deleteNode(PersonalInfo **head, char *firstName){
  if(head!=NULL){
    PersonalInfo *currNode = *head;
    while(currNode!=NULL){
      if(strcmp(currNode->next->firstName, firstName)){ 
        PersonalInfo *nextNode = currNode->next->next;
        free(currNode->next);
        currNode->next = nextNode;
        return 1;
      }   
      if(currNode->next==NULL){
        printf("Operation was unsuccessful: No such name exists\n");
        return 0;
      }   
      currNode = currNode->next;
    }   
  }
  else{
    printf("Head is null, please enter a valid head\n");
    return 0;
  }
}

当两个字符串相等时 strcmp returns 0。这是你应该使用的测试。

if(strcmp(currNode->next->firstName, firstName) == 0) 

首先观察的是你的 strcmp。该块语句仅在字符串不相等时才会 运行 。你不是在检查平等。我假设您只想 运行 仅当字符串相等时才使用块语句。

return 值为

  1. > 0: str1 > str2
  2. < 0: str1 < str2
  3. = 0: str1 == str2

    if(strcmp(currNode->next->firstName, firstName) == 0)

另一种可能是替换:

if(strcmp(currNode->next->firstName, firstName))

与 :

if(!strcmp(currNode->next->firstName, firstName))

因为 strcmp 的 return 值仅当字符串相同时才表示 "Flase"。