[C con Clase] lista dobleente enlazada

hernan diaz hernan.diiaz en hotmail.com
Vie Mayo 19 00:36:17 CEST 2017


COMO ELIMINO PRIMER Y ULTIMO NODO EN UNA LISTA DOBLE???

/*
Trabajo:

1- cuando la lista esta vacía y se selecciona la opción 3. Mostrar un mensaje de lista vacía.

2- Aumentar un campo id. que se genera automáticamente cuando se agrega un nodo.
Hacer una función que se encargue de recorrer la lista buscando el máximo id. y retorne el siguiente.
( si el máximo es 6 retorna 7) y este es el id del nuevo nodo.

2- Hacer que la lista sea doble y en el menú cambiar opción 2: eliminar el ultimo elemento,
3-Eliminar el primer elemento.
4-mostrar lista.

*/

#include <stdio.h>
#include <stdlib.h>

struct nodo
{
    char nombrelibro[40];
    char autor[30];
    int stock;
    float precio;
    int id;
    struct nodo *ps;
    struct nodo *pa;
};

struct nodo *crear_nodo ()
{
    struct nodo *P;

    P=(struct nodo*) malloc(sizeof(struct nodo)); //Pido memoria para el nodo

    if(P==NULL)
        printf("\nError de memoria\n");
    else
    {
        return P; //Retorna la direccion de memoria de un nodo.
    }
}

struct nodo *insertar(struct nodo *ultimo)
{
    struct nodo *nuevo;
    nuevo=crear_nodo(); //creo nodo para ingresarle datos
    nuevo->id=0;

    printf("\nIngrese nombre del libro: ");
    scanf("%s",nuevo->nombrelibro);
    printf("\nIngrese autor: ");
    scanf("%s",nuevo->autor);
    printf("\nIngrese stock disponible: ");
    scanf("%d",&nuevo->stock);
    printf("\nIngrese PRECIO :");
    scanf("%f",&nuevo->precio);
    printf("\n__________________________________");

                                            //una vez cargados los datos...
    
     nuevo->ps=NULL;        //el puntero del nuevo nodo apunta a NULL
    ultimo->ps=nuevo;       //el puntero del ultimo nodo ahora apunta al nuevo nodo,que pasa a ser el nuevo ultimo elemento
    nuevo->pa=ultimo;       //el nuevo q se agrega al final su punt anterior apunta al viejo ultimo nodo
    ultimo=nuevo;           //ultimo igual a nuevo
    nuevo->id=(nuevo->id + 1);           
    return nuevo;
}

struct nodo *mostrar_lista(struct nodo *cabeza)
{
    struct nodo *apuntador;
    apuntador=cabeza->ps;       //el apuntador a cada nodo sera igual al puntero del 1er elemento de la lista al inicio

    if (apuntador!=NULL)
    {
        printf("\nELEMENTOS DE LA LISTA:\n");

        while (apuntador != NULL)   //mientras que el apuntador no sea NULL(fin de la lista) va a ir mostrando el contenido de cada nodo.
        {   printf("\n__________________________________");
            printf("\n_Nombre del Libro: %s",apuntador->nombrelibro);
            printf("\n_Nombre del Autor: %s",apuntador->autor);
            printf("\n_Stock Disponible: %d",apuntador->stock);
            printf("\n_Precio del libro: %c%6.2f\n",36,apuntador->precio);
            printf("__________________________________\n");

            apuntador=apuntador->ps; //va a ir haciendo avanzar el apuntador de nodo en nodo hasta el ultimo.
            
        }
    }
        else
            printf("\nLa lista esta vacia\n");
}

struct nodo *eliminar(struct nodo *cabeza)
{
    struct nodo *apuntador;
    struct nodo *apuntadorAnterior;
    apuntadorAnterior=cabeza;
    apuntador=cabeza->ps;

    if(apuntador==NULL)
    {
        printf("\nLista Vacia no se puede eliminar elemento\n");
    }
    else
    {
        while((apuntador->ps)!=NULL) //while que elimina ultimo elemento de la lista
            {
                apuntador=apuntador->ps;
                apuntadorAnterior=apuntadorAnterior->ps;
            }
            apuntadorAnterior->ps=NULL;
            free(apuntador);

            printf("\nNodo eliminado");

    }
    return apuntadorAnterior; //retorno el anterior al ultimo,que pasa a ser el nuevo ultimo elemento
}

int BuscarID(struct nodo *cabeza)
{
    /*
    

    return ID;
    */
}

int main()
{
    system("color 1F");
    int opcion=0;
    float PRECIO=0;
    struct nodo *cabeza;
    struct nodo *ultimo;
    
    cabeza=crear_nodo();
    cabeza->ps=NULL;
    ultimo=cabeza;

    while(opcion!=9)
    {
        printf("\n***Menu Lista Simple***\n");
        printf("\n1_Intersar elemento a la lista.");
        printf("\n2_Eliminar elemento de la lista.");
        printf("\n3_Mostrar elementos de la lista.");
        printf("\n9_Salir\n");
        printf("\nElija una opcion: ");
        scanf("%d",&opcion);

        switch(opcion)
        {
            case 1:
                {
                    ultimo=insertar(ultimo);break;
                }
            case 2:
                {
                    ultimo=eliminar(cabeza);break;

                }
            case 3:
                {
                    mostrar_lista(cabeza);break;
                }
            default: break;
        }
    }

    free(cabeza);
    free(ultimo);
}


Más información sobre la lista de distribución Cconclase