Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Beginner Web en 3 Septiembre 2018, 01:56 am



Título: Ayuda con listas
Publicado por: Beginner Web en 3 Septiembre 2018, 01:56 am
Hola nuevamente, tengo 2 fallos en las funciones quitar_final() y quitar_nodo(); No se cual sea el problema algo debo estar haciendo mal o sera el sueño no se  :huh:

Aqui os dejo el codigo completo

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. pnodo final;
  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.final=NULL;
  75.  
  76. }
  77.  
  78. void crear(pnodo &nuevo)
  79. {
  80. nuevo=new tnodo;
  81. if(nuevo!=NULL){
  82. cout << "Ingrese valor: "; cin >> nuevo->dato;
  83. nuevo->sig=NULL;
  84. }
  85. else{
  86. cout << "MEMORIA INSUFICIENTE" << endl;
  87. }
  88. }
  89.  
  90. void agregar_inicio(tlista &lista, pnodo nuevo)
  91. {
  92. if(lista.inicio==NULL){
  93. lista.inicio=nuevo;
  94. lista.final=nuevo;
  95. }
  96. else{
  97. nuevo->sig=lista.inicio;
  98. lista.inicio=nuevo;
  99. }
  100. }
  101.  
  102. void agregar_final(tlista &lista, pnodo nuevo)
  103. {
  104. if(lista.inicio==NULL){
  105. lista.inicio=nuevo;
  106. lista.final=nuevo;
  107. }
  108. else{
  109. lista.final->sig=nuevo;
  110. lista.final=nuevo;
  111. }
  112. }
  113.  
  114. void agregar_orden(tlista &lista, pnodo nuevo)
  115. {
  116. pnodo i;
  117. if(lista.inicio==NULL){
  118. lista.inicio=nuevo;
  119. lista.final=nuevo;
  120. }
  121. else{
  122. if(nuevo->dato<lista.inicio->dato){
  123. nuevo->sig=lista.inicio;
  124. lista.inicio=nuevo;
  125. }
  126. else{
  127. if(nuevo->dato>lista.final->dato){
  128. lista.final->sig=nuevo;
  129. lista.final=nuevo;
  130. }
  131. else{
  132. for(i=lista.inicio;i->sig!=NULL && nuevo->dato>(i->sig)->dato;i=i->sig){
  133. nuevo->sig=i->sig;
  134. i->sig=nuevo;
  135. }
  136. }
  137. }
  138. }
  139. }
  140.  
  141. pnodo quitar_inicio(tlista &lista)
  142. {
  143. pnodo borrado;
  144. if(lista.inicio==NULL){
  145. borrado=NULL;
  146. }
  147. else{
  148. if(lista.inicio==lista.final){
  149. borrado=lista.inicio;
  150. lista.inicio=NULL;
  151. lista.final=NULL;
  152. }
  153. else{
  154. borrado=lista.inicio;
  155. lista.inicio=borrado->sig;
  156. borrado->sig=NULL;
  157. }
  158. }
  159. return borrado;
  160. }
  161.  
  162. pnodo quitar_final(tlista &lista) //ERROR
  163. {
  164. pnodo borrado, i;
  165. if(lista.inicio==NULL){
  166. borrado=NULL;
  167. }
  168. else{
  169. if(lista.inicio==lista.final){
  170. borrado=lista.inicio;
  171. lista.inicio=NULL;
  172. lista.final=NULL;
  173. }
  174. else{
  175. for(i=lista.inicio;(i->sig)->sig!=NULL;i=i->sig);
  176. borrado=lista.final;
  177. lista.final->sig=NULL;
  178. }
  179. }
  180. return borrado;
  181. }
  182.  
  183. pnodo quitar_nodo(tlista &lista, int valor) //ERROR
  184. {
  185. pnodo borrado, i;
  186. if(lista.inicio==NULL){
  187. borrado=NULL;
  188. }
  189. else{
  190. if(lista.inicio->dato==valor){
  191. borrado=lista.inicio;
  192. if(lista.inicio==lista.final){
  193. lista.inicio=NULL;
  194. lista.final=NULL;
  195. }
  196. else{
  197. lista.inicio=NULL;
  198. borrado->sig=NULL;
  199. }
  200. }
  201. else{
  202. for(i=lista.inicio;i->sig!=NULL && valor!=(i->sig)->dato;i=i->sig);
  203. if(i->sig!=NULL){
  204. borrado=NULL;
  205. }
  206. else{
  207. borrado=i->sig;
  208. borrado->sig=NULL;
  209. }
  210. }
  211. }
  212. return borrado;
  213. }
  214.  
  215. bool buscar_nodo(tlista lista,int valor)
  216. {
  217. pnodo i;
  218. bool encontrado=false;
  219. if(lista.inicio!=NULL){
  220. for(i=lista.inicio;i!=NULL && encontrado==false;i=i->sig){
  221. if(i->dato==valor){
  222. encontrado=true;
  223. }
  224. }
  225. }
  226. return encontrado;
  227. }
  228.  
  229. void mostrar(tlista lista)
  230. {
  231. pnodo i;
  232. if(lista.inicio!=NULL){
  233. for(i=lista.inicio;i!=NULL;i=i->sig){
  234. cout << "Nodo: " << i->dato << endl;
  235. }
  236. cout << endl;
  237. }
  238. else{
  239. cout << "LISTA VACIA" << endl;
  240. }
  241. }
  242.  


Título: Re: Ayuda con listas
Publicado por: MAFUS en 3 Septiembre 2018, 11:12 am
En quitar_final
Código:
for(i=lista.inicio;(i->sig)->sig!=NULL;i=i->sig); // for sin efecto por el ; final
borrado=lista.final; // aun habiendo conseguido el dato en el for anterior aquí directamente apuntas a lista.final
lista.final->sig=NULL;


Título: Re: Ayuda con listas
Publicado por: Beginner Web en 3 Septiembre 2018, 11:27 am
Ahhh tenes razon, la solucion seria esta  ;-)

Código
  1. pnodo quitar_final(tlista &lista) //ERROR
  2. {
  3. pnodo borrado, i;
  4. if(lista.inicio==NULL){
  5. borrado=NULL;
  6. }
  7. else{
  8. if(lista.inicio==lista.final){
  9. borrado=lista.inicio;
  10. lista.inicio=NULL;
  11. lista.final=NULL;
  12. }
  13. else{
  14. for(i=lista.inicio;(i->sig)->sig!=NULL;i=i->sig);
  15. borrado=lista.final;
  16. lista.final=i;
  17. lista.final->sig=NULL;
  18. }
  19. }
  20. return borrado;
  21. }

Me faltaria el quitar nodo segun un valor especifico  :huh: