Logo Studenta

Actividad de Aprendizaje 09 Lista simplemente ligada - Fernando Cesar Sandoval Padilla

¡Este material tiene más páginas!

Vista previa del material en texto

UNIVERSIDAD DE GUADALAJARA 
Centro Universitario de Ciencias Exactas e Ingenierías 
 
Estructura de datos I 
Actividad de Aprendizaje 09. Lista simplemente ligada 
 
 
 
 
 
 
Alumno: Sandoval Padilla Fernando Cesar 
Docente: Gutiérrez Hernández Alfredo 
Código: 215685409 
Sección: D12 
 
 
 
 
 
 
 
 
 20 de Octubre de 2019 
Resumen personal: 
La realización de esta actividad fue bastante sencilla, ya que gran parte del modelo de la lista 
fue tomado de lo que se vio en clase, entonces realmente no fue difícil implementarla al main 
pues estaba bastante sencilla por lo que el único inconveniente fue el tener que hacer tantos 
recorridos por las condicionales y por los tipos de métodos a implementar. 
Código fuente: 
main.cpp 
1 #include <iostream> 
2 #include <stdlib.h> 
3 #include <string> 
4 #include "List.h" 
5 #include "Songs.h" 
6 using namespace std; 
7 int main() { 
8 setlocale(LC_ALL,"spanish"); 
9 List<Songs> myList; 
10 Songs mySong; 
11 Songs aux; 
12 string myStr; 
13 List<Songs>::Node* pos; 
14 char op; 
15 cout << "Bienvenido al programa" << endl; 
16 do { 
17 system("cls"); 
18 if(!myList.isEmpty()){ 
19 cout << myList.toString() << endl; 
20 } 
21 cout << "----------------Menu----------------" << endl; 
22 cout << "1) Añadir cancion" << endl; 
23 cout << "2) Eliminar cancion" << endl; 
24 cout << "3) Buscar cancion" <<endl; 
25 cout << "4) Otras opciones" << endl; 
26 cout << "5) Salir" << endl; 
27 cout << "Ingresa una opcion" << endl; 
28 cin >> op; 
29 op = toupper(op); 
30 switch(op) { 
31 case '1': 
32 cout << "Ingresa el nombre de la cancion" << endl << ">> "; 
33 cin.ignore(); 
34 getline(cin,myStr); 
35 mySong.setSongName(myStr); 
36 cout << "Ingresa el nombre del autor" << endl << ">> "; 
37 getline(cin,myStr); 
38 mySong.setSongAutor(myStr); 
39 cout << "Ingresa la posicion en el ranking" << endl << ">> "; 
40 getline(cin,myStr); 
41 mySong.setSongRanking(myStr); 
42 try { 
43 pos = myList.getFirstPos(); 
44 myList.insertData(pos,mySong); 
45 } 
46 catch(List<Songs>::Exception ex) { 
47 cout << ex.what() << endl; 
48 } 
49 break; 
50 case '2': 
51 cout << "Ingresa el nombre de la cancion " << endl << ">> "; 
52 cin.ignore(); 
53 getline(cin,myStr); 
54 aux.setSongName(myStr); 
55 pos = myList.findData(aux); 
56 try{ 
57 myList.deleteData(pos); 
58 } 
59 catch(List<Songs>::Exception ex){ 
60 cout << ex.what() << endl; 
61 } 
62 system("pause"); 
63 break; 
64 
65 case '3': 
66 cout << "Ingresa el nombre de la cancion " << endl << ">> "; 
67 cin.ignore(); 
68 getline(cin,myStr); 
69 aux.setSongName(myStr); 
70 pos = myList.findData(aux); 
71 if( pos != nullptr ){ 
72 cout << myList.retrieve(pos); 
73 } 
74 else{ 
75 cout << "No se encontro la cancion..." << endl; 
76 } 
77 system("pause"); 
78 break; 
79 system("pause"); 
80 
81 case '4': 
82 int other; 
83 cout<<"1.-Primer elemento: "<<endl; 
84 cout<<"2.-Ultimo elemento: "<<endl; 
85 cout<<"3.-Elemento anterior: "<<endl; 
86 cout<<"4.-Siguiente elemento: "<<endl; 
87 cout<<"5.-Eliminar todo: "<<endl; 
88 cin>>other; 
89 if (other==1) 
90 { 
91 if(myList.isEmpty()){ 
92 cout << "La lista esta vacia" << endl; 
93 } 
94 else{ 
95 cout << myList.retrieve(myList.getFirstPos()); 
96 } 
97 system("pause"); 
98 } 
99 if (other==2) 
100 { 
101 if(myList.isEmpty()){ 
102 cout << "La lista esta vacia" << endl; 
103 } 
104 else{ 
105 cout << myList.retrieve(myList.getLastPos()); 
106 } 
107 system("pause"); 
108 } 
109 
110 if (other==3) 
111 { 
112 if(!myList.isEmpty()){ 
113 cout << "Ingresa el nombre de la cancion " << endl; 
114 cin.ignore(); 
115 getline(cin,myStr); 
116 aux.setSongName(myStr); 
117 pos = myList.findData(aux); 
118 cout << myList.retrieve(myList.getPrevPos(pos)); 
119 } 
120 else{ 
121 cout << "La lista esta vacia" << endl; 
122 } 
123 system("pause"); 
124 } 
125 if (other==4) 
126 { 
127 if(!myList.isEmpty()){ 
128 cout << "Ingresa el nombre de la cancion " << endl; 
129 cin.ignore(); 
130 getline(cin,myStr); 
131 aux.setSongName(myStr); 
132 pos = myList.findData(aux); 
133 cout << myList.retrieve(myList.getNextPos(pos)); 
134 } 
135 else{ 
136 cout << "La lista esta vacia" << endl; 
137 } 
138 system("pause"); 
139 } 
140 if (other==5) 
141 { 
142 char myAux; 
143 cout << "Estas seguro de eliminar todo? [S/N] "<< endl << ">> "; 
144 do{ 
145 cin >> myAux; 
146 myAux = toupper(myAux); 
147 if(myAux == 'S'){ 
148 myList.deleteAll(); 
149 } 
150 } while( myAux != 'S' and myAux != 'N' ); 
151 break; 
152 case '5': 
153 cout << "Nos vemos..." << endl; 
154 } 
155 break; 
156 default: 
157 cout << "Ingresaste una opcion incorrecta " << endl << endl; 
158 break; 
159 } 
160 } 
161 while( op != '5' ); 
162 return 0; 
163 } 
List.h 
1 #ifndef LIST_H_INCLUDED 
2 #define LIST_H_INCLUDED 
3 
4 #include <string> 
5 #include <exception> 
6 
7 ///Definicion 
8 
9 template <class T> 
10 class List 
11 { 
12 public:///Ultima opcion 
13 ///class Node; 
14 class Node 
15 { 
16 private: 
17 T data; 
18 Node* next; 
19 
20 public: 
21 Node(); 
22 Node(const T&); 
23 
24 T& getData(); 
25 Node* getNext() const; 
26 
27 void setData(const T&); 
28 void setNext(Node*); 
29 }; 
30 
31 class Exception: public std::exception 
32 { 
33 private: 
34 std::string msg; 
35 
36 public: 
37 explicit Exception(const char* message) : msg(message) { } 
38 
39 explicit Exception(const std::string& message) : msg(message) { } 
40 
41 virtual ~Exception() throw () { } 
42 
43 virtual const char* what() const throw () { 
44 return msg.c_str(); 
45 } 
46 }; 
47 
48 private: 
49 Node* anchor; 
50 
51 bool isValidPos(Node*); 
52 
53 void copyAll(const List&); 
54 
55 public: 
56 
57 List(); 
58 List(const List&); 
59 
60 ~List(); 
61 
62 bool isEmpty() const; 
63 
64 void insertData(Node*, const T&); 
65 void deleteData(Node*); 
66 
67 Node* getFirstPos() const; 
68 Node* getLastPos() const; 
69 Node* getPrevPos(Node*) const; 
70 Node* getNextPos(Node*) const; 
71 
72 Node* findData(const T&) const; 
73 
74 T& retrieve(Node*); 
75 
76 std::string toString() const; 
77 
78 void deleteAll(); 
79 
80 List& operator = (const List&); 
81 }; 
82 
83 ///Implementacion 
84 
85 using namespace std; 
86 
87 ///Node 
88 
89 template <class T> 
90 List<T>::Node::Node() : next(nullptr) { } 
91 
92 template <class T> 
93 List<T>::Node::Node(const T& e) : data(e), next(nullptr) { } 
94 
95 template <class T> 
96 T& List<T>::Node::getData() 
97 { 
98 return data; 
99 } 
100 
101 template <class T> 
102 typename List<T>::Node* List<T>::Node::getNext() const 
103 { 
104 return next; 
105 } 
106 
107 template <class T> 
108 void List<T>::Node::setData(const T& e) 
109 { 
110 data = e; 
111 } 
112 
113 template <class T> 
114 void List<T>::Node::setNext(List<T>::Node* p) 
115 { 
116 next = p; 
117 } 
118 
119 ///List 
120 
121 template <class T> 
122 bool List<T>::isValidPos(List<T>::Node* p) 
123 { 
124 if(isEmpty()){ 
125 return false; 
126 } 
127 
128 Node* aux(anchor); 
129 
130 do 
131 { 
132 if(aux == p) 
133 { 
134 return true; 
135 } 
136 
137 aux = aux->getNext(); 
138 }while(aux != anchor); 
139 
140 return false; 
141 } 
142 
143 template <class T> 
144 void List<T>::copyAll(const List<T>& l) 
145 { 
146 if(l.isEmpty()){ 
147 return; 
148 } 
149 
150 Node* aux(l.anchor); 
151 Node* lastInserted(nullptr); 
152 Node* newNode; 
153 do{ 
154 newNode = new Node(aux->getData()); 
155 
156 if(newNode == nullptr) 
157 { 
158 throw Exception("Memoria no disponible, copyAll"); 
159 } 
160 
161 if(lastInserted == nullptr) 
162 { 
163 anchor = newNode; 
164 } 
165 else 
166 { 
167 lastInserted->setNext(newNode); 
168 } 
169 
170 lastInserted = newNode; 
171 
172 aux = aux->getNext(); 
173 }while(aux!= l.anchor); 
174 
175 lastInserted->setNext(anchor); 
176 } 
177 
178 template <class T> 
179 List<T>::List() : anchor(nullptr) { } 
180 
181 template <class T> 
182 List<T>::List(const List<T>& l) : anchor(nullptr) 
183 { 
184 copyAll(l); 
185 } 
186 
187 template <class T> 
188 List<T>::~List() 
189 { 
190 deleteAll(); 
191 } 
192 
193 template <class T> 
194 List<T>& List<T>::operator = (const List<T>& l) 
195 { 
196 deleteAll(); 
197 
198 copyAll(l); 
199 
200 return *this; 
201 } 
202 
203 template <class T> 
204 bool List<T>::isEmpty() const 
205 { 
206 return anchor == nullptr; 
207 } 
208 
209 template <class T> 
210 void List<T>::insertData(List<T>::Node* p, const T& e) 
211 { 
212 if(p != nullptr and !isValidPos(p)) 
213 { 
214 throw Exception(" Posicion invalida, insertData"); 
215 } 
216 
217 Node* aux(new Node(e)); 
218 
219 if(aux == nullptr) 
220 { 
221 throw Exception(" Memoria no disponible, insertData"); 
222 } 
223 
224 if(p == nullptr) 
225 {///Insertar al principio 
226 if(isEmpty()){///Inserta el primer elemento 
227 aux->setNext(aux); 
228 } 
229 else{///Hay más de un elemento 
230 aux->setNext(anchor); 
231 
232 getLastPos()->setNext(aux); 
233 } 
234 
235 anchor = aux; 
236 } 
237 else 
238 {///Insertar en cualquier otra posicion 
239 aux->setNext(p->getNext()); 
240 
241 p->setNext(aux); 
242 } 
243 } 
244 
245 template <class T> 
246 void List<T>::deleteData(List<T>::Node* p) 
247 { 
248 if(!isValidPos(p)) 
249 { 
250 throw Exception(" Posicion invalida, deleteData."); 
251 } 
252 
253 if(p == anchor) 
254 {///Eliminar el primero 
255 if(p->getNext() == p){///Esta solito 
256 anchor = nullptr; 
257 } 
258 else{///Hay más de un elemento 
259 getLastPos()->setNext(anchor->getNext()); 
260 } 
261 } 
262 else 
263 {///Eliminar cualquiera otro 
264 getPrevPos(p)->setNext(p->getNext()); 
265 } 
266 
267 delete p; 
268 } 
269 
270 template <class T> 
271 typename List<T>::Node* List<T>::getFirstPos() const 
272 { 
273 return anchor; 
274 } 
275 
276 template <class T> 
277 typename List<T>::Node* List<T>::getLastPos() const 
278 { 
279 if(isEmpty()) 
280 { 
281 return nullptr; 
282 } 
283 
284 Node* aux(anchor); 
285 
286 while(aux->getNext() != anchor) 
287 { 
288 aux = aux->getNext(); 
289 } 
290 
291 return aux; 
292 } 
293 
294 template <class T> 
295 typename List<T>::Node* List<T>::getPrevPos(List<T>::Node* p) const 
296 { 
297 /*if(isEmpty() or p->getNext() == anchor) 
298 { 
299 return nullptr; 
300 }*/ 
301 if(isEmpty()){ 
302 return nullptr; 
303 } 
304 
305 Node* aux(anchor); 
306 
307 do 
308 { 
309 if(aux->getNext() == p){ 
310 return aux; 
311 } 
312 
313 aux = aux->getNext(); 
314 }while(aux != anchor); 
315 
316 return nullptr; 
317 } 
318 
319 template <class T> 
320 typename List<T>::Node* List<T>::getNextPos(List<T>::Node* p) const 
321 { 
322 /*if(!isValidPos(p) or p->getNext() == anchor) 
323 { 
324 return nullptr; 
325 }*/ 
326 
327 return p->getNext(); 
328 } 
329 
330 template <class T> 
331 typename List<T>::Node* List<T>::findData(const T& e) const 
332 { 
333 if(isEmpty()){ 
334 return nullptr; 
335 } 
336 
337 Node* aux(anchor); 
338 do{ 
339 if(aux->getData() == e){ 
340 return aux; 
341 } 
342 
343 aux = aux->getNext(); 
344 }while(aux != anchor); 
345 
346 return nullptr; 
347 } 
348 
349 template <class T> 
350 T& List<T>::retrieve(List<T>::Node* p) 
351 { 
352 if(!isValidPos(p)) 
353 { 
354 throw Exception(" Posicion invalida, retireve"); 
355 } 
356 
357 return p->getData(); 
358 } 
359 
360 template <class T> 
361 std::string List<T>::toString() const 
362 { 
363 
364 std::string result; 
365 
366 if(!isEmpty()){ 
367 Node* aux(anchor); 
368 do{ 
369 result += aux->getData().toString() + "\n"; 
370 
371 aux = aux->getNext(); 
372 }while(aux != anchor); 
373 } 
374 
375 return result; 
376 } 
377 
378 template <class T> 
379 void List<T>::deleteAll() 
380 { 
381 if(isEmpty()){ 
382 return; 
383 } 
384 
385 Node* mark(anchor); 
386 Node* aux; 
387 
388 do{ 
389 aux = anchor; 
390 
391 anchor = anchor->getNext(); 
392 
393 delete aux; 
394 }while(anchor != mark); 
395 
396 anchor = nullptr; 
397 } 
398 
399 #endif // LIST_H_INCLUDED 
400 
Songs.h 
1 #ifndef SONGS_H 
2 #define SONGS_H 
3 
4 #include <iostream> 
5 #include <string> 
6 class Songs { 
7 private: 
8 std::string SongName; 
9 std::string SongAutor; 
10 std::string SongRanking; 
11 public: 
12 void setSongName(const std::string&); 
13 void setSongAutor(const std::string&); 
14 void setSongRanking(const std::string&); 
15 std::string toString() const; 
16 std::string getSongName() const; 
17 std::string getSongAutor() const; 
18 std::string getSongRanking() 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 bool operator < (const Songs&) const; 
25 friend std::ostream& operator << (std::ostream&, Songs&); 
26 friend std::istream& operator >> (std::istream&, Songs&); 
27 }; 
28 
29 #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 
 
Opcion 4 
 
Opción 1 
 
Opción 2 
 
Opción 3 
 
Opción 4 
 
Opcion 5

Otros materiales