Kolejka na szablonach.

0

Witam. Czy ktoś może sprawdzić czy mam dobrze napisaną metodę "empty" i destruktor ?? Jakby ktoś by znalazł jakiś błąd w implementacji kolejki to też bym był wdzięczny za wszelkie uwagi.

 
#include<iostream>
#include<stdexcept>

using namespace std;

template <class T>
class QUEUE
{
	struct node
	{
		T data;
		node *next;
		node(T x)
		{
			data: x;
			next = NULL;
				}		
	};
	
	typedef node * pnode;
	pnode head,tail;
	public:
	QUEUE();
	bool empty()const // czy to jest też dobrze napisane ?? 
	{
		return head == NULL;
	}

	void put(T);
	T get();
	~QUEUE(); 
};

template<class T>

QUEUE<T>::QUEUE()
{
	head = NULL;
}

template <class T>
void QUEUE<T>::put (T x)
{
	if (empty())
	head = tail = new node(x);
	else
	{
		pnode pom = tail;
		tail = new node(x);
		pom ->next =tail; 
	}
}

template<class T>
T QUEUE<T>::get()
{
	if (empty())
	throw out_of_range ("Kolejka pusta");
	T temp = head -> data;
	pnode stara = head;
	head = head -> next;
	delete stara;
	return temp;
}

template <class T> // Czy destruktor jest dobrze napisany ??
QUEUE<T>::~QUEUE()
{
	while(head != NULL)
	get();
}

int main()
{
	
	system("pause");
	return 0;
}
0

Wygląda OK.

1

Pierwszy raz widzę coś takiego

data: x;

Czy może mnie ktoś oświecić, jak to działa?

EDIT: A, już wiem, to jest label :)

Poprawnie powinno być tak:

node(const T &x): data(x), next(NULL)
{
}

Żeby wywołać system trzeba dołączyć <cstdlib>.

0

@DRK
To nie jest label, to pole bitowe.
To jest label :P
Poza tym stawianie labelów bez goto byłoby bez sensu.

0

Kosmetyka trochę, ale może nullptr zamiast NULL?

0

A jak można wyświetlić zawartość kolejki ?? Wyświetla mi się tylko adresy, a nie wiem jak się dobrać do zawartości tych adresów.

    template <class T>
 		void QUEUE<T>::wypisz()const
 	{ pnode pomoc=head;
 			while(pomoc != NULL)
 			{	
 			cout<<pomoc->data<<endl;
 			pomoc=pomoc->next;
 	
			 }
		 }

int main()
{
   QUEUE<int> kolejka;
   cout<<endl;
   cout<<"Czy kolejka pusta: "<<kolejka.empty()<<endl;
   kolejka.put(5);
  cout<<"Czy kolejka pusta: "<<kolejka.empty()<<endl;
kolejka.put(10);
kolejka.put(15);
kolejka.put(11);
kolejka.put(4);
kolejka.put(3);
kolejka.put(2);
kolejka.put(1);
kolejka.put(7);
kolejka.put(8);
kolejka.put(21);
cout<<endl;
kolejka.wypisz();
cout<<endl;
    system("pause");
    return 0;
}
 
0

Przecież dobrze wyświetla: http://ideone.com/wG5Qui
Czy na pewno wprowadziłeś poprawkę, którą wskazałem Ci w moim poprzednim poście?

0

Ok. Działa.
A jak można złapać ten wyjątek??

throw out_of_range ("Kolejka pusta");
try 
{ 	

throw out_of_range ("Kolejka pusta"); 
}
	catch (exception & e )
	{ 
	cout<<e.what()<<endl;
	}			 

Działa ale nadal wyskakuje mi wyjątek.

0

Powinno być tak:

try 
{
    kolejka.get();
}
catch (exception & e )
{ 
    cout<<e.what()<<endl;
}

Wyjątek zostanie rzucony, gdy kolejka.empty()==true.

1 użytkowników online, w tym zalogowanych: 0, gości: 1