我有一个这样的列表:
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/