Итак, я пытался убедиться, что я СОЛНЕЧНО понимаю связанные списки. Вот что у меня есть до сих пор:Связанный список Malloc() при вставке?
typedef struct node
{
int num;
struct node *next;
}node;
int main()
{
node *HEAD = create(5);
printf("Address:%p Value:%i\n", HEAD, HEAD->num);
HEAD = insert(HEAD,3);
printf("Address:%p Value:%i\n", HEAD, HEAD->num);
HEAD = insert(HEAD,7);
printf("Address:%p Value:%i\n", HEAD, HEAD->num);
return 0;
}
node* create(int value)
{
node *HEAD = malloc(sizeof(node));
if(HEAD == NULL)
{
printf("Space Unable to be allocated for HEAD\n");
}
HEAD->num = value;
HEAD->next = NULL;
return HEAD;
}
node* insert(struct node *HEAD,int value)
{
node *new_node = malloc(sizeof(node));
new_node->num = value;
new_node->next = HEAD;
HEAD = new_node;
return HEAD;
}
void print(struct node *HEAD)
{
node *trav = HEAD;
while(trav != NULL)
{
printf("Value in Linked List:%i\n",trav->num);
trav = trav->next;
}
}
Так что это работает и печатает 5,3,7, как должно. Однако, вытаскивая его на бумаге, меня слегка смущает вид node *new_node = malloc(sizeof(node));
. Так как мне кажется, что каждый раз при вставке мы создаем новый указатель под названием «new_node», который кажется, что много оставшихся указателей просто болтаются. Что будет иметь смысл, так это для new_node
каждый раз менять каждый раз, чтобы указать пространство malloc'd для нового вставленного узла.
Так что я делаю что-то не так здесь, или когда я malloc что-то с тем же именем, это старый, который просто переписывается (если это имеет смысл?), Или я должен быть свободным() в new_node после его были вставлены каждый раз?
Благодаря
Вы не вставляете новые значения, вы просто создаете новые узлы и печатаете их. Посмотрите, где вы «связываете» головной узел и вновь созданный узел. Вы не найдете его. –
Локальные переменные внутри функции перестают существовать, как только они возвращаются. * И * «new_node каждый раз, когда указывать на пространство malloc'd для нового узла, который вставлен», уже происходит, что происходит! Попробуйте использовать отладчик, чтобы пройти через код по строкам и проверить переменные и их значения. Или просто распечатайте все (помните, что 'printf' использует' '% p" 'для печати' void * '(и да, вам нужно наложить указатели)). –
Я бы предложил вам сначала использовать какой-то рабочий пример, чтобы понять, как написать свой собственный код. – tod