删除单链表C中字符串中子串的出现次数

时间:2013-05-06 09:55:02

标签: c linked-list

我这里有一点问题。

我必须编写单链表的东西,从现在起我没有遇到任何问题。我坚持删除链接列表中作者名称中函数调用后给出的子字符串。

程序摘要:

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次出现都被释放了,但是它们留在缓冲区某处,因为我可以再打印出整个列表!


我会非常感激,谁能给我一些建议。

2 个答案:

答案 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;
        }
    ...
}