Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Beginner Web en 31 Agosto 2018, 20:25 pm



Título: Ayuda con listas sinples
Publicado por: Beginner Web en 31 Agosto 2018, 20:25 pm
Hola amig@s queria que me ayudaran a entender como sucede la magia en este fragmento que acabo de hacer entiendo lista de forma generica pero hay cosas que no me cierran como la sintaxis de C++ en listas y otras cosillas, desde  ya muchas gracias  ;-)

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. typedef struct tnodo *pnodo;
  7. typedef struct tnodo{
  8. int dato;
  9. pnodo sig;
  10. };
  11.  
  12. void inicia(pnodo &lista);
  13. void crear(pnodo &nuevo);
  14. void agregar_inicio(pnodo &lista, pnodo nuevo);
  15. void agregar_final(pnodo &lista, pnodo nuevo);
  16. void agregar_orden(pnodo &lista, pnodo nuevo);
  17. pnodo quitar_inicio(pnodo &lista);
  18. pnodo quitar_final(pnodo &lista);
  19. pnodo quitar_nodo(pnodo &lista, int valor);
  20. bool buscar_nodo(pnodo lista,int valor);
  21. void mostrar(pnodo lista);
  22.  
  23. int main()
  24. {
  25. pnodo milista, nuevonodo, eliminado;
  26. int opcion, num;
  27. inicia(milista);
  28. do{
  29. system("cls");
  30. cout << "1. Iniciar lista" << endl;
  31. cout << "2. Agregar al inicio" << endl;
  32. cout << "3. Agregar al final" << endl;
  33. cout << "4. Agregar en orden" << endl;
  34. cout << "5. Quitar al inicio" << endl;
  35. cout << "6. Quitar al final" << endl;
  36. cout << "7. Quitar valor" << endl;
  37. cout << "8. Buscar valor" << endl;
  38. cout << "9. Mostrar lista" << endl;
  39. cout << "10. Salir" << endl;
  40. cin >> opcion;
  41. switch(opcion){
  42. case 1: inicia(milista); break;
  43. case 2: crear(nuevonodo); if(nuevonodo!=NULL){agregar_inicio(milista,nuevonodo);}; break;
  44. case 3: crear(nuevonodo); if(nuevonodo!=NULL){agregar_inicio(milista,nuevonodo);}; break;
  45. case 4: crear(nuevonodo); if(nuevonodo!=NULL){agregar_orden(milista,nuevonodo);}; break;
  46. case 5: eliminado=quitar_inicio(milista);
  47. if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl;delete(eliminado);}
  48. else{cout << "LISTA VACIA O NO EXISTE VALOR" << endl;}; break;
  49. case 6: eliminado=quitar_final(milista);
  50. if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl;delete(eliminado);}
  51. else{cout << "LISTA VACIA O NO EXISTE VALOR" << endl;}; break;
  52. case 7: cout << "Igrese valor a eliminar: "; cin >> num; eliminado=quitar_nodo(milista,num);
  53. if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl; delete(eliminado);}
  54. else{ cout << "LISTA VACIA O NO EXISTE VALOR" << endl;}; break;
  55. case 8: cout << "Ingrese valor buscado: "; cin >> num;
  56. if(buscar_nodo(milista,num)==true){cout << "VALOR ENCONTRADO" << endl;}
  57. else{ cout << "LISTA VACIA O NO EXISTE VALOR" << endl;}; break;
  58. case 9: cout << "*** LISTA ***" << endl; mostrar(milista); break;
  59. case 10: cout << "FIN DEL  PROGRAMA" << endl; break;
  60. default: cout << "Opcion incorrecta" << endl;
  61. }
  62. system("pause");
  63. }while(opcion!=10);
  64. }
  65.  
  66. void inicia(pnodo &lista)
  67. {
  68. lista=NULL;
  69. }
  70.  
  71. void crear(pnodo &nuevo)
  72. {
  73. nuevo=new tnodo;
  74. if(nuevo!=NULL){
  75. cout << "Ingrese valor: "; cin >> nuevo->dato;
  76. nuevo->sig=NULL;
  77. }
  78. else{
  79. cout << "MEMORIA INSUFICIENTE" << endl;
  80. }
  81. }
  82.  
  83. void agregar_inicio(pnodo &lista, pnodo nuevo)
  84. {
  85. nuevo->sig=lista;
  86. lista=nuevo;
  87. }
  88.  
  89. void agregar_final(pnodo &lista, pnodo nuevo)
  90. {
  91. pnodo i;
  92. if(lista==NULL){
  93. lista=nuevo;
  94. }
  95. else{
  96. for(i=lista;i->sig!=NULL;i=i->sig);
  97. i->sig=nuevo;
  98. }
  99. }
  100.  
  101. void agregar_orden(pnodo &lista, pnodo nuevo)
  102. {
  103. pnodo i;
  104. if(lista==NULL){
  105. lista=nuevo;
  106. }
  107. else{
  108. if(nuevo->dato<lista->dato){
  109. nuevo->sig=lista;
  110. lista=nuevo;
  111. }
  112. else{
  113. for(i=lista;i->sig!=NULL && nuevo->dato>(i->sig)->dato;i=i->sig);
  114. nuevo->sig=i->sig;
  115. i->sig=nuevo;
  116. }
  117. }
  118. }
  119.  
  120. pnodo quitar_inicio(pnodo &lista)
  121. {
  122. pnodo borrado;
  123. if(lista==NULL){
  124. borrado=NULL;
  125. }
  126. else{
  127. borrado=lista;
  128. lista=lista->sig;
  129. borrado->sig=NULL;
  130. }
  131. return borrado;
  132. }
  133.  
  134. pnodo quitar_final(pnodo &lista)
  135. {
  136. pnodo borrado, i;
  137. if(lista==NULL){
  138. borrado=NULL;
  139. }
  140. else{
  141. if(lista->sig==NULL){
  142. borrado=lista;
  143. lista=NULL;
  144. }
  145. else{
  146. for(i=lista;(i->sig)->sig!=NULL;i=i->sig);
  147. borrado=i->sig;
  148. i->sig=NULL;
  149. }
  150. }
  151. return borrado;
  152. }
  153.  
  154. pnodo quitar_nodo(pnodo &lista, int valor)
  155. {
  156. pnodo borrado, i;
  157. if(lista==NULL){
  158. borrado=NULL;
  159. }
  160. else{
  161. if(lista->dato==valor){
  162. borrado=lista;
  163. lista=borrado->sig;
  164. borrado->sig=NULL;
  165. }
  166. else{
  167. for(i=lista;i->sig!=NULL && valor!=(i->sig)->dato;i=i->sig);
  168. if(i->sig!=NULL){
  169. borrado=i->sig;
  170. i->sig=borrado->sig;
  171. borrado->sig=NULL;
  172. }
  173. else{
  174. borrado=NULL;
  175. }
  176. }
  177. }
  178. return borrado;
  179. }
  180.  
  181. bool buscar_nodo(pnodo lista,int valor)
  182. {
  183. pnodo i;
  184. bool encontrado=false;
  185. if(lista!=NULL){
  186. for(i=lista;i!=NULL && encontrado==false;i=i->sig){
  187. if(i->dato==valor){
  188. encontrado=true;
  189. }
  190. }
  191. }
  192. return encontrado;
  193. }
  194.  
  195. void mostrar(pnodo lista)
  196. {
  197. pnodo i;
  198. if(lista!=NULL){
  199. for(i=lista;i!=NULL;i=i->sig){
  200. cout << "Nodo: " << i->dato << endl;
  201. }
  202. cout << endl;
  203. }
  204. else{
  205. cout << "LISTA VACIA" << endl;
  206. }
  207. }
  208.  
  209.  


Título: Re: Ayuda con listas sinples
Publicado por: MAFUS en 31 Agosto 2018, 20:46 pm
¿Por qué buscar_nodo solo devuelve si lo ha encontrado o no? Mejor si devolviera el puntero al nodo, en caso de existir, o NULL (nullptr) en caso de no encontrarlo. Saber si existe o no no tiene utilidad. Sí tiene utilidad el devolver el dato pues, normalmente, suele llevar más datos que el que ha sido objeto de búsqueda.

Por otra parte ¿qué no entiendes? Explicar todo el código cómo que es un poco largo.


Título: Re: Ayuda con listas sinples
Publicado por: Beginner Web en 31 Agosto 2018, 22:51 pm
El problema es que mi modulo de agregar nodo al final me agrega un nodo pero adelante como lo soluciono? Desde ya gracias chavales

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. typedef struct tnodo *pnodo;
  7. typedef struct tnodo{
  8. int dato;
  9. pnodo sig;
  10. };
  11. typedef struct tlista{
  12. pnodo inicio;
  13. int contador;
  14. };
  15.  
  16. void inicia(tlista &lista);
  17. void crear(pnodo &nuevo);
  18. void agregar_inicio(tlista &lista, pnodo nuevo);
  19. void agregar_final(tlista &lista, pnodo nuevo);
  20. void agregar_orden(tlista &lista, pnodo nuevo);
  21. pnodo quitar_inicio(tlista &lista);
  22. pnodo quitar_final(tlista &lista);
  23. pnodo quitar_nodo(tlista &lista, int valor);
  24. bool buscar_nodo(tlista lista,int valor);
  25. void mostrar(tlista lista);
  26.  
  27. int main()
  28. {
  29. tlista milista;
  30. pnodo nuevonodo, eliminado;
  31. int opcion, num;
  32. inicia(milista);
  33. do{
  34. system("cls");
  35. cout << "1. Iniciar lista" << endl;
  36. cout << "2. Agregar al inicio" << endl;
  37. cout << "3. Agregar al final" << endl;
  38. cout << "4. Agregar en orden" << endl;
  39. cout << "5. Quitar al inicio" << endl;
  40. cout << "6. Quitar al final" << endl;
  41. cout << "7. Quitar valor" << endl;
  42. cout << "8. Buscar valor" << endl;
  43. cout << "9. Mostrar lista" << endl;
  44. cout << "10. Salir" << endl;
  45. cin >> opcion;
  46. switch(opcion){
  47. case 1: inicia(milista); break;
  48. case 2: crear(nuevonodo); if(nuevonodo!=NULL){agregar_inicio(milista,nuevonodo);}; break;
  49. case 3: crear(nuevonodo); if(nuevonodo!=NULL){agregar_final(milista,nuevonodo);}; break;
  50. case 4: crear(nuevonodo); if(nuevonodo!=NULL){agregar_orden(milista,nuevonodo);}; break;
  51. case 5: eliminado=quitar_inicio(milista);
  52. if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl;delete(eliminado);}
  53. else{cout << "LISTA VACIA O NO EXISTE VALOR" << endl;}; break;
  54. case 6: eliminado=quitar_final(milista);
  55. if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl;delete(eliminado);}
  56. else{cout << "LISTA VACIA O NO EXISTE VALOR" << endl;}; break;
  57. case 7: cout << "Igrese valor a eliminar: "; cin >> num; eliminado=quitar_nodo(milista,num);
  58. if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl; delete(eliminado);}
  59. else{ cout << "LISTA VACIA O NO EXISTE VALOR" << endl;}; break;
  60. case 8: cout << "Ingrese valor buscado: "; cin >> num;
  61. if(buscar_nodo(milista,num)==true){cout << "VALOR ENCONTRADO" << endl;}
  62. else{ cout << "LISTA VACIA O NO EXISTE VALOR" << endl;}; break;
  63. case 9: cout << "*** LISTA ***" << endl; mostrar(milista); break;
  64. case 10: cout << "FIN DEL  PROGRAMA" << endl; break;
  65. default: cout << "Opcion incorrecta" << endl;
  66. }
  67. system("pause");
  68. }while(opcion!=10);
  69. }
  70.  
  71. void inicia(tlista &lista)
  72. {
  73. lista.inicio=NULL;
  74. lista.contador=0;
  75. }
  76.  
  77. void crear(pnodo &nuevo)
  78. {
  79. nuevo=new tnodo;
  80. if(nuevo!=NULL){
  81. cout << "Ingrese valor: "; cin >> nuevo->dato;
  82. nuevo->sig=NULL;
  83. }
  84. else{
  85. cout << "MEMORIA INSUFICIENTE" << endl;
  86. }
  87. }
  88.  
  89. void agregar_inicio(tlista &lista, pnodo nuevo)
  90. {
  91. if (lista.inicio==NULL){
  92.     lista.inicio=nuevo;
  93.    }
  94.   else{
  95.   nuevo->sig=lista.inicio;
  96.     lista.inicio=nuevo;
  97.   }
  98.   lista.contador++;
  99. }
  100.  
  101. void agregar_final(tlista &lista, pnodo nuevo)
  102. {
  103. pnodo i;
  104. if(lista.inicio==NULL){
  105. lista.inicio=nuevo;
  106. }
  107. else{
  108. for(i=lista.inicio;i->sig!=NULL;i=i->sig);
  109. i->sig=nuevo;
  110. }
  111. lista.contador++;
  112. }
  113.  
  114. void agregar_orden(tlista &lista, pnodo nuevo)
  115. {
  116. pnodo i;
  117. if(lista.inicio==NULL){
  118. lista.inicio=nuevo;
  119. }
  120. else{
  121. if(nuevo->dato<lista.inicio->dato){
  122. nuevo->sig=lista.inicio;
  123. lista.inicio=nuevo;
  124. }
  125. else{
  126. for(i=lista.inicio;i->sig!=NULL && nuevo->dato>(i->sig)->dato;i=i->sig);
  127. nuevo->sig=i->sig;
  128. i->sig=nuevo;
  129. }
  130. }
  131. lista.contador++;
  132. }
  133.  
  134. pnodo quitar_inicio(tlista &lista)
  135. {
  136. pnodo borrado;
  137. if(lista.inicio==NULL){
  138. borrado=NULL;
  139. }
  140. else{
  141. borrado=lista.inicio;
  142. lista.inicio=lista.inicio->sig;
  143. borrado->sig=NULL;
  144. }
  145. lista.contador--;
  146. return borrado;
  147. }
  148.  
  149. pnodo quitar_final(tlista &lista)
  150. {
  151. pnodo borrado, i;
  152. if(lista.inicio==NULL){
  153. borrado=NULL;
  154. }
  155. else{
  156. if(lista.inicio->sig==NULL){
  157. borrado=lista.inicio;
  158. lista.inicio=NULL;
  159. }
  160. else{
  161. for(i=lista.inicio;(i->sig)->sig!=NULL;i=i->sig);
  162. borrado=i->sig;
  163. i->sig=NULL;
  164. }
  165. }
  166. lista.contador--;
  167. return borrado;
  168. }
  169.  
  170. pnodo quitar_nodo(tlista &lista, int valor)
  171. {
  172. pnodo borrado, i;
  173. if(lista.inicio==NULL){
  174. borrado=NULL;
  175. }
  176. else{
  177. if(lista.inicio->dato==valor){
  178. borrado=lista.inicio;
  179. lista.inicio=borrado->sig;
  180. borrado->sig=NULL;
  181. }
  182. else{
  183. for(i=lista.inicio;i->sig!=NULL && valor!=(i->sig)->dato;i=i->sig);
  184. if(i->sig!=NULL){
  185. borrado=i->sig;
  186. i->sig=borrado->sig;
  187. borrado->sig=NULL;
  188. }
  189. else{
  190. borrado=NULL;
  191. }
  192. }
  193. lista.contador--;
  194. }
  195. return borrado;
  196. }
  197.  
  198. bool buscar_nodo(tlista lista,int valor)
  199. {
  200. pnodo i;
  201. bool encontrado=false;
  202. if(lista.inicio!=NULL){
  203. for(i=lista.inicio;i!=NULL && encontrado==false;i=i->sig){
  204. if(i->dato==valor){
  205. encontrado=true;
  206. }
  207. }
  208. }
  209. return encontrado;
  210. }
  211.  
  212. void mostrar(tlista lista)
  213. {
  214. pnodo i;
  215. if(lista.inicio!=NULL){
  216. for(i=lista.inicio;i!=NULL;i=i->sig){
  217. cout << "Nodo: " << i->dato << endl;
  218. }
  219. cout << endl;
  220. cout << "Cantidad de elementos: " << lista.contador << endl;
  221. }
  222. else{
  223. cout << "LISTA VACIA" << endl;
  224. }
  225. }


Título: Re: Ayuda con listas sinples
Publicado por: 6666 en 1 Septiembre 2018, 05:03 am
Creo que estas desperdiciando toda la potencia de c++ con este programa trivial, debes utilizar la programacion orientada a objetos.


Título: Re: Ayuda con listas sinples
Publicado por: MAFUS en 1 Septiembre 2018, 13:41 pm
Eso era en tu primer código. Líneas 43 y 44:
Código:
case 2: crear(nuevonodo); if(nuevonodo!=NULL){agregar_inicio(milista,nuevonodo);}; break;
case 3: crear(nuevonodo); if(nuevonodo!=NULL){agregar_inicio(milista,nuevonodo);}; break;
En los dos cases añadías al inicio.


Título: Re: Ayuda con listas sinples
Publicado por: dijsktra en 5 Septiembre 2018, 14:52 pm
El problema es que mi modulo de agregar nodo al final me agrega un nodo pero adelante como lo soluciono? Desde ya gracias chavales

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. ...
  4. typedef struct tlista{
  5. pnodo inicio;
  6. int contador;
  7. };
  8.  
  9. void inicia(tlista &lista);
  10. void crear(pnodo &nuevo);
  11. void agregar_inicio(tlista &lista, pnodo nuevo);
  12. void agregar_final(tlista &lista, pnodo nuevo);
  13. void agregar_orden(tlista &lista, pnodo nuevo);
  14. pnodo quitar_inicio(tlista &lista);
  15. pnodo quitar_final(tlista &lista);
  16. pnodo quitar_nodo(tlista &lista, int valor);
  17. bool buscar_nodo(tlista lista,int valor);
  18. void mostrar(tlista lista);
  19. }

Ya el planteamiento de la signatura del tipo lista que haces es incorrecto. El programador usuario del tipo de datos lista no debe preocuparse del tuoi "pnodo"... Solo necesita saber el tipo de lista y el tipo de valor. Lo otro queda oculto, y solo lo conoce el implementador.

Siguiendo tu convenio, sería algo así:

Código
  1. void inicia(tlista &lista);
  2. void agregar_inicio(tlista &lista, int valor);
  3. void agregar_final(tlista &lista, int valor);
  4. void agregar_orden(tlista &lista, int valor);
  5. void quitar_inicio(tlista &lista);
  6. void quitar_final(tlista &lista);
  7. void quitar_valor(tlista &lista, int valor);
  8. void mostrar(tlista lista);