c - 使用函数更新列表(无返回值)

标签 c list

我有一个这样的列表:

typedef struct list {
     char *key;
     char *value;
     struct list *next;
} List;

并在我的主要功能中使用它:

main(int argc, char *argv[]) {
    List *list;
    list = malloc(sizeof(struct list));

    list = insertToList("key", "value", list);
}

insertToList 是:

List insertToList(char *key, char *value, List *list) {
    List *newNode = malloc(sizeof(struct list));
    newNode->key = malloc(strlen(key));
    strcpy(newNode->key, key);

    newNode->value = malloc(strlen(value));
    strcpy(newNode->value, value);
    newNode->next = list;
    list = newNode;

    return list;
}

这按预期工作,但我想改用指针修改列表,这样我就不必返回列表。我试图将 &list 作为参数传递给 insertToList,然后使用 **list 接收它,但这没有用。我该怎么做?

最佳答案

基本上需要的是指向指针的指针:List**:

void insertToList(char *key, char *value, List** list) {
    List *newNode = malloc(sizeof(List));
    newNode->key = malloc(strlen(key));
    strcpy(newNode->key, key);

    newNode->value = malloc(strlen(value));
    strcpy(newNode->value, value);
    newNode->next = *list;
    *list = newNode;
}

List 重命名为 ListNode 更清晰

另一种方法是,定义一个额外的结构 List 来包装“头指针”(ListNode*)。此结构可以包含其他值,例如当前列表大小。

typedef struct ListNode
{
    char *key;
    char *value;
    struct ListNode *next;
} ListNode;

typedef struct List
{
    struct ListNode* head;
} List;

void insertAtFront(char *key, char *value, List* list)
{
    ListNode *newNode = malloc(sizeof(List));
    newNode->key = malloc(strlen(key));
    strcpy(newNode->key, key);

    newNode->value = malloc(strlen(value));
    strcpy(newNode->value, value);
    newNode->next = list->head;
    list->head = newNode;
}

void insertBefore(char *key, char *value, ListNode** listNode)
{
    ListNode* newNode = malloc(sizeof(List));
    newNode->key = malloc(strlen(key));
    strcpy(newNode->key, key);

    newNode->value = malloc(strlen(value));
    strcpy(newNode->value, value);
    newNode->next = *listNode;
    *listNode = newNode;
}

关于c - 使用函数更新列表(无返回值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20150332/

相关文章:

c++ - 使编辑控件透明 WinAPI (win32)

c++ - 简单的 C 和 C++ 可执行程序在 Windows 7 中挂起

c++ - C/C++ 宏参数包含点(成员访问运算符)

python - 高级 for 循环

python 如何在不从列表中删除元素的情况下按出现次数对列表进行排序?

asp.net-mvc-3 - 发布到列表<modeltype> MVC3

c - 使用 system tap 时如何避免 "probe overhead exceeded threshold"错误?

c - Switch 语句在我的 C 程序中不起作用?

list - 递归函数的惰性模式

java - 返回数组列表对象 java 中的列表