elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con listas sinples
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con listas sinples  (Leído 1,051 veces)
Beginner Web


Desconectado Desconectado

Mensajes: 557


youtu.be/0YhflLRE-DA


Ver Perfil
Ayuda con listas sinples
« 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.  


« Última modificación: 31 Agosto 2018, 22:36 pm por Beginner Web » En línea

{_id: "5ef16999f6ce240abc225ss3",
nombre: "Ana Keldysh",
nacionalidad: "Argentina",
edad: "17",
profesion: "Desarrollador Web Full Stack, pero la verdad hago de todo.",
"__v": 0
}
MAFUS


Desconectado Desconectado

Mensajes: 1.479



Ver Perfil
Re: Ayuda con listas sinples
« Respuesta #1 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.


« Última modificación: 31 Agosto 2018, 20:57 pm por MAFUS » En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
Beginner Web


Desconectado Desconectado

Mensajes: 557


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Ayuda con listas sinples
« Respuesta #2 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. }
« Última modificación: 31 Agosto 2018, 23:11 pm por Beginner Web » En línea

{_id: "5ef16999f6ce240abc225ss3",
nombre: "Ana Keldysh",
nacionalidad: "Argentina",
edad: "17",
profesion: "Desarrollador Web Full Stack, pero la verdad hago de todo.",
"__v": 0
}
6666

Desconectado Desconectado

Mensajes: 146


Wikileaks.org


Ver Perfil
Re: Ayuda con listas sinples
« Respuesta #3 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.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.479



Ver Perfil
Re: Ayuda con listas sinples
« Respuesta #4 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.
En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
dijsktra

Desconectado Desconectado

Mensajes: 100


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Ayuda con listas sinples
« Respuesta #5 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);
En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda con 2 LISTAS
Programación Visual Basic
forrestgump 0 827 Último mensaje 4 Junio 2008, 22:25 pm
por forrestgump
Uso de Listas: Subprograma que lea 2 listas y forme una.
Dudas Generales
hbenitez 2 2,102 Último mensaje 8 Agosto 2010, 20:11 pm
por hbenitez
Ayuda Acerca De Listas y Listas Circulares (Revienta Memoria :S)
Programación C/C++
Gerik 0 1,782 Último mensaje 12 Septiembre 2010, 01:49 am
por Gerik
ayuda en listas
Programación C/C++
josue_tux 1 1,079 Último mensaje 28 Junio 2011, 01:00 am
por leogtz
Ayuda con listas en c
Programación C/C++
thorniton 1 562 Último mensaje 10 Noviembre 2015, 20:44 pm
por furciorifa
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines