我这里有一点问题。
我必须编写单链表的东西,从现在起我没有遇到任何问题。我坚持删除链接列表中作者名称中函数调用后给出的子字符串。
程序摘要:
void list_delete_element(kniha_t* inode)
{
kniha_t *actualnode = inode;
kniha_t *prevnode = NULL;
kniha_t *tempnode = NULL;
uchar_t needle[100];
uchar_t haystack[100];
ushort_t occur = 0;
scanf("%s", &needle);
lower_string(needle);
while(actualnode != NULL)
{
copy_string(haystack, actualnode->autori);
lower_string(haystack);
if(search_string(haystack, needle))
{
occur++;
if ( NULL != prevnode)
{
prevnode->next = actualnode->next;
}
else
{
inode = actualnode->next;
}
tempnode = actualnode;
actualnode = actualnode->next;
free(tempnode);
tempnode = NULL;
}
else
{
prevnode = actualnode;
actualnode = actualnode->next;
}
}
printf("Deleted sa %hu nodes\n", occur);
}
我必须加载它的东西,忽略---:
http://pastebin.com/NPvEr3y6
问题是,这是有效的(:D)......直到我清除所有事件。
示例:
当我键入pra时,它必须删除包含“pra”的所有节点。它就像一个魅力...但当我只键入“p”时,它告诉我,所有X次出现都被释放了,但是它们留在缓冲区某处,因为我可以再打印出整个列表!
我会非常感激,谁能给我一些建议。
答案 0 :(得分:1)
这句话:
tempnode = NULL;
实际上,什么都不做,因为除了任务以及立即释放之外,你永远不会对tempnode
做任何事情。
答案 1 :(得分:1)
您的list_delete_element
应该kniha_t**
,以便您可以删除头节点和剪枝链表。使用当前代码,您删除节点,但其他功能不知道,因为inode
未更改。
您可以将代码更新为
void list_delete_element(kniha_t* *inode)
{
kniha_t *actualnode = *inode;
...
if ( NULL != prevnode)
{
prevnode->next = actualnode->next;
}
else
{
*inode = actualnode->next;
}
...
}