Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 15 Julio 2016, 00:26 am



Título: Documentar función para borrar nodo según petición del usuario en C.
Publicado por: NOB2014 en 15 Julio 2016, 00:26 am
Hola, gente.
como se podrán imaginar aveces hago post que se me ocurren a mí solamente, pero si los hago es porque me resulta de mucha ayuda para aprender en serio y no en distintas ocasiones tener que copiar y pegar. -   
Les dejo la función para que en primer lugar me ayuden a documentarla, yo hice algunas lineas para que la tomen como Ej. para que se entienda lo que necesito. -
Si alguien tiene otra versión y la quiere postear, mi agradecimiento. -

Código
  1. struct lista *eliminarIndice( struct lista *L, int indice){
  2. int i = 1;
  3. if( L != NULL ){ // Verificamos que la lista no este vacia.
  4. if( indice <= 10 && indice > 0){ // Si indice es mayor a cero y menor o igual a la cant. de elemento continuamos.  
  5. struct nodo *anterior = L->primero; // Grabamos en anterior la direc. del primer nodo.
  6. struct nodo *pivote = L->primero; // Y lo mismo con pivote.
  7. while( i < indice ){ // Bucle para....
  8. anterior = pivote;
  9. pivote = pivote->siguiente;
  10. i++;
  11. }
  12. if( pivote->siguiente != NULL ){
  13. if( pivote->siguiente != L->primero ){
  14. anterior->siguiente = pivote->siguiente;
  15. free( pivote );
  16. }else{
  17. L->primero = pivote->siguiente;
  18. free( pivote );
  19. }
  20. }else{
  21. if( pivote != L->primero ){
  22. anterior->siguiente = NULL;
  23. free( pivote );
  24. L->ultimo = anterior;
  25. }else{
  26. free( pivote );
  27. }
  28. }
  29. L->elementos--;
  30. if( L->elementos == 0){
  31. free( L );
  32. return NULL;
  33. }else{
  34. return L;
  35. }
  36. }else{
  37. printf( "\n El indice pedido es mayor que los elementos existentes..." );
  38. return L;
  39. }
  40. }else{
  41. printf( "\n No se puede procesar una lista vacia..." );
  42. return NULL;
  43. }
  44. }

Saludos.


Título: Re: Documentar función para borrar nodo según petición del usuario en C.
Publicado por: AlbertoBSD en 15 Julio 2016, 01:07 am
Hola espero y te ayude, como te comente hay que hacerlo en papel a mano con todos los casos posibles y por haber, y asi validas que no se nos escapo ningun caso.

Código
  1. struct lista *eliminarIndice( struct lista *L, int indice){
  2. int i = 1;
  3. if( L != NULL ){ // Verificamos que la lista no este vacia.
  4. if( indice <= 10 && indice > 0){ // Si indice es mayor a cero y menor o igual a la cant. de elemento continuamos.
  5. //En el if anterior lo limitas a solo 10 elementos con lo cual pierde su utilidad para ser una lista de cualquier cantidad de elementos
  6. struct nodo *anterior = L->primero; // Grabamos en anterior la direc. del primer nodo.
  7. struct nodo *pivote = L->primero; // Y lo mismo con pivote.
  8. while( i < indice ){ // Bucle para situarnos en el campo a eliminar
  9. anterior = pivote; // Guardardamos el nodo previo al cual queremos eliminar para modifica sus valores (apuntador al siguiente nodo el cual va a cambiar)
  10. pivote = pivote->siguiente;
  11. i++;
  12. }
  13. //A esta altura del ciclo, la variable pivote ya tiene el elemento a eliminar
  14. if( pivote->siguiente != NULL ){ //Si el nodo a eliminar no es el ultimo
  15. if( pivote->siguiente != L->primero ){ // Validamos si no es el primer elemento (Aqui deberia de ser if( pivote != L->primero ){)
  16. anterior->siguiente = pivote->siguiente;// Realizamos el cambio de variable... se iguala el apuntadorr a siguiente dentro de la variable anterior (que apuntaba al elemento a eliminar) al que la le seguia, (Ver comentario UNO)
  17. free( pivote ); // Se libera la memoria asignada al elemento a eliminar a esta altura del codigo nadie deberia de tener apuntado a este nodo que se libero
  18. }else{
  19. // En este punto pivote es el primer elemento de la lista por lo cual el unico apuntador al elemento a eliminar era es que tiene la estructura lista, por lo cual se susituye por el elemento que le segua al que se va a eliminar
  20. L->primero = pivote->siguiente;
  21. free( pivote ); //En este el tambien es necesario liberar la memoria usada
  22. }
  23. }else{
  24. //En este punto el elemento a liminar es el ultimo de la lista
  25. if( pivote != L->primero ){ // Se valida si tambien es el primero
  26. // Si no es el primer elemento signifia que la variable anterior contiene un apuntador valido y hay que modificarla
  27. anterior->siguiente = NULL; //El apuntador a siguiente de la variable anterior se iguala a NULL por que actualmente ya no hay elementos siguientes
  28. free( pivote );//Liberamos memoria
  29. L->ultimo = anterior; //Como actualmente eliminamos el ultimo, hay que actualizar el apuntador de la estructura lista al que ahora es realmente el ultimo elemento, el cual es el nodo siguiente
  30. }else{
  31. //En este punto el elemento a eliminar es el unico elemento de la lista, por lo cual es tanto el ultimo como el primero, entonces simplemente se elimina de la memoria
  32. free( pivote );
  33. }
  34. }
  35. L->elementos--; // Decrementamos el contador de la lista
  36. if( L->elementos == 0){ // Si ya no hay elementos en la lista (Literamente hay 0 elementos) por lo tanto significa que la lista esta vacia hay que Liberar la Lista actual
  37. free( L ); // Liberamos la memoria usada en la lista actual
  38. return NULL;  // Retornamos NULL para actualizar el apuntador que tiene la funcion que nos llamo, esto es la funcion principal, para que se entere que ya no hay lista valida
  39. }else{
  40. return L; // Si todavia quedan elementos retornamos el apuntador actual de la lista
  41. }
  42. }else{
  43. printf( "\n El indice pedido es mayor que los elementos existentes..." );
  44. return L;
  45. }
  46. }else{
  47. printf( "\n No se puede procesar una lista vacia..." );
  48. return NULL;
  49. }
  50. }


Título: Re: Documentar función para borrar nodo según petición del usuario en C.
Publicado por: NOB2014 en 15 Julio 2016, 14:31 pm
Hola, Alberto. -
Realmente hasta ayer no comprendía cuál ligado esta un papel y un lápiz y la programación, muchas gracias por el aporte. -
Ahora una duda que tengo con la siguientes líneas de código:
Que diferencias hay en declarar los punteros a la estructura de una u otra manera, leí por allí que no se debería declarar una nueva estructura que no era necesario o no era conveniente, no recuerdo. - 

Código
  1. struct lista{
  2. struct nodo *primero;
  3. struct nodo *ultimo;
  4. struct nodo *elementos;
  5. }
  6.  
Código
  1. struct lista *primero, *ultimo;

Saludos.


Título: Re: Documentar función para borrar nodo según petición del usuario en C.
Publicado por: AlbertoBSD en 15 Julio 2016, 16:14 pm
Si tu progama va a usar una sola lista y quieres que tu variables primero y ultimo sean globales entonces podrias ahorrarte la estructura lista y de clarar simplemente.

Código
  1. struct nodo *primero, *ultimo;

Ahora imagina que tu programa va a usar 3 listas o 10 o 1000 o un número desconocido de listas algo random.

Como las declaras para mil?

Código
  1. struct nodo *primero[1000], *ultimo[1000];

Tal vez sirva, y como llevas el control de cuantos elementos tiene cada lista?

Código
  1. int elementos[1000];

Como te digo  tal vez sirva pero, las funciones deben de ser genéricas para cualquier numero de listas y no solo una.

¿Como se hace cuando no sabes cuantas listas se crearan?

En cuanto a memoria adicional usado en el programa por usar una  estructura adicional solo aumenta unos 4 o 8 bytes por lista adicional usada (adicional al numero de elementos y memoria que use cada nodo).


Imagínate que estas escribiendo el archivo lista_simple.h
Y lo vas a distribuir en internet para que cualquiera lo use. Tu biblioteca de funciones para libreria ofrecerá de manera generica funciones para agregar nodos eliminarlos y ordenarlos, como crees que sea mejor que solo funcione con una lista, o que funcione para Cualquier cantidad de listas.

Saludos


Título: Re: Documentar función para borrar nodo según petición del usuario en C.
Publicado por: NOB2014 en 16 Julio 2016, 02:59 am
Hola.
Mil disculpas por el error, que daría yo para encontrar ej. en la web tan bien documentados. -
Te debo una picada completa con cerveza, una lástima que tengas que comer vos solo porque yo hace muchos años que soy vegetariano. -

Saludos.