我正在尝试编写一个程序来创建链表,当用户输入数字时会更新,并在用户希望终止列表时打印输入的数字。
该程序似乎返回随机数。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <cs50.h>
int main(void)
{
typedef struct node
{
int number;
struct node *next;
}
node;
int i = 0;
int x;
char v;
node *list = NULL;
node* temp = NULL;
x = get_int("Enter number: n");
list = malloc(sizeof(node));
list -> number = x;
list -> next = NULL;
while(i == 0)
{
x = get_int("Enter number: n");
node *n = malloc(sizeof(node));
temp = malloc(sizeof(node));
n -> number = x;
n -> next = NULL;
for(temp = list; temp->next != NULL; temp = temp -> next)
{
i = 0;
}
temp->next = n;
free(n);
list = temp;
v = get_char("Proceed? :n");
if(v == 'n')
{
break;
}
else if(v == 'y')
{
continue;
}
else return 1;
}
for(node *temp1 = list; temp1 != NULL; temp1 = temp1 -> next)
{
printf("%dn",temp1 -> number);
}
}
cs50
头文件允许使用get_
函数,而不是使用printf
和scanf
的组合。
我想知道这里出了什么问题。
我将注释答案作为注释放在代码中:
while(i == 0) // advice : since i is always equals to 0, while (1) do the same job
{
x = get_int("Enter number: n");
node *n = malloc(sizeof(node));
temp = malloc(sizeof(node)); // warning : will lead to memory leak since this value is never used
n -> number = x;
n -> next = NULL;
for(temp = list; temp->next != NULL; temp = temp -> next)
{
i = 0; // advice : not really usefull
}
temp->next = n;
free(n); // ERROR : the new node is freed here so its memory may get garbage at any time
list = temp; // ERROR : the begining of the linked list is lost here ; it now always points to the last new node
v = get_char("Proceed? :n");
if(v == 'n')
{
break;
}
else if(v == 'y')
{
continue;
}
else return 1;
}
代码有几个问题
-
temp = malloc(sizeof(node));
会导致内存泄漏,因为您在几行后用list
过度写入它
Sol:实际上您不需要为temp
分配内存,因为它仅用于迭代您的列表。 -
temp->next = n; free(n);
存储下一个节点后的free
将使n
释放分配的内存,但您的temp->next
仍然会指向释放的内存,因此您的list
和访问是非法<的。>Sol:
(a) 不要使用free(n)
(b) 你不需要这个list = temp;
, 因为您已经在末尾添加了 node,所以执行list = temp;
将从list
中删除现有元素。 -
else return 1;
,如果v
是其他的,那么n
或y
那么我们返回而不打印列表并释放分配的内存,您不希望这样.
Sol:更好的办法是从那个点开始,打印list
并free
内存。 -
while(i == 0)
您可以简单地使用while(1)
,并在不想继续时正确中断。