107 lines
3.3 KiB
C++
Executable File
107 lines
3.3 KiB
C++
Executable File
/*************************************************
|
|
* ADS Praktikum 1.1
|
|
* Ring.cpp
|
|
* Erweiterung um Hilfsfunktionen gestattet.
|
|
*************************************************/
|
|
// Ring .cpp
|
|
#include "Ring.h"
|
|
#include <iostream>
|
|
|
|
Ring::Ring() {
|
|
m_anker = nullptr;
|
|
m_countNodes = 0;
|
|
};
|
|
|
|
void Ring::addNewNode(std::string Beschreibung, std::string Data) {
|
|
RingNode* newNode = new RingNode(0, Beschreibung, Data);
|
|
|
|
// Fall 1 Ring ist leer
|
|
if (m_countNodes == 0) {
|
|
m_anker = newNode;
|
|
newNode->setNext(m_anker);
|
|
m_anker->setNext(newNode);
|
|
m_countNodes++;
|
|
}
|
|
|
|
// Fall 2 Ring ist nut teilweise voll
|
|
else if (m_countNodes != 6) {
|
|
RingNode* ptr = m_anker->getNext();
|
|
|
|
newNode->setNext(m_anker->getNext());
|
|
m_anker->setNext(newNode);
|
|
m_anker = newNode;
|
|
m_countNodes++;
|
|
|
|
if (m_countNodes == 1)
|
|
m_anker->setOldAge(m_anker->getOldAge() + 1);
|
|
else {
|
|
while (ptr != m_anker) {
|
|
ptr->setOldAge(ptr->getOldAge() + 1);
|
|
ptr = ptr->getNext();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Fall 3 Ring ist voll
|
|
else if (m_countNodes == 6) {
|
|
RingNode* nodeAge5 = m_anker->getNext();
|
|
newNode->setNext(nodeAge5->getNext());
|
|
m_anker->setNext(newNode);
|
|
delete nodeAge5;
|
|
m_anker = newNode;
|
|
|
|
RingNode* ptr = m_anker->getNext();
|
|
while (ptr != m_anker) {
|
|
ptr->setOldAge(ptr->getOldAge() + 1);
|
|
ptr = ptr->getNext();
|
|
}
|
|
}
|
|
};
|
|
|
|
bool Ring::search(std::string Data) {
|
|
if (m_anker != nullptr) {
|
|
// Fängt beim letzten/ältesten Knoten in der Liste an
|
|
RingNode* ptr = m_anker->getNext();
|
|
|
|
while (ptr->getNext() != m_anker->getNext() && ptr->getSymbolicData() != Data)
|
|
ptr = ptr->getNext();
|
|
|
|
if (ptr->getSymbolicData() == Data)
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
else return false;
|
|
}
|
|
|
|
void Ring::printNode(std::string Data) {
|
|
if (search(Data)) {
|
|
// Fangen beim ältesten Knoten an
|
|
RingNode* ptr = m_anker->getNext();
|
|
|
|
// kein doppeltes Durchlaufen und Data stimmt nicht überein
|
|
while (ptr->getNext() != m_anker->getNext() && ptr->getSymbolicData() != Data)
|
|
ptr = ptr->getNext();
|
|
|
|
// die while Schleife wird abgebrochen werden, da Data übereinstimmt. Data muss vorhanden sein da if(search(data) == true)
|
|
std::cout << "+ Gefunden in Backup: ";
|
|
std::cout << "Alter " << ptr->getOldAge() << ", Beschreibung: " << ptr->getDescription() << ", Daten: " << ptr->getSymbolicData() << std::endl;
|
|
}
|
|
else
|
|
std::cout << "+ Datensatz konnte nicht gefunden werden." << std::endl;
|
|
}
|
|
|
|
void Ring::print() {
|
|
std::cout << std::endl;
|
|
// Zählt den Knoten der ausgegeben werden soll
|
|
for (int i = 0; i < m_countNodes; i++) {
|
|
RingNode* tempNode = m_anker;
|
|
// geht bis zu diesem
|
|
for (int j = 0; j < m_countNodes - i; j++) {
|
|
tempNode = tempNode->getNext();
|
|
}
|
|
std::cout << "Alter " << tempNode->getOldAge() << ", Beschreibung: " << tempNode->getDescription() << ", Daten: " << tempNode->getSymbolicData() << std::endl
|
|
<< "-------------------------------" << std::endl;
|
|
}
|
|
std::cout << std::endl;
|
|
}; |