Member 13404013 Ответов: 1

Как я могу исправить свою функцию печати связанного списка/insert_end?


Я получил свой связанный список, работающий с целыми числами нормально, однако преобразование его в общий связанный список и хранение строк приводит к логической ошибке, которую я не могу взломать. Вот вывод к набору "привет" и "до свидания":

Список-это прощай, прощай.

То есть он печатает последнее слово дважды.

Спасибо.

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

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

/*Typedef declarations*/

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

typedef struct 
{
	Node* head;
}Linked_List;

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

Linked_List* create_empty_list(void)
{
	Linked_List* new_head; 
	new_head = (Linked_List*)malloc(sizeof(Linked_List)); 
	new_head->head = NULL;
	
	return new_head;
}

/*------------------------------------------------------------------*/
	
Node* insert_end(Linked_List* list, void* data)
{
	Node* new_node;
	Node* temp;
	new_node = (Node*)malloc(sizeof(Node));
	/*new_node->data = (char**)malloc(sizeof(char*)); need to free this*/
	new_node->data = data;
	new_node->next = NULL;
	if(list->head == NULL)
	{
		list->head = new_node;
	}
	else
	{
		temp = list->head;
		while(temp->next != NULL)
		{
			temp = temp->next;
		}
		
		temp->next = new_node;
	}
	return(list->head);
}
	
/*------------------------------------------------------------------*/	

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

/*------------------------------------------------------------------*/
		
void free_list(Linked_List* list)
{
	while(list->head != NULL)
	{
		Node* temp = list->head;
		list->head = temp->next;
		free(temp);
	}
}

/*------------------------------------------------------------------*/
/*Main code to test linked list*/	
	
int main(void)
{
	
	/*int num_elements, i;*/
	char str[20];
	int i;
	
	Linked_List* char_list = create_empty_list();
	
	for(i=0;i<2;i++)
	{
		printf("Enter a word\n");
		scanf("%s", str);
		char_list->head = insert_end(char_list, str);
	}
	
	printf("The list is: ");
	display(char_list);
	printf("\n\n");
	
	
	free_list(char_list);
	
	return(0);
	
}

1 Ответов

Рейтинг:
2

OriginalGriff

Теперь самое время начать смотреть на то, что происходит во время выполнения кода! И мы не можем сделать это за вас, но у вас есть замечательный инструмент, который поможет вам сделать это: отладчик.

Отладчик позволяет выполнять код медленно, так что вы можете изучить переменные и посмотреть на содержимое, а также понять, почему он делает то, что делает.

Начните с рассмотрения того, что делает ваш код и чем он отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поставить точку останова на строке:
display(char_list);

и запустите свое приложение. Когда отладчик достигнет этой строки, он остановится и даст вам управление. Посмотрите на свой список: что в нем содержится? Похоже ли, что он содержит нужное количество элементов в правильном порядке? Все ли струны, которые вы ожидали там найти? Если это так, то, вероятно, проблема заключается в функции печати. Если нет, то это код построения списка - так что остановите отладку, переместите точку останова на более раннюю и посмотрите, почему список построен неправильно.

Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Я не могу дать вам явных инструкций о том, как устанавливать точки останова, одноступенчатый код и так далее, потому что я понятия не имею, какую IDE вы используете, но быстрый поиск Google "отладчика" И ВАШЕГО ИМЕНИ IDE найдет вам то, что вам нужно.

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!
Дайте ему попробовать, и посмотреть, что вы можете узнать!