// СвСп.cpp: определяет точку входа для консольного приложения.
//
//#include "stdafx.h"
#include <iostream>
//#include <assert.h>
#include <cassert>
using namespace std;
// -->
template<typename>
class ListSpisok;
// <--
template <class NODETYPE>
class Spisok {
friend class ListSpisok<NODETYPE>;
public:
Spisok(const NODETYPE &);
NODETYPE getData() const { return data; }
private:
Spisok<NODETYPE> *nextPtr;
NODETYPE data;
};
template <class NODETYPE>
Spisok<NODETYPE>::Spisok(const NODETYPE &ch) {
data = ch;
nextPtr = 0;
}
template <class NODETYPE>
class ListSpisok {
public:
ListSpisok();
~ListSpisok();
void addInTheEnd(const NODETYPE &);
void addInTheBeginning(const NODETYPE &);
void removeInTheEnd(NODETYPE &);
void removeInTheBeginning(NODETYPE &);
int isEmpty() const;
void print() const;
private:
Spisok<NODETYPE> *firstPtr;
Spisok<NODETYPE> *lastPtr;
};
template <class NODETYPE>
ListSpisok<NODETYPE>::ListSpisok() { firstPtr = lastPtr = 0; }
template <class NODETYPE>
ListSpisok<NODETYPE>::~ListSpisok()
{
if (! isEmpty()) {
Spisok<NODETYPE> *currentPtr = firstPtr, *temp;
while (currentPtr != 0) {
temp = currentPtr;
currentPtr = currentPtr->nextPtr;
delete temp;
}
}
}
template <class NODETYPE>
void ListSpisok<NODETYPE>::addInTheEnd(const NODETYPE &ch)
{
Spisok<NODETYPE> *newPtr = new Spisok<NODETYPE>(ch);
assert(newPtr != 0);
if (isEmpty())
firstPtr = lastPtr = newPtr;
else {
lastPtr->nextPtr = newPtr;
lastPtr = newPtr;
}
}
template <class NODETYPE>
void ListSpisok<NODETYPE>::addInTheBeginning(const NODETYPE &ch)
{
Spisok<NODETYPE> *newPtr = new Spisok<NODETYPE>(ch);
assert(newPtr != 0);
if (isEmpty())
firstPtr = lastPtr = newPtr;
else {
newPtr->nextPtr = firstPtr;
firstPtr = newPtr;
}
}
template <class NODETYPE>
void ListSpisok<NODETYPE>::removeInTheEnd(NODETYPE &ch)
{
if (isEmpty())
return;
else {
ch = lastPtr->data;
if (firstPtr == lastPtr)
firstPtr = lastPtr = 0;
else {
Spisok<NODETYPE> *currentPtr = firstPtr, *tempPtr = lastPtr;
while (currentPtr->nextPtr != lastPtr)
currentPtr = currentPtr->nextPtr;
lastPtr = currentPtr;
lastPtr->nextPtr = 0;
delete tempPtr;
}
}
}
template <class NODETYPE>
void ListSpisok<NODETYPE>::removeInTheBeginning(NODETYPE &ch)
{
if (isEmpty())
return;
else {
Spisok<NODETYPE> *tempPtr = firstPtr;
if (firstPtr == lastPtr)
firstPtr = lastPtr = 0;
else
firstPtr = firstPtr->nextPtr;
ch = tempPtr->data;
delete tempPtr;
}
}
template <class NODETYPE>
int ListSpisok<NODETYPE>::isEmpty() const { return firstPtr == 0; }
template <class NODETYPE>
void ListSpisok<NODETYPE>::print() const
{
if (! isEmpty()) {
Spisok<NODETYPE> *current = firstPtr;
while (current != 0) {
cout << current->data << ' ';
current = current->nextPtr;
}
}
}
template <class NODETYPE>
void concatenate(ListSpisok<NODETYPE> &, ListSpisok<NODETYPE> &);
// int _tmain(int argc, _TCHAR* argv[])
int main()
{
// setlocale(LC_ALL, "Russian");
/* ListSpisok<char> first, second;
char ch;
first.addInTheEnd('a');
first.addInTheEnd('b');
second.addInTheEnd('c');
second.addInTheEnd('d');
concatenate(first, second);
first.print();*/
//system("pause");
return 0;
}
template <class NODETYPE>
void concatenate(ListSpisok<NODETYPE> &first, ListSpisok<NODETYPE> &second) {
NODETYPE temp;
while (! second.isEmpty()) {
second.removeInTheBeginning(temp);
first.addInTheEnd(temp);
}
}