c - 链接列表未按预期工作

标签 c linked-list

我实现了此代码以将一个项目添加到列表中(它必须是一个字符串)并删除一个特定的字符串。但是它有两个问题:第一,将节点插入列表后顺序错误。其次,删除节点后,它仍然是一个“空白”空间,请参阅下面当我删除第三个节点时的情况。

初始列表:
第一
第四
第三
第二次

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("%s\n", (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++有一整套“集合”,内置的链表就是其中之一。除非这是一个你必须自己实现的家庭作业练习,否则请考虑使用它。

关于c - 链接列表未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34812507/

相关文章:

c - 在c中递归拆分数组

C undefined reference

c - 如何定义链表节点 "recursively"?

rust - 创建单链接堆栈时无法摆脱 `Rc` 错误

c - 将 uint16_t 变量传递给期望 uint8_t 变量危险的函数

c - 在执行操作时,bookid 会被更改吗?

c - 警告 :"initialization makes pointer from integer without a cast in c

C 编程 - 在结构进入链接列表时对其进行排序

多文件 C++ 链表

c - 简单链表