如何正确实现链表节点存储?避免生成末尾多余0节点
如何正确将值存储到链表中,避免生成多余的末尾0节点?
当前实现的store函数在存储链表时,会在末尾生成一个值为0的多余节点:输入链表为2->6->0->1->3->5->4,输出变为2->6->0->1->3->5->4->0。以下是问题分析和修改方案:
原问题代码
store函数代码
void store(Stack *a, t_important *data) { int i; Stack *tmp; tmp = a; i = 0; while(i < data->length) { tmp->n = data->collection_of_ints[i]; tmp->next = malloc(sizeof(Stack)); tmp = tmp->next; i++; } }
主函数调用代码
int main(int ac, char **av) { Actions action; Stack *a; Stack *b; t_important *data; if(ac < 2) return (-1); data = malloc(sizeof(*data)); stack_nums_counter(av, data); collect(av, data); __check__collection(data); __collecting_ints(data); action = init(); a = NULL; b = NULL; store(&a, data); __sort_a__(&a, &b, data, action); return (0); }
问题根源
- 参数类型不匹配:主函数中
a初始为NULL,调用store(&a, data)传递的是Stack**类型,但store函数参数定义为Stack*,导致无法正确初始化链表头节点。 - 循环逻辑错误:每次循环都强制给
tmp->next分配内存,即使处理到最后一个元素,循环结束后会生成一个未赋值的空节点,其n值因malloc未初始化默认是0。
修改方案
调整循环逻辑,仅在需要时分配下一个节点,并修正参数类型以正确初始化链表:
修正后的store函数
void store(Stack **a, t_important *data) { int i; Stack *tmp; if (data->length == 0) return; // 创建第一个节点 *a = malloc(sizeof(Stack)); if (!*a) return; // 可根据需求添加错误处理 tmp = *a; i = 0; while (i < data->length) { tmp->n = data->collection_of_ints[i]; // 仅当不是最后一个元素时,才分配下一个节点 if (i != data->length - 1) { tmp->next = malloc(sizeof(Stack)); if (!tmp->next) return; // 可根据需求添加错误处理 tmp = tmp->next; } else { tmp->next = NULL; // 最后一个节点的next置空,终止链表 } i++; } }
修改说明
- 把函数参数改为
Stack **a,确保能修改主函数中链表头指针a的指向,正确初始化链表。 - 循环内判断当前元素是否为最后一个,仅非末尾元素时才分配下一个节点,避免生成多余节点。
- 最后一个节点的
next设为NULL,保证链表结构正确。
内容的提问来源于stack exchange,提问作者Davit
相关产品推荐
相关产品推荐

