#include <iostream>
#include <string>
template <class NODETYPE>
class ListNode {
public:
ListNode(const NODETYPE &);
NODETYPE getData()const;
void SetNextPtr(ListNode<NODETYPE> * newPtr);
ListNode <NODETYPE>* GetNextPtr() const;
private:
NODETYPE data;
ListNode <NODETYPE> *nextPtr;
};
template<class NODETYPE>
ListNode <NODETYPE>::ListNode(const NODETYPE & info) : data(info), nextPtr(0) {}
template <class NODETYPE>
NODETYPE ListNode <NODETYPE>::getData()const { return data; }
template <class NODETYPE>
ListNode<NODETYPE> * ListNode <NODETYPE>::GetNextPtr()const { return nextPtr; }
template <class NODETYPE>
void ListNode <NODETYPE>::SetNextPtr(ListNode<NODETYPE> * newPtr) { nextPtr = newPtr; }
using std::cout;
template<class NODETYPE>
class List {
public:
List();
~List();
void insertAtFront(const NODETYPE &);
void insertAtBack(const NODETYPE &);
// bool removeFromFront(NODETYPE &);
// bool removeFromBack(NODETYPE &);
ListNode <NODETYPE>* GetLastPtr() const;
ListNode <NODETYPE>* GetFirstPtr() const;
bool isEmpty()const;
void print()const;
private:
ListNode <NODETYPE>* firstPtr;
//ListNode <NODETYPE>* lastPtr;
ListNode <NODETYPE>* getNewNode(const NODETYPE &);
};
//конструктор
template <class NODETYPE>
List<NODETYPE>::List() :firstPtr(0) {}
//деструктор
template<class NODETYPE>
List<NODETYPE>::~List() {
if (!isEmpty()) {
cout << "clear list....\n";
}
ListNode<NODETYPE> *currentPtr = firstPtr, *tempPtr;
while (currentPtr != 0)
{
tempPtr = currentPtr->GetNextPtr();
delete currentPtr;
currentPtr = tempPtr;
}
firstPtr = 0;
cout << "All nodes removed \n\n";
}
template <class NODETYPE>
ListNode <NODETYPE>* List<NODETYPE>::GetLastPtr() const
{
ListNode <NODETYPE>* current = firstPtr;
while (current->GetNextPtr() != NULL)
{
current = current->GetNextPtr();
}
return current;
}
template <class NODETYPE>
ListNode <NODETYPE>* List<NODETYPE>::GetFirstPtr() const
{
return firstPtr;
}
//вставить узел в начало списка
template <class NODETYPE>
void List<NODETYPE>::insertAtFront(const NODETYPE &value) {
ListNode<NODETYPE>* newPtr = getNewNode(value);
if (isEmpty()) {
firstPtr = newPtr;
}
else {
newPtr->nextPtr = firstPtr;
firstPtr = newPtr;
}
}
//вставить узел в конец списка
template <class NODETYPE>
void List<NODETYPE>::insertAtBack(const NODETYPE & value) {
ListNode<NODETYPE> *newPtr = getNewNode(value);
if (isEmpty()) {
firstPtr = newPtr;
}
else
{
ListNode <NODETYPE>* lastPtr = GetLastPtr();
lastPtr->SetNextPtr(newPtr);
}
}
//создание нового обекта ListNode
template <class NODETYPE>
ListNode<NODETYPE>*List<NODETYPE>::getNewNode(const NODETYPE & value) {
ListNode<NODETYPE> *ptr = new ListNode<NODETYPE>(value);
// assert(ptr != 0);
return ptr;
}
//проверка пуст ли список
template <class NODETYPE>
bool List<NODETYPE>::isEmpty()const {
return firstPtr == 0;
}
//печать списка
template<class NODETYPE>
void List<NODETYPE>::print()const {
if (isEmpty()) { cout << "Empty \n"; return; }
ListNode<NODETYPE>* tempPtr = firstPtr;
while (tempPtr != 0) {
std::cout << tempPtr->getData() << " ";
tempPtr = tempPtr->GetNextPtr();
}
cout << "\n\n";
}
// функция контенации
template<class NODETYPE>
void contenace(List<NODETYPE>& List1, List<NODETYPE>& List2) {
ListNode<NODETYPE>* lastPtr = List1.GetLastPtr();
lastPtr->SetNextPtr(List2.GetFirstPtr()); //получить доступ к указателю nextPtr последнего элемента списка List1 и присвоить ему указтле firstPtr списка List2;
}
int main() {
List<char> L1;
List<char>L2;
std::string st = "abcde";
for (int i = 0; i<5; i++) {
L1.insertAtBack(st[i]);
}
L1.print();
cout << "\n";
st = "fgjkl";
for (int i = 0; i < 5; i++) {
L2.insertAtBack(st[i]);
}
cout << "\n";
L2.print();
cout << " L1+L2 \n";
contenace<char>(L1, L2);
L1.print();
return 0;
}