在C中查找链接列表中的重复字符

时间:2014-03-29 20:02:42

标签: search linked-list char

我在C中工作并在链接列表中存储字符串。一个节点的一个字符。我想传递列表的头部和一个关键字符,作为我的find()中的参数,并在每次“'键”时发出一个打印语句。找到了。我这样做是因为,最终我需要修改此函数来查找并删除每个查找它的实例。

到目前为止,我的功能找到了'键'并发布一份印刷声明。但是,它只会做一次。例如,如果我的列表是...... a-> d-> a-> m-> NULL,我的密钥是......' a',它只发出一次print语句。但我需要它发出一个印刷声明n次密钥发生,在这种情况下' a'发生两次。

这是我当前的find()

void find(struct node *head, char key)
{

    while (head != NULL)
    {
        if (head->data == key)
        {
            printf("char has been found\n");
            return;
        }
        head = head->next;
    }
    printf("sorry, char has not been found\n");
}

2 个答案:

答案 0 :(得分:0)

您的return中有一条if声明,请将其删除,并且该功能会为每个匹配的密钥打印"char has been found\n"

但也会打印句子"sorry, char has not been found\n",因此请在found中添加您设置为true的标记if并检查打印是否打印"sorry, char has not been found\n" 1}}。

例如:

void find(struct node *head, char key)
{
    int found = false;

    while (head != NULL)
    {
        if (head->data == key)
        {
            printf("char has been found\n");
            found = true;
        }
        head = head->next;
    }
    if (!found)
    {
        printf("sorry, char has not been found\n");
    }
}


编辑:

int    list_destroy(t_list *head, t_f_dtr f_dtr)
{
  t_list    *cur = NULL;
  t_list    *tmp = NULL;

  if (!head)
    return (list_error("Error: list_destroy(): head is NULL."));
  if (head->next)
  {
    cur = head->next;
    tmp = cur->next;
    while (tmp != head->next)
    {
      if (free_elem_data(cur, f_dtr) || free_for_list_destroy(cur))
        return (-1);
      cur = tmp;
      tmp = tmp->next;
    }
    if (free_elem_data(cur, f_dtr) || free_for_list_destroy(cur))
      return (-1);
  }
  if (free_for_list_destroy(head))
    return (-1);
  return (0);
}

这是我的通用循环双向链接列表中的一项功能,因此请不要使用它,因为您的列表不同。

答案 1 :(得分:0)

return语句使函数继续运行。你需要做一些这样的事情,你释放节点,这样你没有内存泄漏,但是在删除当前节点后,还要在前一个节点和下一个节点之间添加一个链接。

void find(struct node *node, char key)
{
    while (node != NULL)
    {
        if (node->data == key)
        {
            printf("char has been found\n");
            struct node *deleteMe = node;
            if(node->prev)
                node->prev = node->next;
            node = node->next;
            free(deleteMe);
        } else
            node = node->next;
    }
    printf("sorry, char has not been found\n");
}