【发布时间】:2016-09-30 23:00:50
【问题描述】:
我正在学习如何在 c 中使用带有链表的结构。所以我试图继续将节点插入到第一个位置。此外,每个节点包含两种不同的值,一种是 char 数组,另一种是整数。一旦我插入一个值,然后将当前列表打印出来。我一遍又一遍地看,但我找不到哪里出了问题,因为我在插入函数中设置了一个 printf() 测试。我看到 new_node 是我当前插入的。
当我先插入一个 1 并打印出 a/1。但是当我插入另一个集合(例如 b 2)时,我很困惑,它会打印出来
b/2
b/1
这意味着第一个节点的名称随着插入一个新节点而改变,但数字没有改变。谁能看到这里发生了什么?
struct node{
char *name;
int numbers;
struct node *next;
};
struct node *list = NULL;
void printList(struct node *node){
while (node != NULL){
printf("%s/%d\n", node->name, node->numbers);
node = node->next;
}
}
void insert(struct node **list, char *name, int numbers){
struct node * new_node = malloc(sizeof(struct node));
new_node->name = name;
new_node->numbers = numbers;
//printf("......%s %d.........\n", new_node->name, new_node->numbers);
new_node->next = *list;
*list = new_node;
}
int main(){
......code for scanf() are omitted......
insert(&list, name, numbers);
printList(list);
}
【问题讨论】:
-
new_node->name = name;--> 像new_node->name = strdup(name);一样复制 -
别忘了以正确的方式释放你的节点,这意味着释放名称指针,因为它是一个分配的内存,指向它的唯一指针就是这个节点名称。
-
@BLUEPIXY 为什么 char 数组需要 strdup 而整数不需要?
-
因为
name是指针(numbers不是指针)。该指针指向同一个缓冲区。 -
请包含您已删除的 main() 代码
标签: c struct linked-list