0

我这里有个小问题。

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

程序片段:

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


我将非常感谢,谁能给我一些建议。

4

2 回答 2

1

这个说法:

 tempnode = NULL;

实际上,什么都不做,因为tempnode除了分配和立即释放之外,您从不做任何事情。

于 2013-05-06T10:06:02.413 回答
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;
        }
    ...
}
于 2013-05-06T10:09:52.363 回答