Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
UNIVERSIDAD DE GUADALAJARA Centro Universitario de Ciencias Exactas e Ingenierías Estructura de datos I Actividad de Aprendizaje 10. La lista implementación dinámica doblemente ligada Alumno: Sandoval Padilla Fernando Cesar Docente: Gutiérrez Hernández Alfredo Código: 215685409 Sección: D12 02 de Noviembre de 2019 Resumen personal: Básicamente la realización de esta actividad fue sencilla y solo se tuvo que intercambiar lo lineal de la lista anterior y tomar en cuenta que siempre hay un anterior a cada nodo, además la sobrecarga es la misma, el programa solo cambia por el encapsulamiento. Código fuente: main.cpp 1 #include <iostream> 2 #include <conio.h> 3 #include <cstdlib> 4 #include <cctype> 5 #include <cstdio> 6 #include <string> 7 #include "songs.h" 8 #include "list.h" 9 using namespace std; 10 int main() { 11 List<Songs> myLista; 12 Songs c; 13 List<Songs>::Node* pos; 14 string myStr; 15 int op,op2; 16 char opc,opc2; 17 do { 18 cout<<"###Lista de canciones###"<<endl; 19 cout << myLista.toString() << endl; 20 cout<<endl; 21 cout<<"####Bienvenido al menu del album####"<<endl<<endl; 22 cout<<"1. Insertar cancion"<<endl; 23 cout<<"2. Eliminar cancion"<<endl; 24 cout<<"3. Buscar una cancion (lineal)"<<endl; 25 cout<<"4. Otras opciones" <<endl; 26 cout<<"5. Salir"<<endl; 27 cout<<"Seleccione una opcion:"; 28 cin>>op; 29 cin.get(); 30 switch(op) { 31 case 1: 32 do { 33 cout << endl; 34 cout << " ####INSERTAR CANCION#### "<<endl; 35 cout << " Nombre de la cancion: "<<endl; 36 getline(cin,myStr); 37 c.setSongName(myStr); 38 cout << "Nombre del interprete:" << endl; 39 getline(cin, myStr); 40 c.setSongAutor(myStr); 41 cout << "Ranking de la cancion (1-10):" << endl; 42 cin>>myStr; 43 c.setSongRanking(myStr); 44 try { 45 pos = myLista.getLastPos(); 46 myLista.insertData(pos, c); 47 } 48 catch (List<Songs>::Exception ex) { 49 cout << ex.what() << endl; 50 break; 51 } 52 cout << endl << " cancion insertada exitosamente" << endl << endl; 53 do { 54 cout << " Insertar otro? (S/N): "; 55 cin >> opc; 56 cin.ignore(); 57 opc = toupper(opc); 58 } 59 while(opc != 'S' and opc != 'N'); 60 } 61 while(opc == 'S'); 62 cout << endl << endl; 63 system("pause"); 64 system("cls"); 65 break; 66 case 2: 67 cout << " ####ELIMINAR CANCION#### "<<endl; 68 cout << "Nombre de la cancion a eliminar:" << endl; 69 getline(cin, myStr); 70 c.setSongName(myStr); 71 pos = myLista.findData(c); 72 try { 73 myLista.deleteData(pos); 74 } 75 catch (List<Songs>::Exception ex) { 76 cout << ex.what() << endl; 77 } 78 cout << "Cancion Eliminada con exito!!" << endl; 79 system("pause"); 80 system("cls"); 81 break; 82 case 3: 83 cout << " ####BUSCAR CANCION (LINEAL)#### "<<endl; 84 cout << "Nombre de la cancion a buscar:" << endl; 85 getline(cin,myStr); 86 c.setSongName(myStr); 87 pos = myLista.findData(c); 88 cout<<myLista.retrieve(pos).toString()<<endl; 89 cout<<endl; 90 system("pause"); 91 system("cls"); 92 break; 93 case 4: 94 cout<<"1. Mostrar primera cancion de la lista"<<endl; 95 cout<<"2. Mostrar ultima cancion de la lista"<<endl; 96 cout<<"3. Mostrar cancion anterior"<<endl; 97 cout<<"4. Mostrar cancion siguiente"<<endl; 98 cout<<"5. Eliminar todo"<<endl; 99 cout<<"Seleccione una opcion"<<endl; 100 cin>>op2; 101 switch (op2) 102 { 103 case 1: 104 cout << " ####PRIMERA CANCION#### "<<endl; 105 cout << myLista.retrieve(myLista.getFirstPos()).toString() << endl; 106 cout<<endl; 107 system("pause"); 108 system("cls"); 109 break; 110 case 2: 111 cout << " ####ULTIMA CANCION#### "<<endl; 112 cout <<myLista.retrieve(myLista.getLastPos()).toString() << endl; 113 cout<<endl; 114 system("pause"); 115 system("cls"); 116 break; 117 case 3: 118 cout << " ####CANCION ANTERIOR#### "<<endl; 119 cout << "Nombre de la cancion para mostrar su anterior:" << endl; 120 getline(cin, myStr); 121 c.setSongName(myStr); 122 pos = myLista.findData(c); 123 try { 124 cout << myLista.retrieve(myLista.getPrevPos(pos)).toString() << endl; 125 cout<<endl; 126 } 127 catch (List<Songs>::Exception ex) { 128 cout << ex.what() << endl; 129 } 130 system("pause"); 131 system("cls"); 132 break; 133 case 4: 134 cout << " ####SIGUIENTE CANCION#### "<<endl; 135 cout << "Nombre de la cancion para mostrar su siguiente:" << endl; 136 getline(cin, myStr); 137 c.setSongName(myStr); 138 pos = myLista.findData(c); 139 try { 140 cout << myLista.retrieve(myLista.getNextPos(pos)).toString()<<endl; 141 } 142 catch (List<Songs>::Exception ex) { 143 cout << ex.what() << endl; 144 } 145 cout << endl; 146 system("pause"); 147 system("cls"); 148 break; 149 150 case 5: 151 cout << " ####ELIMINAR TODO#### "<<endl; 152 do { 153 cout << " Seguro de que desea eliminar todo? (S/N): "; 154 cin >> opc2; 155 cin.ignore(); 156 opc2 = toupper(opc2); 157 system("cls"); 158 } 159 while(opc2 != 'S' and opc2 != 'N'); 160 if(opc2 == 'S') { 161 try { 162 myLista.deleteAll(); 163 } 164 catch (List<Songs>::Exception ex) { 165 cout << ex.what() << endl; 166 } 167 } 168 cout<<"SE HA ELIMINADO TODO"<<endl; 169 system("pause"); 170 system("cls"); 171 break; 172 default: 173 cout<<"Opcion invalida, vuelva a intentarlo!!"<<endl; 174 } 175 case 5: 176 cout<<"Nos vemos!!"<<endl; 177 break; 178 default: 179 cout<<"Opcion invalida, vuelva a intentarlo!!"<<endl; 180 break; 181 } 182 } 183 while (op!=5); 184 return 0; 185 } List.h 1 #ifndef LIST_H_INCLUDED 2 #define LIST_H_INCLUDED 3 #include <string> 4 #include <exception> 5 ///Definicion 6 template <class T> 7 class List 8 { 9 public:///Ultima opcion 10 ///class Node; 11 class Node 12 { 13 private: 14 T data; 15 Node* next; 16 public: 17 Node(); 18 Node(const T&); 19 T& getData(); 20 Node* getNext() const; 21 void setData(const T&); 22 void setNext(Node*); 23 }; 24 class Exception: public std::exception 25 { 26 private: 27 std::string msg; 28 public: 29 explicit Exception(const char* message) : msg(message) { } 30 explicit Exception(const std::string& message) : msg(message) { } 31 virtual ~Exception() throw () { } 32 virtual const char* what() const throw () { 33 return msg.c_str(); 34 } 35 }; 36 private: 37 Node* anchor; 38 bool isValidPos(Node*); 39 void copyAll(const List&); 40 public: 41 List(); 42 List(const List&); 43 ~List(); 44 bool isEmpty() const; 45 void insertData(Node*, const T&); 46 void deleteData(Node*); 47 Node* getFirstPos() const; 48 Node* getLastPos() const; 49 Node* getPrevPos(Node*) const; 50 Node* getNextPos(Node*) const; 51 Node* findData(const T&) const; 52 T& retrieve(Node*); 53 std::string toString() const; 54 void deleteAll(); 55 List& operator = (const List&); 56 }; 57 ///Implementacion 58 using namespace std; 59 ///Node 60 template <class T> 61 List<T>::Node::Node() : next(nullptr) { } 62 template <class T> 63 List<T>::Node::Node(const T& e) : data(e), next(nullptr) { } 64 template <class T> 65 T& List<T>::Node::getData() 66 { 67 return data; 68 } 69 template <class T> 70 typename List<T>::Node* List<T>::Node::getNext() const 71 { 72 return next; 73 } 74 template <class T> 75 void List<T>::Node::setData(const T& e) 76 { 77 data = e; 78 } 79 template <class T> 80 void List<T>::Node::setNext(List<T>::Node* p) 81 { 82 next = p; 83 } 84 ///List 85 template <class T> 86 bool List<T>::isValidPos(List<T>::Node* p) 87 { 88 if(isEmpty()){ 89 return false; 90 } 91 Node* aux(anchor); 92 do 93 { 94 if(aux == p) 95 { 96 return true; 97 } 98 aux = aux->getNext(); 99 }while(aux != anchor); 100 return false; 101 } 102 template <class T> 103 void List<T>::copyAll(const List<T>& l) 104 { 105 if(l.isEmpty()){ 106 return; 107 } 108 Node* aux(l.anchor); 109 Node* lastInserted(nullptr); 110 Node* newNode; 111 do{ 112 newNode = new Node(aux->getData()); 113 if(newNode == nullptr) 114 { 115 throw Exception("Memoria no disponible, copyAll"); 116 } 117 if(lastInserted == nullptr) 118 { 119 anchor = newNode; 120 } 121 else 122 { 123 lastInserted->setNext(newNode); 124 } 125 lastInserted = newNode; 126 aux = aux->getNext(); 127 }while(aux != l.anchor); 128 lastInserted->setNext(anchor); 129 } 130 template <class T> 131 List<T>::List() : anchor(nullptr){ } 132 template <class T> 133 List<T>::List(const List<T>& l) : anchor(nullptr) 134 { 135 copyAll(l); 136 } 137 template <class T> 138 List<T>::~List() 139 { 140 deleteAll(); 141 } 142 template <class T> 143 List<T>& List<T>::operator = (const List<T>& l) 144 { 145 deleteAll(); 146 copyAll(l); 147 return *this; 148 } 149 template <class T> 150 bool List<T>::isEmpty() const 151 { 152 return anchor == nullptr; 153 } 154 template <class T> 155 void List<T>::insertData(List<T>::Node* p, const T& e) 156 { 157 if(p != nullptr and !isValidPos(p)) 158 { 159 throw Exception(" Posicion invalida, insertData"); 160 } 161 Node* aux(new Node(e)); 162 if(aux == nullptr) 163 { 164 throw Exception(" Memoria no disponible, insertData"); 165 } 166 if(p == nullptr) 167 {///Insertar al principio 168 if(isEmpty()){///Inserta el primer elemento 169 aux->setNext(aux); 170 } 171 else{///Hay más de un elemento 172 aux->setNext(anchor); 173 getLastPos()->setNext(aux); 174 } 175 anchor = aux; 176 } 177 else 178 {///Insertar en cualquier otra posicion 179 aux->setNext(p->getNext()); 180 p->setNext(aux); 181 } 182 } 183 template <class T> 184 void List<T>::deleteData(List<T>::Node* p) 185 { 186 if(!isValidPos(p)) 187 { 188 throw Exception(" Posicion invalida, deleteData."); 189 } 190 if(p == anchor) 191 {///Eliminar el primero 192 if(p->getNext() == p){///Esta solito 193 anchor = nullptr; 194 } 195 else{///Hay más de un elemento 196 getLastPos()->setNext(anchor->getNext()); 197 } 198 } 199 else 200 {///Eliminar cualquiera otro 201 getPrevPos(p)->setNext(p->getNext()); 202 } 203 delete p; 204 } 205 template <class T> 206 typename List<T>::Node* List<T>::getFirstPos() const 207 { 208 return anchor; 209 } 210 template <class T> 211 typename List<T>::Node* List<T>::getLastPos() const 212 { 213 if(isEmpty()) 214 { 215 return nullptr; 216 } 217 Node* aux(anchor); 218 while(aux->getNext() != anchor) 219 { 220 aux = aux->getNext(); 221 } 222 return aux; 223 } 224 template <class T> 225 typename List<T>::Node* List<T>::getPrevPos(List<T>::Node* p) const 226 { 227 /*if(isEmpty() or p->getNext() == anchor) 228 { 229 return nullptr; 230 }*/ 231 if(isEmpty()){ 232 return nullptr; 233 } 234 Node* aux(anchor); 235 do 236 { 237 if(aux->getNext() == p){ 238 return aux; 239 } 240 aux = aux->getNext(); 241 }while(aux != anchor); 242 return nullptr; 243 } 244 template <class T> 245 typename List<T>::Node* List<T>::getNextPos(List<T>::Node* p) const 246 { 247 /*if(!isValidPos(p) or p->getNext() == anchor) 248 { 249 return nullptr; 250 }*/ 251 return p->getNext(); 252 } 253 template <class T> 254 typename List<T>::Node* List<T>::findData(const T& e) const 255 { 256 if(isEmpty()){ 257 return nullptr; 258 } 259 Node* aux(anchor); 260 do{ 261 if(aux->getData() == e){ 262 return aux; 263 } 264 aux = aux->getNext(); 265 }while(aux != anchor); 266 return nullptr; 267 } 268 template <class T> 269 T& List<T>::retrieve(List<T>::Node* p) 270 { 271 if(!isValidPos(p)) 272 { 273 throw Exception(" Posicion invalida, retireve"); 274 } 275 return p->getData(); 276 } 277 template <class T> 278 std::string List<T>::toString() const 279 { 280 std::string result; 281 if(!isEmpty()){ 282 Node* aux(anchor); 283 do{ 284 result += aux->getData().toString() + "\n"; 285 aux = aux->getNext(); 286 }while(aux != anchor); 287 } 288 return result; 289 } 290 template <class T> 291 void List<T>::deleteAll() 292 { 293 if(isEmpty()){ 294 return; 295 } 296 Node* mark(anchor); 297 Node* aux; 298 do{ 299 aux = anchor; 300 anchor = anchor->getNext(); 301 delete aux; 302 }while(anchor != mark); 303 anchor = nullptr; 304 } 305 306 #endif // LIST_H_INCLUDED 307 Songs.h 1 #ifndef SONGS_H 2 #define SONGS_H 3 #include <iostream> 4 #include <string> 5 class Songs { 6 private: 7 std::string SongName; 8 std::string SongAutor; 9 std::string SongRanking; 10 public: 11 void setSongName(const std::string&); 12 void setSongAutor(const std::string&); 13 void setSongRanking(const std::string&); 14 std::string toString() const; 15 std::string getSongName() const; 16 std::string getSongAutor() const; 17 std::string getSongRanking() const; 18 bool operator == (const Songs&) const; 19 bool operator != (const Songs&) const; 20 bool operator >= (const Songs&) const; 21 bool operator > (const Songs&) const; 22 bool operator <= (const Songs&) const; 23 bool operator < (const Songs&) const; 24 friend std::ostream& operator << (std::ostream&, Songs&); 25 friend std::istream& operator >> (std::istream&, Songs&); 26 }; 27 28 #endif // SONGS_H Songs.cpp 1 #include "songs.h" 2 void Songs::setSongName(const std::string& Name) { 3 SongName = Name; 4 } 5 void Songs::setSongAutor(const std::string& Autor) { 6 SongAutor = Autor; 7 } 8 void Songs::setSongRanking(const std::string& Ranking) { 9 SongRanking = Ranking; 10 } 11 std::string Songs::toString() const { 12 std::string AllSong; 13 AllSong += SongName; 14 AllSong += " | "; 15 AllSong += SongAutor; 16 AllSong += " | "; 17 AllSong += SongRanking; 18 return AllSong; 19 } 20 std::string Songs::getSongName() const { 21 return SongName; 22 } 23 std::string Songs::getSongAutor() const { 24 return SongAutor; 25 } 26 std::string Songs::getSongRanking() const { 27 return SongRanking; 28 } 29 bool Songs::operator == (const Songs& Song) const { 30 return SongName == Song.SongName or SongAutor == Song.SongAutor; 31 } 32 bool Songs::operator != (const Songs& Song) const { 33 return SongName != Song.SongName or SongAutor != Song.SongAutor; 34 } 35 bool Songs::operator >= (const Songs& Song) const { 36 return SongName >= Song.SongName or SongAutor >= Song.SongAutor; 37 } 38 bool Songs::operator > (const Songs& Song) const { 39 return SongName > Song.SongName or SongAutor > Song.SongAutor; 40 } 41 bool Songs::operator <= (const Songs& Song) const { 42 return SongName <= Song.SongName or SongAutor <= Song.SongAutor; 43 } 44 bool Songs::operator < (const Songs& Song) const { 45 return SongName < Song.SongName or SongAutor < Song.SongAutor; 46 } 47 std::ostream& operator << (std::ostream& os, Songs& s){ 48 std::string aux; 49 aux = s.SongName + " | " + s.SongAutor + " | " + s.SongRanking + "\n"; 50 os << aux; 51 return os; 52 } 53 std::istream& operator >> (std::istream& is, Songs& s){ 54 is >> s.SongAutor; 55 is >> s.SongAutor; 56 is >> s.SongRanking; 57 return is; 58 } Capturas de pantalla: Menu Opción 1 Opción 2 Opción 3 Opción 4 Opción 1 Opción 2 Opción 3 Opción 4 Opción 5
Compartir