[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