gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:46:43 24 4
gpt4 key购买 nike

我有一个这样的列表:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com