ED
unknown
plain_text
3 years ago
9.6 kB
13
Indexable
#include <iostream> #include <string> using namespace std; typedef struct DNODE* PDNODE; typedef struct DNODE { string sNombre; int sFrec; PDNODE sNext; PDNODE sPrev; }; class DList { protected: PDNODE aHead; PDNODE aTail; PDNODE aCurr; bool pForce; bool aFrec; public: DList(void); ~DList(void); void clean(void); void push_front(string pNombre); void push_back(string pNombre); void push(string pNombre); void repr(bool pRev= false); PDNODE top_front(void); PDNODE top_back(void); PDNODE get(bool pRev=false); void pop_front(void); void pop_back(void); void del(string pNombre, bool pForce); bool isEmpty(void); private: PDNODE getNewNode(string pNombre); PDNODE search(string pNombre); PDNODE find(string pNombre); }; DList::DList(void) { aHead = NULL; aTail = NULL; aCurr = NULL; aFrec = true; pForce = false; } //Constructor DList::~DList(void) { clean(); } //Destructor void DList::clean(void) { while (aHead) { PDNODE lTemp = aHead->sNext; delete aHead; aHead = lTemp; } aHead = NULL; aTail = NULL; } //clean void DList::push_front(string pNombre) { if (aHead == NULL) { aHead = getNewNode(pNombre); aTail = aHead; } else { if(aFrec){ PDNODE lItem = find(pNombre); if(lItem){ aHead->sFrec++; }else{ PDNODE lTemp = getNewNode(pNombre); lTemp->sNext = aHead; aHead->sPrev = lTemp; aHead = lTemp; } }else { PDNODE lTemp = getNewNode(pNombre); lTemp->sNext = aHead; aHead->sPrev = lTemp; aHead = lTemp; } } } //push front void DList::push_back(string pNombre) { if (aHead == NULL) { aHead = getNewNode(pNombre); aTail = aHead; } else { if(aFrec){ PDNODE lItem = find(pNombre); if(lItem){ aTail->sFrec++; }else{ PDNODE lTemp = getNewNode(pNombre); aTail->sNext = lTemp; lTemp->sPrev = aTail; aTail = lTemp; } }else { PDNODE lTemp = getNewNode(pNombre); aTail->sNext = lTemp; lTemp->sPrev = aTail; aTail = lTemp; } } } //push back void DList::push(string pNombre) { if (aHead == NULL) { aHead = getNewNode(pNombre); aTail = aHead; } else { if (pNombre <= aHead->sNombre) { push_front(pNombre); } else { if (pNombre >= aTail->sNombre) { push_back(pNombre); } else { if(aFrec){ PDNODE lIQ = find(pNombre); if(lIQ){ lIQ->sFrec++; }else { PDNODE lItem = search(pNombre); if (lItem) { PDNODE lTemp = getNewNode(pNombre); lTemp->sNext = lItem; lTemp->sPrev = lItem->sPrev; lItem->sPrev->sNext = lTemp; lItem->sPrev = lTemp; } } }else { PDNODE lItem = search(pNombre); if (lItem) { PDNODE lTemp = getNewNode(pNombre); lTemp->sNext = lItem; lTemp->sPrev = lItem->sPrev; lItem->sPrev->sNext = lTemp; lItem->sPrev = lTemp; } } } } } }//push PDNODE DList::top_front(void) { if (aHead) { return aHead; } return NULL; }// top back PDNODE DList::top_back(void) { if (aHead) { return aTail; } return NULL; } //top back PDNODE DList::get(bool pRev) { PDNODE lTemp = NULL; if (aHead) { if (aCurr == NULL) aCurr = (pRev ==false ? aHead: aTail); else aCurr = (pRev == false ? aCurr->sNext: aCurr->sPrev); lTemp = aCurr; } return lTemp; }//get void DList::pop_front(void) { if (aHead) { PDNODE lTemp = aHead->sNext; //guarda la dirección del siguiente antes de hacer el delete bool lEqual = (aHead == aCurr); delete aHead; aHead = lTemp; if (aHead == NULL) //significa que teniamos un unico nodo { aTail = NULL; //aTail no existe aCurr = NULL; } else { aHead->sPrev = NULL; //ya no tiene nada atrás entonces se vuelve nulo aCurr = (lEqual ? aHead : aCurr); // si pasa igual, se mueve al nuevo head, sino se queda donde esta } } } //pop front void DList::pop_back(void) { if (aHead) { PDNODE lTemp = aTail->sPrev; //guarda la dirección del anterior antes de hacer el delete bool lEqual = (aTail == aCurr); delete aTail; aTail = lTemp; if (aTail == NULL) //significa que teniamos un unico nodo { aHead == NULL; //aHead no existe aCurr = NULL; } else { aTail->sNext = NULL; //ya no tiene nada adelante entonces se vuelve nulo aCurr = (lEqual ? aTail : aCurr); // si pasa algo se mueve al tail nuevo, sino se queda donde esta } } } //pop back PDNODE DList::getNewNode(string pNombre) { PDNODE lTemp = new DNODE; if (lTemp) { lTemp->sNombre = pNombre; lTemp->sFrec = 1; lTemp->sNext = NULL; lTemp->sPrev = NULL; } return lTemp; }// getnewnode bool DList::isEmpty(void) { return (aHead == NULL); }//isEmpty void DList::repr(bool pRev) { if (aHead) { PDNODE lTemp = (pRev== false ? aHead : aTail); while (lTemp) { if (aFrec) { for(int i = 0; i<lTemp->sFrec; i++){ cout << "-> " << lTemp->sNombre; } lTemp = (pRev == false ? lTemp->sNext : lTemp->sPrev); } else { cout << "-> " << lTemp->sNombre; lTemp = (pRev == false ? lTemp->sNext : lTemp->sPrev); } } cout << " ->||" << endl; } }//repr PDNODE DList::search(string pNombre) { PDNODE lTemp = aHead; while (lTemp) { if (pNombre <= lTemp->sNombre) { return lTemp; } lTemp = lTemp->sNext; } return NULL; } //Search PDNODE DList::find(string pNombre) { PDNODE lTemp = aHead; while (lTemp) { if (pNombre == lTemp->sNombre) { return lTemp; } lTemp = lTemp->sNext; } return NULL; } void DList::del(string pNombre, bool pForce) { if(aHead){ if(!pForce){ if(aFrec && aFrec>1) { PDNODE lIQ = find(pNombre); if (lIQ) { lIQ->sFrec--; }else { if (pNombre == aHead->sNombre) { pop_front(); } else { if (pNombre == aTail->sNombre) { pop_back(); } else { PDNODE lItem = find(pNombre); if (lItem) { lItem->sPrev->sNext = lItem->sNext; lItem->sNext->sPrev = lItem->sPrev; delete lItem; } } } } } }else { if (pNombre == aHead->sNombre) { pop_front(); } else { if (pNombre == aTail->sNombre) { pop_back(); } else { PDNODE lItem = find(pNombre); if (lItem) { lItem->sPrev->sNext = lItem->sNext; lItem->sNext->sPrev = lItem->sPrev; delete lItem; } } } } } } //Search int main() { DList lLista = DList(); lLista.push("Peter Parker"); lLista.push("Peter Parker"); lLista.push("Peter Parker"); lLista.push("Clark Kent"); lLista.push("Diana Prince"); lLista.push("Diana Prince"); lLista.push("Diana Prince"); lLista.push("007"); lLista.push("alice"); lLista.push("alice"); lLista.push("alice"); lLista.repr(true); //en codigo ASKI los numeros van primero, despues las mayusculas y despues las minusculas PDNODE lTemp = NULL; while ((lTemp = lLista.get(true))) { cout << "Nom: " << lTemp->sNombre << endl; } lLista.repr(false); lLista.del("alice",true); cout<<"------"<<endl; lLista.repr(true); /* PDNODE lPtr = lLista.top_front(); if (lPtr) { cout << "1ero: " << lPtr->sNombre << endl; } lLista.pop_front(); lLista.repr(); lLista.pop_back(); lLista.repr(); while (! lLista.isEmpty()) { lLista.pop_front(); } lLista.repr(); */ }
Editor is loading...