Member 13404013 Ответов: 3

Как установить связанный список в NULL?


Мой код связанного списка, похоже, выводит значение данных в бесконечном цикле, и я считаю, что это потому, что head никогда не устанавливается в NULL. Я не знаю, как это сделать.

Что я уже пробовал:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
	int data;
	struct Node* next;
}Node;

typedef struct 
{
	Node* head;
}Linked_List;

/*------------------------------------------------------------------*/

Linked_List* create_empty_list(void)
{
	Linked_List* new_head; /*create list pointer*/
	new_head = (Linked_List*)malloc(sizeof(Linked_List)); /*assign it memory of head struct*/
	new_head->head = NULL;
	
	return new_head;
}

Node* insert_start(Linked_List* list, int data)
{
	Node* new_node;
	new_node = (Node*)malloc(sizeof(Node));
	new_node->data = data;
	new_node->next = list->head;
	list->head = new_node;
	
	return new_node;
}
	
void display(Linked_List* list)
{
	Node* temp;
	temp = list->head;
	while(temp != NULL)
	{
		printf("%d ", temp->data);
	}
	temp = temp->next;
}
	
int main(void)
{
	
	Linked_List* the_list = create_empty_list();
	
	the_list->head = insert_start(the_list, 5);
	
	display(the_list);
	
	
	return(0);
	
}

k5054

Проверьте свой цикл while в display () и посмотрите, сможете ли вы понять, почему он не завершается.

3 Ответов

Рейтинг:
2

CPallini

Йохен уже исправлена ваша ошибка.
Кроме того, обратите внимание, что вам не нужно ни Linked_List структура ни то create_empty_list функция, в то время как вам действительно нужно освободить память.
Попробуй

#include <stdlib.h>
#include <stdio.h>

typedef struct Node
{
  int data;
  struct Node* next;
} Node;

Node * insert(Node* head, int data)
{
  Node* new_node;
  new_node = (Node*)malloc(sizeof(Node));
  new_node->data = data;
  new_node->next = head;
  return new_node;
}

void display(Node * head)
{
  Node * temp = head;
  while(temp != NULL)
  {
    printf("%d ", temp->data);
    temp = temp->next;
  }
}

void cleanup(Node * head)
{
  Node * temp = head;
  while ( temp != NULL)
  {
    Node * cur = temp;
    temp = temp->next;
    free(cur);
  }
}


int main()
{
  Node * head = NULL;

  head = insert(head, 1);
  head = insert(head, 3);
  head = insert(head, 5);
  head = insert(head, 12);

  display(head);
  printf("\n");
  cleanup(head);

  return 0;
}


Рейтинг:
1

Jochen Arndt

Обновление temp->next в display функция должна быть внутри while петля:

void display(Linked_List* list)
{
    Node* temp;
    temp = list->head;
    while(temp != NULL)
    {
        printf("%d ", temp->data);
        temp = temp->next;
    }
}


Рейтинг:
0

Patrice T

Цитата:
я думаю, это потому, что голова никогда не устанавливается в нуль.

Перестаньте верить, изучите отладчик и убедитесь.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик-Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.