Создание Шаблона Класса С++

  • Автор темы inek
  • Дата начала
I

inek

Гость
#1
Добрый вечер! Помогите, пожалуйста, начинающей программистке решить следующую задачу:
Разработать шаблон класса для работы с однонаправленным некольцевым списком. Реализовать следующие действия:
-добавление звена в начало списка;
-удаление звена из начала списка;
-добавление звена в произвольное место списка, отличное от начала (например, после звена, указатель на которое задан);
-удаление звена из произвольного места списка, отличного от начала (например, после звена, указатель на которое задан);
-проверка, пуст ли список;
-очистка списка;
-формирование списка;
-печать списка.
Составить программу, которая формирует список L включив в него по одному разу элементы, которые входят в один из списков L1 и L2, но в то же время не входит в другой из них.

Все действия реализовала, а вот как составить метод формирования списка L не могу сообразить. Вот шаблон, разработанный мной:

C++:
#include <iostream>

using namespace std;

template <typename T>
class List
{
struct Node
{
T data;
Node *next;
Node(T d, Node *n = 0):data(d), next(n) {}
};
Node *head;
public:
List(Node *h = 0):head(h){}
~List();
bool isEmpty();
void insertAfter(Node *pre, T d);
void removeAfter(Node *pre);
void pushFront(T d);
T popFront();
void print();
Node *search(T d);
void removeDuplicate();
void create(int k);
};

template <typename T>
List<T>::~List()
{
while (!isEmpty())
popFront();
}

template <typename T>
bool List<T>::isEmpty() 
{
return !head;
}

template <typename T>
void List<T>::insertAfter(Node *pre, T d) 
{ 
if(!pre) return;
Node *newNode = new Node(d,0);
newNode->next = pre->next;
pre->next = newNode;
}

template <typename T>
void List<T>::removeAfter(Node *pre)
{
if (!pre || !pre->next) return;
Node *tmp = pre->next; 
pre->next = pre->next->next;
delete tmp;
}

template <typename T>
void List<T>:: pushFront(T d)
{
Node *newNode = new Node(d,0);
if(!head) {
head = newNode;
return;
}
newNode->next = head;
head = newNode;
}

template <typename T>
T List<T>:: popFront()
{
T data;				 
if(!head) return data;
Node *tmp = head;
data = head->data;
if(head->next) {
head = head->next;
delete tmp;
return data;
}
delete tmp;
head = NULL;
return data;
}

template <typename T>
typename List<T>::Node* List<T>::search(T d)
{
if(!head) return NULL;
Node* cur = head;
while(cur) {
if(cur->data == d) return cur;
cur = cur->next;
}
return NULL;
}


template <typename T>
void List<T>:: print()
{
if(!head) return;
Node *cur = head;
while(cur) {
cout << cur->data << "; ";
cur = cur->next;
}
cout << endl;
}

template <typename T>
void List<T>::create(int k)
{
T d;
for (int i = 1; i <= k; i++)
{
cout << "Enter " << i << "-i element: ";
cin >> d;
pushFront(d);

}
}
Работаю в DEV C++ (так требует препод).
 

Whatka

Well-Known Member
09.10.2011
428
4
#2
у вас есть объявление функций описание которых отсутствует!
вот как реализовать
C++:
//
List A(a);
List B(b);
int c=a+b;
List C(c);
for(int i=0;i<a;i++)
C.pushFront(A.popFront());
for(int i=0;i<b;i++)
C.pushFront(B.popFront());
removeDuplicate(C);
//
вот функция удаления повторов
НО!!! для вашего класса её надо немного изменить ))
C++:
//
void removeDuplicate(List &С,int c)
{
int t=c;
for(int a,i=0;i<t;i++)
{
a=С.front();//функция front это popFront,но не удаляющая элемент!
С.popFront();
for(int b,j=0;j<t-1;j++)
{
if(a==С.front())
С.popFront();
else 
{
b=C.front();
С.popFront();
С.push_back(b);
}
}
С.push_back(a);
}
}
//
 
I

inek

Гость
#3
у вас есть объявление функций описание которых отсутствует!
вот как реализовать
//
List A(a);
List B:));
int c=a+b;
List C©;
for(int i=0;i<a;i++)
C.pushFront(A.popFront());
for(int i=0;i<b;i++)
C.pushFront(B.popFront());
removeDuplicate©;
//


int c=a+b; - нужно добавить метод сложения двух списков? Будет ли это работать для всех типов данных как просится в задаче?


вот так я объявляю два списка:
C++:
	List<string> *L1 = new List<string>(NULL);
L1->create(7);
L1->print();

List<string> *L2 = new List<string>(NULL);
L2->create(7);
L2->print();
из них нужно сделать третий L3...