Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2021, 18:09   #1
Alexandrietz
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 15
По умолчанию Реализация односвязного списка на основе структуры.

Выкладываю код создания односвязного списка в С++ на основе структуры. Ошибка в том, что сам указатель tail всегда nullptr, и не добавляются никакие элементы. Прошу помочь.

OList.h
Код:
#include <iostream>

template <typename T>
class OList
{
public:
	struct Node
	{
		T elem;
		Node* next;
	};
	Node* tail = nullptr;
	int size = 0;

	OList(T data);

	void Add(T data);
	void Delete(T data);
	void Show();
	bool IsEmpty();
	int GetSize();

	~OList();
};
OList.cpp
Код:
#include "OList.h"
#include <iostream>

using namespace std;

template <class T> OList<T>::OList(T data)
{
	if (tail == nullptr)
	{
		Node* tail = new Node();
		tail -> next = nullptr;
		tail -> elem = data;
		size++;
	}
}

template<typename T>
void OList<T>::Add(T data)
{
	if(tail != nullptr)
	{
		Node* new_node = new Node();
		Node* auxilary_node = tail;

		while (auxilary_node -> next != nullptr)
		{
			auxilary_node = auxilary_node -> next;
		}
		auxilary_node -> next = new_node;
		new_node -> next = nullptr;
		new_node -> elem = data;
		auxilary_node = nullptr;
		size++;
	}
}

template<typename T>
void OList<T>::Delete(T data)
{
	if (tail != nullptr)
	{
		Node* auxilary_node = new Node();
		auxilary_node = tail;
		bool flag = false;

		while (auxilary_node -> next != nullptr && !flag)
		{
			if (auxilary_node -> elem == data)
			{
				flag = true;
			}
			if (!flag)
			{
				auxilary_node = auxilary_node -> next;
			}
		}

		if (flag)
		{
			if (auxilary_node == tail)
			{
				tail = tail -> next;
				auxilary_node = nullptr;
			}
			else
			{
				Node* pre_auxilary_node = new Node;

				pre_auxilary_node = tail;
				while (pre_auxilary_node -> next != auxilary_node)
				{
					pre_auxilary_node = pre_auxilary_node -> next;
				}

				if (auxilary_node -> next == nullptr)
				{
					pre_auxilary_node -> next = nullptr;
				}
				else
				{
					pre_auxilary_node -> next = auxilary_node -> next;
				}
				pre_auxilary_node = nullptr;
			}

			size--;
		}
	}
}

template<typename T>
void OList<T>::Show()
{
	if (tail != nullptr)
	{
		Node* auxilary_node = tail;

		cout << "Значения списка: ";
		while (auxilary_node != nullptr);
		{
			cout << auxilary_node -> elem << " ";
			auxilary_node = auxilary_node -> next;
		}
		cout << endl;

		auxilary_node = nullptr;
	}
}

template<typename T>
bool OList<T>::IsEmpty()
{
	return tail == nullptr;
}

template<typename T>
int OList<T>::GetSize()
{
	return size;
}

template<typename T>
OList<T>::~OList()
{
	while (tail != nullptr)
	{
		Node* node = tail -> next;
		delete tail;
		tail = node;
		size--;
	}
}
Source.cpp
Код:
#include <iostream>
#include <locale.h>
#include <cstdio>
#include <fstream>
#include "OList.cpp"

using namespace std;

int main(int argc, char* argv[])
{
	ifstream file("file.txt");
	int size;

	setlocale(LC_ALL, "Rus");

	if (argc < 1)
	{
		cout << "Недостаточное число аргументов командной строки." << endl;
		return 0;
	}

	if (file.bad())
	{
		cout << "Файла не существует в директории проекта." << endl;
		return 0;
	}
	else
	{
		if (!file.is_open()) { cout << "Файл не открывается." << endl; return 0; }
		else if (file.peek() == EOF) { cout << "Файл пуст." << endl; return 0; }
		else
		{
			file >> size;
			file.close();

			OList<int> A(1);
			for (int i = 0; i < size - 1; i++)
			{
				A.Add(i + 2);
			}
			for (int i = 0; i < size; i++)
			{
				cout << "Пуст ли список? " << boolalpha << A.IsEmpty() << "." << " ";
				cout << "Размер односвязного списка: " << A.GetSize() << "." << " ";
				A.Show();
				A.Delete(i);
			}
		}
	}

	return 0;
}
Результат такой:
Изображения
Тип файла: png Screenshot_3.png (16.1 Кб, 1 просмотров)

Последний раз редактировалось Alexandrietz; 30.11.2021 в 18:35.
Alexandrietz вне форума Ответить с цитированием
Старый 30.11.2021, 18:17   #2
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

А где вы tail что-либо присваиваете, кроме nullptr?
ForenLi вне форума Ответить с цитированием
Старый 30.11.2021, 18:47   #3
Alexandrietz
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 15
По умолчанию

ForenLi,
Я новичок, но я сделал tail, через которого потом я создаю другие элементы односвязного списка, а он по идее должен указывать на самый первый элемент списка, но какого-то фига он NULL.
Alexandrietz вне форума Ответить с цитированием
Старый 30.11.2021, 18:55   #4
Alexandrietz
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 15
По умолчанию

ForenLi,
Кажется, я понял, в чём моя ошибка.
Alexandrietz вне форума Ответить с цитированием
Старый 30.11.2021, 19:02   #5
Alexandrietz
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 15
По умолчанию

ForenLi, Переделал список, как бы делая его с конца.
Код:
template<typename T>
void OList<T>::Add(T data)
{
	if(tail != nullptr)
	{
		Node* new_node = new Node();
		new_node -> next = tail;
		new_node -> elem = data;
		size++;
		tail = new_node;
	}
}
Но при отладке всё равно получается, что
Код:
tail == nullptr    // true
Alexandrietz вне форума Ответить с цитированием
Старый 30.11.2021, 19:09   #6
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

Вы читайте, что пишите... Вы tail изменяете, если он != nullptr
ForenLi вне форума Ответить с цитированием
Старый 30.11.2021, 19:15   #7
Alexandrietz
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 15
По умолчанию

ForenLi, Ну, так я же его инициализирую в конструкторе, разве нет?
Alexandrietz вне форума Ответить с цитированием
Старый 30.11.2021, 19:20   #8
ForenLi
Форумчанин
 
Регистрация: 02.06.2021
Сообщений: 515
По умолчанию

1. Предупреждайте, что поменяли стартовый пост или код весь изменненый пишите
2.
Код:
Node* tail = new Node();
Это создание новой переменной. Этот tail и "классовый" разные вещи.
ForenLi вне форума Ответить с цитированием
Старый 30.11.2021, 19:26   #9
Alexandrietz
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 15
По умолчанию

ForenLi,
"Это создание новой переменной. Этот tail и "классовый" разные вещи."
Тогда я понял свою ошибку. Я априори думал, что это два одинаковых "tail". От этого и все ошибки. Благодарю.
Alexandrietz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В чем отличие односвязного списка от кольцевого односвязного списка? Yudin Общие вопросы C/C++ 3 08.06.2018 17:07
Структуры на основе линейного списка Михаил06 Visual C++ 0 02.05.2013 20:00
СИ. Списки. Описание структуры односвязного списка Jane-sad Помощь студентам 9 17.05.2010 14:40
Сортировка односвязного списка btf Общие вопросы C/C++ 0 15.02.2010 14:40
Cортировка односвязного списка alesfoss Общие вопросы C/C++ 3 30.03.2009 19:46