我实现了这段代码,将一个项目添加到列表中(它必须是字符串)并删除一个特定的字符串。但是它有两个问题:首先,将节点插入列表后顺序错误。第二,删除节点后,它仍然是一个"空白"空间,当我删除第三个节点时,请参阅下文。
初始列表:
第一
第四
第三
第二
在 list_remove() 之后:
第一
第四
第二
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct myStruct {
char str[20];
struct myStruct * pNext;
};
struct myStruct *list_create(const char *str)
{
struct myStruct *node;
if(!(node=malloc(sizeof(struct myStruct))))
return NULL;
strcpy(node->str, str);
node->pNext = NULL;
return node;
}
int add_to(struct myStruct * list, const char *str)
{
struct myStruct *newnode;
newnode = list_create(str);
newnode->pNext = list->pNext;
list->pNext = newnode;
return 1;
}
char * remove_to(struct myStruct * list, const char *str)
{
while(list->pNext && (strcmp(list->str, str)))
list = list->pNext;
free(list);
return 0;
}
int list_foreach(struct myStruct *node, int(*func)(void*))
{
while(node) {
if(func(node->str)!=0) return -1;
node=node->pNext;
}
return 0;
}
int printstring(void *s)
{
printf("%sn", (char *)s);
return 0;
}
int main(void)
{
struct myStruct *list;
// Create initial elements of list
list = list_create("First");
add_to(list, "Second");
add_to(list, "Third");
add_to(list, "Fourth");
printf("Initial list:n");
list_foreach(list, printstring);
putchar('n');
remove_to(list, "Third");
printf("After list_remove():n");
list_foreach(list, printstring);
putchar('n');
return 0;
}
我想我看到了一些问题:add_to() 始终对当前列表的第一项进行操作。因此,每次添加时,新节点都将插入第一个节点和第二个节点之间(如果有第二个节点)。
并且该方法remove_to不会检查是否实际找到了匹配的字符串。用尽while循环后,如果找不到匹配项,我认为您将释放最后一项。
C++有一整套"集合",内置链表就是其中之一。除非这是一个你必须实现自己的家庭作业练习,否则请考虑使用它。