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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2009, 19:44   #1
Napkin
Пользователь
 
Аватар для Napkin
 
Регистрация: 09.12.2009
Сообщений: 25
По умолчанию Просьба проверить грамотность и читабельность кода (c++)

Здравствуйте!
Суть задачи такова: реализовать шаблон класса стек на основе списка (контейнера) с использованием итератора (не STL). С этим проблем не возникло.. Единственное, хотелось бы узнать оценку кода людей более опытных. Буду очень признателен за указание на недочеты, возможно ошибки, а так же за советы по оформлению..

вот, собственно, листинг хеадера, где описаны классы List (непосредственно сам контейнер),а так же класс Iterator:

Код:
#ifndef List_h
#define List_h

template <typename TYPE> class Iterator;
template <class TYPE> 
class List
{
	friend class Iterator<TYPE>;
	class Node //узел списка (элемент контейнера)
	{
	public:
		Node *next; //указатель на следующий узел списка
		Node *prev; //указатель на предыдущий узел списка
		TYPE data; //информация, хранящаяся в узле 
		Node(){}
		Node(TYPE info):data(info){} 
		~Node(){}
	};
	Node *frontPtr; //указатель на начало списка
	Node *backPtr; //указатель на конец списка
public:
	List() //конструктор по умолчанию
	{
		frontPtr = backPtr = NULL;
	}
	~List()
	{
		Node *n = frontPtr; //удаляемый узел
		for(Node *current = frontPtr; current!=backPtr; )
		{
			current = current->next;
			delete n;
			n = current;
		}
		delete n;
		
	}
	bool isEmpty() //проверка списка на наличие каких-либо элементов
	{
		return frontPtr == 0;
	}
	void insertAtFront(TYPE info) //добавление узла в начало списка
	{
		cout << "insertAtFront" << endl;
		Node *newNode = new Node(info);
		if(isEmpty())
		{
			frontPtr = backPtr = newNode;
			frontPtr->next=0;
			frontPtr->prev=0;
			backPtr->next=0;
			backPtr->prev=0;
		}
		else 
		{
			newNode->next = frontPtr;
			newNode->prev = 0;
			frontPtr->prev = newNode;
			frontPtr = newNode;
		}
	}
	void insertAtBack(TYPE info) //добавление узла в конец списка
	{
		Node *newNode = new Node(info);
		if(isEmpty())
			frontPtr = backPtr = newNode;
			
		else
		{
			backPtr->next = newNode;
			newNode->prev = backPtr;
			newNode->next = 0;
			backPtr = newNode;
		}
	}
	void print()
	{
		if(isEmpty())
		{
			cout << "Список пуст" << endl;
			return;
		}
		Node *current = frontPtr;
		cout << "Список:" << endl;
		while(current!=0)
		{
			if(current == backPtr) 
			{
				cout << current->data;
				cout << endl;
				return;
			}
			cout << current->data << endl;
			current = current->next;
		}			
	} 
	void removeFromFront() //удаление первого узла из списка
	{
		if(isEmpty())
		{
			cout << "\nНевозможно удалить узел, стек пуст. " << endl;
			return;
		}
		else
		{
			if(frontPtr==backPtr)
				frontPtr = backPtr = NULL;
			else
			{
				frontPtr = frontPtr->next;
				frontPtr->prev = 0;
			}
		}
		return;
	}
	void removeFromBack() //удаление последнего узла из списка
	{
		if(isEmpty())
		{
			cout << "\nНевозможно удалить узел, стек пуст. " << endl;
			return;
		}
		else 
		{
			if(frontPtr==backPtr)
				frontPtr = backPtr = NULL;
			else
			{
				Node *currentPtr = frontPtr;
				while(currentPtr->next!=backPtr)
				currentPtr = currentPtr->next;
				backPtr = currentPtr;
				currentPtr->next = NULL;
			}
		}
	}
	Iterator<TYPE> begin() 
	{ 
		return Iterator<TYPE>(frontPtr);
	}

	Iterator<TYPE> end() 
	{
		return Iterator<TYPE>(backPtr);
	}
};

template <typename TYPE>
class Iterator
{
	friend class List<TYPE>;
	typedef typename List<TYPE>::Node nodeType;
	nodeType* ptr;
	Iterator(nodeType* pointer) : ptr(pointer) {}
public:
	Iterator(const Iterator& Iter) : ptr(Iter.ptr) {}
	Iterator &operator = (const Iterator &Iter)
	{
		ptr = Iter.ptr;
		return *this;
	}
	bool operator==(const Iterator &Iter)
	{
		return (ptr==Iter.ptr);
	}
	bool operator!=(const Iterator &Iter)
	{
		return !(*this==Iter);
	}
	Iterator &operator++()
	{
		if(ptr == 0)
			throw "Выполнение операции недопустимо (контейенер пуст)";
		if(ptr->next == 0)
			throw "Выполнение операции недопустимо (нахождение в последнем элементе контейнера)";
		nodeType *p=ptr;
		ptr = ptr->next;
		ptr->prev = p;
		return *this;
	}
	Iterator &operator--()
	{
		if(ptr == 0)
			throw "Выполнение операции недопустимо (контейенер пуст)";
		if(ptr->prev == 0)
			throw "Выполнение операции недопустимо (нахождение в первом элементе контейнера)";
		ptr = ptr->prev;
		return *this;
	}

	TYPE &operator*()
	{
		if(ptr == 0)
			throw "Выполнение операции недопустимо (контейенер пуст)";
		else return ptr->data;
	}
};

#endif
Удел сильных - уделывать слабых
Napkin вне форума Ответить с цитированием
Старый 13.12.2009, 20:28   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

В логику не всматривался, но, если мой глаз меня не подвёл, то в Вашем классе будет утечка памяти Вы освобождаете память в деструкторе, но забываете об этом в ф-циях removeFromFront() и removeFromBack().
Для исключений я бы посоветовал сделать свой класс, наследующийся от std::exception, перехватывать char* некошерно
В insertAtFront у Вас два раза обнуляются одни и те же элементы )
netrino вне форума Ответить с цитированием
Старый 13.12.2009, 21:35   #3
Napkin
Пользователь
 
Аватар для Napkin
 
Регистрация: 09.12.2009
Сообщений: 25
По умолчанию

Упс, действительно)) Спасибо, даже и не заметил как-то этих глупостей.
Удел сильных - уделывать слабых
Napkin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Просьба объяснения выделенных строк кода проги... Roman Charming Общие вопросы Delphi 5 19.06.2009 07:00
Просьба Neymexa Помощь студентам 2 27.01.2009 17:25
просьба Aivar Софт 1 03.09.2008 23:46
Просьба проверить решения заданий Ci_novice Общие вопросы C/C++ 1 02.02.2008 13:53
Выдернуть куски кода из html-кода trafbite Помощь студентам 7 18.08.2007 13:51