我在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");
}
答案 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");
}