@nait123321

Где ошибка в коде(Динамичные структуры данных)?

Здравствуйте, возникли проблемы с лабой.
Вот задание: Дано указатель Р3 на 3 элемент непустого списка. Продублировать в списке все элементы с парными значениями три раза и вывести 11 элемент преобразованого списка.
Вот мой код:
#include <stdlib.h>
#include <stdio.h>
#define N 10
struct TNode 
{
	int data; //  Інформаційний блок
	struct TNode *next; // Адресний блок
};
typedef struct TNode Node;// Створення власного типу
void CreateNode(Node** head, int d)
{
	Node *tmp = (Node*)malloc(sizeof(Node));// Виділення пам'яті під новий елемент
	tmp->data = d;//Запис інформації у новий елемент
	tmp->next = (*head); //Додавання елемента на початок списку
	(*head) = tmp;// Вказування на голову списку
}

int main()
{
	int t;
	Node *head = NULL; // Покажчик, що вказує на голову списку
	Node *head1 = NULL; // Покажчик, що вказує на голову списку
	Node *p1 = NULL; // Покажчик, що вказує на голову списку
	Node *p3 = NULL; // Покажчик, що вказує на голову списку
	for (int i = N; i >= 0; i--) // Цикл для створення N вузлів
	{
		CreateNode(&head, i);
	}

	head1 = head;
	p3 = head;
	printf("head=%d\n", head);
	printf("head1=%d\n", head1);
	printf("p2=%d\n", p3);
	for (int l = 0; l < 3;l++)
	{
		for (int i = 0; i <= N - 1; i++)
		{
			t = p3;
			if (t % 2 == 0)
			{
				Node *tmp = (Node*)malloc(sizeof(Node));
				p3->next = tmp;
				tmp->data = p3->data;
				tmp->next = NULL;
			}
			p3 = p3->next;
		}
	}
	while (head1) // Виведення результатів
	{
		printf("%d\n", head1->data);
		head1 = head1->next;
	}
	_getch();
	return 1;
}

Но при запуске получается вот так:
Hjr7e8IDx3E.jpg
В чем ошибка?
  • Вопрос задан
  • 215 просмотров
Пригласить эксперта
Ответы на вопрос 2
sfi0zy
@sfi0zy
Creative frontend developer
Не знаю каким вы компилятором это собираете, но gcc вполне авторитетно заявляет у вас вот тут
t = p3;
39:9: error: invalid conversion from 'Node* {aka TNode*}' to 'int' [-fpermissive]
что в некотором смысле соответствует
error: cast from 'Node* {aka TNode*}' to 'int' loses precision [-fpermissive]
что как бы намекает на не совсем определенное поведение этого самого t в случае если это все-таки как-то скомпилировать.
Ответ написан
@abcd0x00
/**/
      if (t % 2 == 0)
      {
        Node *tmp = (Node*)malloc(sizeof(Node));
        p3->next = tmp;
        tmp->data = p3->data;
        tmp->next = NULL;
      }

Тут утечка памяти. Когда ты делаешь p3->next = tmp , бесследно пропадает указатель, который был в p3->next .
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы