C - 双重链表 - 节点内容不正确(难以解释)

时间:2015-01-28 00:33:17

标签: c linked-list doubly-linked-list

我发现这很难在标题中解释而没有实际显示代码和问题......所以在这里。我遗漏了正在运行的方法,因此阅读的内容并不多。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <ctype.h>

struct tnode {
    struct tnode *prev;
    char *word;
    struct tnode *next;
};

struct tnode *talloc(void)
{
    ...
}

struct tnode *addlist(struct tnode *p, char *w)
{
    ...
}

void removelist(struct tnode *p, char *w)
{
    while (1)
    {
        if (strcmp(p->word,w) == 0)
        {
            p->next->prev = p->prev;
            p->prev->next = p->next;
            goto out;
        }
        else if (strcmp(p->word,w) > 0)
        {
            p = p->prev;
        }
        else p = p->next;
    }
out:;
    return p;
}

void tprint(struct tnode *root)
{
    ...
}

main()
{
    struct tnode *root;
    root = talloc();
    root->word = "doberman";
    root->next = talloc();
    root->prev = talloc();
    //I am using a blank string at the beginning and end instead of leaving it NULL. When I tried leaving it NULL, I would get inaccessability errors.
    root->next->word = "";
    root->prev->word = "";
    //I don't remember why I made "current" but it is working so I don't want to mess with it.
    struct tnode *current;
    current = talloc();
    current = root;
    current = addlist(root, "giraffe");
    current = addlist(root, "gemini");
    current = addlist(root, "apple");
    current = addlist(root, "azure");
    current = addlist(root, "rabbit");
    current = addlist(root, "zambia");
    current = addlist(root, "viking");
    current = addlist(root, "cat");
    current = addlist(root, "dog");
    current = addlist(root, "tree");
    current = addlist(root, "domino");
    removelist(root, "azure");
    tprint(root);
}

目前正在删除的removelist方法应该是2-4个项目而不是1个。当我在bebugger中逐步执行该方法时,我注意到“p-&gt; word”与“p”不匹配”

例如,调试器会说“p-&gt; word”当前是“杜宾犬”,然后告诉我“p”目前包含“apple”。

我的问题是:这怎么可能?如果“p”是苹果节点,那么“p-&gt;字”怎么可能是杜宾犬呢?它真的搞乱了这个方法,因为它会认为它是在正确的位置进行删除,而事实上并非如此。

4 个答案:

答案 0 :(得分:1)

比较时,看看是否应删除使用

if (strcmp(p->word,w) > 0)

如果第一个不匹配的字符在ptr1中的值大于ptr2中的值,则返回true

我假设您要删除匹配的项目,以便一个问题,但不是问题。您是否尝试打印列表,然后再调用删除以确保添加所有项目?当你点击goto语句时会发生什么?

答案 1 :(得分:1)

你的第一个

if (strcmp(p->word,w) > 0)

应该是

if (strcmp(p->word,w) == 0)

答案 2 :(得分:0)

我认为你仍然必须将p-&gt; next和p-&gt; prev设置为NULL。否则,仍然可以遍历p。也许这会给你带来有趣的结果。

答案 3 :(得分:0)

最后我怀疑的最后一件事就是问题......打印方法。似乎我在这里提出的每一个问题都是这样的......答案与我在这里提出的问题无关,但所有答案仍然引导我找到解决方案。

无论如何,谢谢你的帮助。