我发现这很难在标题中解释而没有实际显示代码和问题......所以在这里。我遗漏了正在运行的方法,因此阅读的内容并不多。
#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;字”怎么可能是杜宾犬呢?它真的搞乱了这个方法,因为它会认为它是在正确的位置进行删除,而事实上并非如此。
答案 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)
最后我怀疑的最后一件事就是问题......打印方法。似乎我在这里提出的每一个问题都是这样的......答案与我在这里提出的问题无关,但所有答案仍然引导我找到解决方案。
无论如何,谢谢你的帮助。