Files
ADS/P1/ADS_P1_1_Ringpuffer/Ring.cpp
2025-02-21 13:17:35 +01:00

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;
};