C 从链接列表中搜索和删除节点

C 从链接列表中搜索和删除节点,c,dictionary,linked-list,C,Dictionary,Linked List,我正在使用链表编写一个简单的字典程序。我想在字典里搜索一个单词并删除它。我已经编写了代码,但我认为这更耗时,因为我要运行两次循环,第一次搜索节点并记下位置,第二次删除它 struct node{ char word[20]; char meaning[5][100]; struct node *next; }; void del(struct node *head, char *word) { int found = 0, position = 0, i; st

我正在使用链表编写一个简单的字典程序。我想在字典里搜索一个单词并删除它。我已经编写了代码,但我认为这更耗时,因为我要运行两次循环,第一次搜索节点并记下位置,第二次删除它

struct node{
    char word[20];
    char meaning[5][100];
    struct node *next;
};

void del(struct node *head, char *word)
{
  int found = 0, position = 0, i;
  struct node *temp = head;
  while(temp != NULL)
  {
    if(strcmp(temp->word, word) == 0)
    {
        found = 1;
        break;
    }
    temp = temp->next;
    position++;
  }
  if(found == 1)
  {
      temp = head;
      if(position == 0)
      {
          head = temp->next;
          free(temp);
      }
      for(i = 0; i < position-1; i++)
          temp = temp->next;
      struct node *temp2 = temp->next;
      temp->next = temp2->next;
      free(temp2);
      printf("Word deleted..\n");
  }
  else printf("Word not found!\n");
}
struct节点{
字符字[20];
char表示[5][100];
结构节点*下一步;
};
void del(结构节点*头,字符*字)
{
找到的int=0,位置=0,i;
结构节点*温度=头部;
while(temp!=NULL)
{
如果(strcmp(临时->字,字)==0)
{
发现=1;
打破
}
温度=温度->下一步;
位置++;
}
如果(找到==1)
{
温度=水头;
如果(位置==0)
{
头=温度->下一步;
免费(临时);
}
对于(i=0;i下一步;
结构节点*temp2=temp->next;
temp->next=temp2->next;
免费(临时2);
printf(“已删除的单词…\n”);
}
else printf(“找不到单词!\n”);
}

是否有其他方法可以优化程序?

您只需像这样将两个周期合并在一起,下面是一个代码示例

struct node{
    char word[20];
    char meaning[5][100];
    struct node *next;
};

struct node *del(struct node *head, char *word)
{int found = 0, position = 0, i;
  struct node *temp = head;
  struct node *prev = NULL;
  /*You should avoid breaks because they decrease legibility*/
  while(temp != NULL)
  {

    if(strcmp(temp->word, word) == 0)
    {
        if(prev == NULL){ /*If the node is the head*/
            head = head->next;
            free(temp);
            return head;
        }else{
            prev->next = temp->next;
            free(temp);
            return head;
        }
    }
    prev = temp;
    temp = temp->next;
  }

}

运行搜索循环时,还临时存储要检查的当前节点的父节点。找到要删除的节点时,只需将其父节点的下一个指针设置为下一个要删除的节点,然后删除该节点。如何获取上一个节点地址?找到后需要立即删除该单词。@surjit在浏览列表时,在每一步结束时,将当前节点存储到一个变量中。在下一步中,您可以使用该变量,因为它包含上一个节点。完成此操作后,您可以将程序更改为仅使用一个循环,因为上一个节点可用,因此您可以删除该节点。删除后重置链接时,我感到困惑。我非常确定它应该是
prev->next=temp->next
,而不是
prev=temp->next
代码没有删除该节点。相反,它是用一些垃圾值来更改单词,而其含义保持不变。在使用
del()
之前,列表中有
word=go
means=something
。使用
del()
后,列表显示
word=x5
means=something
。它用一些垃圾值I替换了这个词guess@surjit正如你从评论中看到的,我犯了一个错误,我编辑了它。你现在能试试这个新代码吗?它对我有用,让我知道