Официальный сайт студ.городка НГТУ
Программирование и БД » [C++] Помогите доделать программу 

#1  15.06.07 13:37

[C++] Помогите доделать программу

напишите прогу, в которой класс iq, представляющий очереди целых чисел, содержит конструктор и две рабочие функции-добавление и извлечение из очереди. Фунуция main() должна создать два объекта класса, правильно присвоить один из них другому и показать, что оба объекта имеют одинаковое содержимое.
Я уже написал 2 рабочие функции, как написать конструктор копирования и создать два объекта класса, правильно присвоить один из них другому и показать, что оба объекта имеют одинаковое содержимое?
Первая программа основная, а вторая (List.h) вспомогательная.

Код: C++:

#include "d:\List.h"
#include<iostream.h>
#include<conio.h>
 
template<class T>
void testQueue(Queue <T> &q)
{
 int choice;
 T val;
 menuQueue();
 do {
    cout <<"?";
    cin >> choice;
switch (choice) {
  case 1:  cout <<"Input number:";
	   cin >> val;
	   q.enqueue(val);
	   q.print();
	   break;
  case 2:  if(q.dequeue(val))
	    cout << val <<"is deleted" << endl;
	   q.print();
	   break;
	  }
     } while (choice!=3);
}
 
void menuQueue()
{
 cout  <<"1-enqueue()" << endl   // помещает элемент в очередь
       <<"2-dequeue()" << endl    // извлекает элемент из очереди
       <<"3-exit()" << endl << endl;
}
 
int main()
{ clrscr();
  cout << "Queue of integer numbers:" << endl << endl;
  Queue<int>intQueue;
  testQueue(intQueue);
  getch();
  return 0;
}

Код: C++:

//List.h
 
 
# include <iostream.h>
# include <assert.h>
template <class T>
class List;
template <class T>
class Node {
   friend class List <T>;	//класс-друг
private:
   T data;      	//элемент данных узла
   Node *next;     	//указатель на следующий узел
public:
   Node(T &);		//конструктор с параметром
   T getData();   	//чтение элемента данных узла
};
template <class T>
Node <T> :: Node(T &d)
{ 
   data = d; 
   next = NULL; 
}
template <class T>
T Node <T> :: getData() 
{ 
   return data;
}
 
template <class T>
class List {
   Node <T> *first;         	//указатель на первый узел
   Node <T> *last;         	//указатель на последний узел
   Node <T> *newNode(T &);  	// указатель на новый узел
public:
   List();				//конструктор 
   ~List();				//деструктор
   void addHead(T &);      	//добавляет узел в начало списка
   void addTail(T &);      	//добавляет узел в конец списка
   int removeHead(T &);    	//удаляет узел из начала списка
   int removeTail(T &);    	//удаляет узел из конца списка
   int isEmpty();          	//проверяет, пуст ли список
   void print();            	//печатает содержимое списка
};
template <class T>
List <T> :: List()
{ 
   first = last = NULL; 
}
template <class T>
List <T> :: ~List()
{
   if(!isEmpty()) {       		//если список не пуст
 
      Node <T> *curr = first;		//указатель на текущий узел
      Node <T> *temp;     		//указатель на удаляемый узел
      cout << endl << "Deletion of nodes:" << endl;
      while(curr != NULL) { 		//пока не конец списка
         temp = curr;			//запомнить удаляемый узел
         curr = curr->next;		//обновить текущий узел
	 cout << temp->data << ' ';	//печать удаляемого узла
         delete temp;			//удалить узел
      }
   }
   cout << endl << "All nodes are deleted" << endl;
}
template <class T>
void List <T> :: addHead(T &val)
{
   Node <T> *newPtr = newNode(val);	//создать новый узел
   if(isEmpty())         		//если список пуст
      first = last = newPtr;		//вставить в пустой список
   else {						//если список не пуст
      newPtr->next = first;		//вставить в начало списка 
      first = newPtr;
   }
}
template <class T>
void List <T> :: addTail(T &val)
{
   Node <T> *newPtr = newNode(val);	//создать новый узел
   if(isEmpty())      			//если список пуст
      first = last = newPtr;		//вставить в пустой список
   else {						//если список не пуст
      last->next = newPtr; 		//вставить в конец списка
      last = newPtr;
   }
}
template <class T>
int List <T> :: removeHead(T &val)
{
   if(isEmpty())  				//если список пуст
      return 0;   				//неудачное удаление
   else {						//если список не пуст
      Node <T> *temp = first;		//запомнить удаляемый узел
      if(first == last) 			//если конец списка
	 first = last = NULL;		//сделать список пустым
      else					//если не конец списка
         first = first->next;		//обновить первый узел
      val = temp->data;			//передать элемент данных
      delete temp;				//удалить узел
      return 1;				//успешное удаление
   }
}
template <class T>
int List <T> :: removeTail(T &val)
{
   if(isEmpty())        			//если список пуст
      return 0;         			//неудачное удаление
   else {						//если список не пуст
      Node <T> *temp = last;		//запомнить удаляемый узел
      if(first == last)			//если конец списка
         first = last = NULL; 	//сделать список пустым
      else {					//если не конец списка
         Node <T> *curr = first;	//сделать текущим первый узел 
         while (curr->next != last)	//сделать текущим
            curr = curr->next;		//предпоследний узел 
         last = curr;			//обновить последний узел
         curr->next = NULL;
      }
      val = temp->data; 			//передать элемент данных
      delete temp;				//удалить узел
      return 1;         			//успешное удаление
   }
}
template <class T>
int List <T> :: isEmpty() 
{ 
   return first == NULL;		//возвратить NULL, если список пуст
}
template <class T>
Node <T> *List <T> :: newNode(T &val)
{
   Node <T> *p = new Node <T> (val);	//создать новый узел
   assert(p != NULL);
   return p;
}
template <class T>
void List <T> :: print() 
{
   if(isEmpty()) {
      cout << "List is empty" << endl << endl;
      return;
   }
   Node <T> *curr = first;		//сделать текущим первый узел
   cout << "List:" << endl;
   while (curr != NULL) 			//пока список не пуст	
   {
      cout << curr->data << " -> ";	//напечатать текущий узел
      curr = curr->next;				//обновить текущий узел 
   }
   cout << endl << endl;
}
 
template <class T>
class Queue: public List <T> {
public:
   void enqueue(T &d)		//помещает элемент в очередь
   {
      addTail(d);
   }
   int dequeue(T &d) 		//извлекает элемент из очереди
   {
      return removeHead(d);
   }
 
};

Offline

#2  15.06.07 20:31

Re: [C++] Помогите доделать программу

чтобы создать два объекта, нужно написать конструктор;
чтобы правильно присвоить объекты, нужно правильно переопределить операцию присваивания;
чтобы показать, что у объектов одинаковое содержимое, нужно вывести их на экран...
в класс Queue добавляешь:

Код: C++:

Queue(){
// код создания объекта
}
Queue( Queue& o ){
// код копирования
}
Queue &operator=(Queue& o)
		{
// код присваивания
		 return *this;
		}

а после этого:

Код: C++:

void main(){
Queue a;
Queue b(/*параметры создания*/);
a = b;
cout << a << endl;
cout << b << endl;
}

ну или как-то так...

Исправлено kvazimodo (15.06.07 21:25)

Offline

#3  15.06.07 22:02

Re: [C++] Помогите доделать программу

Спасибо, конечно...но мне как раз то и нужны :код создания объекта, код копирования,код присваивания. Напишите их, пожалуйста!

Offline

#4  16.06.07 01:51

Re: [C++] Помогите доделать программу

Конструкторы:

Код: C++:

Queue(){
 first = last =NULL;
}
Queue( T val ){
 enquewe( val );
}
Queue( T mas[], int sz ){
 for(int i = 0; i<sz; i++) enqueue( mas[i] );
}

Исправлено kvazimodo (16.06.07 01:57)

Offline

#5  16.06.07 01:56

Re: [C++] Помогите доделать программу

Конструктор копирования:

Код: C++:

Queue( Queue& o ){ 
 last = newnode( o.last->data );
 Node <T> *temp = first;
 for(; temp->next!=NULL; temp = temp->next) enqueue( newnode( temp->data )->data );
}

Исправлено kvazimodo (16.06.07 13:22)

Offline

#6  16.06.07 02:06

Re: [C++] Помогите доделать программу

Код: C++:

Queue &operator = (Queue& o){
  last = newnode( o.last->data );
 Node <T> *temp = first;
 for(; temp->next!=NULL; temp = temp->next) enqueue( newnode( temp->data )->data );
 return *this;
}

Исправлено kvazimodo (16.06.07 13:21)

Offline

#7  16.06.07 02:08

Re: [C++] Помогите доделать программу

не знаю, правильно или нет, но суть понять можно... если ошибся(вполне может быть) - поправьте.
если сам всё остальное писал, то должен уловить суть :)

Offline

Программирование и БД » [C++] Помогите доделать программу 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.467 сек.
Выполнено 11 запросов.