Sunteți pe pagina 1din 4

#include <stdio.

h>
#include <stdlib.h>

struct lista {
int data;
struct lista *anterior;
struct lista *siguiente;
};

typedef struct lista Nodo;


typedef Nodo *ptrNodo;

void instrucciones();
void insertarHead(ptrNodo *head, ptrNodo *tail, int data);
void insertarTail(ptrNodo *head, ptrNodo *tail, int data);
int eliminarHead(ptrNodo *head, ptrNodo *tail);
int eliminarTail(ptrNodo *tail, ptrNodo *head);
void imprimir(ptrNodo head);
int estado(ptrNodo head);

int main(){
ptrNodo head = NULL;
ptrNodo tail = NULL;

int data,eleccion,elemento;
instrucciones();
printf("Eleccion: ");
scanf("%d",&eleccion);

while(eleccion!=6){
switch(eleccion){
case 1:
printf("Escriba un dato entero: ");
scanf("%d",&data);
insertarHead(&head,&tail,data);
printf("Dato agregado \n\n\n");
break;

case 2:
printf("Escriba un dato entero: ");
scanf("%d",&data);
insertarTail(&head,&tail,data);
printf("Dato agregado \n\n\n");
break;

case 3:
if(!estado(head) && !estado(tail)){
printf("Dato eliminado \n");
printf("Dato recuperado: %d \n", eliminarHead(&head,&tail));
}
else{
printf("Lista vacia \n\n\n");
}
break;

case 4:
if(!estado(head) && !estado(tail)){
printf("Dato eliminado \n");
printf("Dato recuperado: %d \n", eliminarTail(&head,&tail));
}
else{
printf("Lista vacia \n\n\n");
}
break;

case 5:
imprimir(head);
break;

default:
printf("Opcion no disponible \n");
break;
}
instrucciones();
printf("Eleccion: ");
scanf("%d",&eleccion);
}
return 0;

void instrucciones(){
printf(" \n Introduzca su eleccion: \n"
"1.- Insertar elemento por el frente \n"
"2.- Insertar elemento por el final \n"
"3.- Eliminar elemento por el frente \n"
"4.- Eliminar elemento por el final \n"
"5.- Ver lista \n"
"6.- Salir \n");
}

void insertarHead(ptrNodo *head, ptrNodo *tail, int dato){

ptrNodo Nuevo;
Nuevo = (ptrNodo)malloc(sizeof(Nodo));

if(Nuevo != NULL){
if(!estado(*head) && !estado(*tail)){
Nuevo->data = dato;
Nuevo->siguiente = *head;
Nuevo->anterior = (*head)->anterior;
(*head)->anterior = Nuevo;
}
else{
Nuevo->data = dato;
*head = Nuevo;
*tail = Nuevo;
(*head)->anterior = NULL;
(*tail)->siguiente = NULL;
}
*head = Nuevo;
}
else printf("No hay memoria \n");
}
void insertarTail(ptrNodo *head, ptrNodo *tail, int dato){
ptrNodo Nuevo;
Nuevo = (ptrNodo)malloc(sizeof(Nodo));
if(Nuevo != NULL){
if(!estado(*head) && !estado(*tail)){
Nuevo->data = dato;
Nuevo->siguiente = (*tail)->siguiente;
(*tail)->siguiente = Nuevo;
Nuevo->anterior = *tail;
}
else{
*head = Nuevo;
*tail = Nuevo;
Nuevo->data = dato;
(*head)->anterior = NULL;
(*tail)->siguiente = NULL;
}
*tail=Nuevo;
}
else printf("No hay memoria \n");
}

int eliminarHead(ptrNodo *head, ptrNodo *tail){


int dato;
ptrNodo aux;
if( (*head)->siguiente == NULL){
dato = (*head)->data;
aux = *head;
*head = NULL;
free(aux);
}
else{

dato = (*head)->data;
aux = *head;
*head = (*head)->siguiente;
(*head)->anterior = aux->anterior;
free(aux);
}
return dato;
}

int eliminarTail(ptrNodo *head, ptrNodo *tail){


int dato;
ptrNodo aux;

if((*tail)->siguiente == NULL){
dato = (*tail)->data;
aux = *tail;
*tail = NULL;
free(aux);

}
else{
dato = (*tail)->data;
aux = *tail;
*tail = (*tail)->anterior;
(*tail)->siguiente = aux->siguiente;
free(aux);
}
return dato;
}

int estado(ptrNodo head){


if(head == NULL) return 1;
else return 0;
}

void imprimir(ptrNodo head){


if(head == NULL){
printf("Lista vacia \n");
}
else{
printf("La lista es: \n");
while(head != NULL){
printf("%d <- ",head->data);
head = head->siguiente;
}
}
}

S-ar putea să vă placă și