Eliminación de un elemento en la lista
En seguida, el algoritmo de eliminación de un elemento de la lista: uso de un puntero temporal para guardar la dirección de los elementos que se van a eliminar, el elemento a eliminar se encontrará después del elemento actual.
Apunta el puntero siguiente del elemento actual hacia la dirección del puntero siguiente del elemento que se eliminará, libera la memoria ocupada por el elemento eliminado yactualiza el tamaño de la lista.
Para eliminar un elemento de la lista hay varias situaciones: eliminación dentro de la lista y eliminación del último elemento de la lista.
Eliminación al inicio de la lista
Modelo de la función:
int sup_list_circ(Lista *lista); La función devuelve -1 en caso de un error, si no devuelve 0. Etapas: el puntero sup_elemento contendrá la dirección del elemento 1, el puntero inicio apuntará hacia el segundo elemento, el puntero siguiente del último elemento apuntará hacia el primer elemento (que era el segundo antes de la eliminación), el tamaño de la lista disminuirá 1 elemento. La función:
/* eliminación al inicio de la lista */ int sup_lista_circ(Lista * lista){ if (lista->tamaño < 2) return -1; Elemento *sup_element; sup_elemento = lista->inicio; lista->inicio = lista->inicio->siguiente; lista->fin->siguiente = lista->inicio; free (sup_elemento->dato); free (sup_elemento); lista->tamaño--; return 0; }
Eliminación en una lista con un solo elemento
Modelo de la función:
int sup_list_circ_unica(Lista *lista); La función devuelve -1 en caso de algún error, si no devuelve 0. Etapas: el puntero sup_elemento contendrá la dirección del elemento (la lista contiene un solo elemento), el puntero inicio apuntará hacia NULL, el puntero fin apuntará hacia NULL y el tamaño de la lista disminuirá un elemento. La función:
/* eliminación en una lista con un solo elemento*/ int sup_lista_circ_unica(Lista *lista){ if (lista->tamaño != 1) return -1; Elemento *sup_elemento; sup_elemento = lista->inicio; lista->inicio = NULL; lista->fin = NULL; free (sup_elemento->dato); free (sup_elemento); lista->tamaño--; return 0; }
Mostrar la lista
Para mostrar la lista completa, es necesario posicionarse al inicio de la lista (el puntero inicio lo permitirá). Después, utilizando el puntero siguiente de cada elemento, la lista es recorrida del primer al último elemento. En comparación con las listas simples y doblemente enlazadas, en el que la condición para detenerse esta dada por el puntero siguiente del último elemento, que vale NULL, para la lista circular, no hay punto de detención, a menos que elijamos uno. A continuación dos variantes de visualización: mostrar la lista (del primer al último elemento) y mostrar la lista sin una condición para detenerse.
Mostrar la lista (del primer al último elemento)
Utilizaremos el tamaño de la lista como la condición para detenerse. La función:
/* mostrar la lista */ void mostrar (Lista * lista){ Elemento *actual; actual = lista->inicio; int i; for(i=0;i<lista->tamaño;++i){ printf ("%p - %s\n", actual, actual->dato); actual = actual->siguiente; } }
Mostrar la lista sin una condición para detenerse (indefinidamente)
La función:
/* recorrer la lista indefinidamente*/ void mostrar_indefinidamente (Lista * lista){ Elemento *actual; actual = lista->inicio; while (1){ printf ("%p - %s\n", actual, actual->dato); actual = actual->siguiente; } }
Destrucción de la lista
Para destruir la lista completa, he utilizado al eliminación al inicio de la lista ya que el tamaño es mayor a 1, luego la eliminación en una lista con un solo elemento. La función:
/* destruir lista */ void destruir (Lista * lista){ while (lista->tamaño > 0){ if(lista->tamaño > 1) sup_lista_circ (lista); else sup_lista_circ_unica(lista); } }
Te esperamos en el siguiente articulo en donde hablaremos mas acerca de estos temas, los cuales hoy en día son de vital importancia en el mundo de la tecnología.