¿Te gustaría aprender Lenguaje C/C++?
Tenemos los cursos que necesitas.¡Haz clic aquí!



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.

¿Te gustaría aprender Lenguaje C/C++?
Tenemos los cursos que necesitas.¡Haz clic aquí!
About Author

NGuerrero

0 0 votos
Article Rating
Suscribir
Notificar de
guest
0 Comments
Comentarios.
Ver todos los comentarios
0
¿Te gusta este articulo? por favor comentax