/******** includes **********/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NOMBRE 10
/* definicion de una estructura autoreferenciada */
struct nodo {
char nombre[NOMBRE];
int inventario;
int stock;
//float costo;
//int ganancia;
//float precio;
struct nodo *siguiente;
};
/*********** Prototipos de funciones ************/
void agregar_nodo(struct nodo **);
void mostrar_lista(struct nodo *);
void buscar_nodo(struct nodo *);
void modificar_nodo(struct nodo *);
void insertar_nodo(struct nodo *);
void borrar_nodo(struct nodo **);
void menu();
struct nodo *crear_nodo();
/********** Main ***********/
int main(void)
{
int opcion;
/* creo un puntero, a struct nodo, que siempre va a ser la cabeza de la lista */
struct nodo *ptr_cabeza=NULL; /* inicialmente la lista se encuentra vacia */
menu();
do
{
switch(opcion)
{
case 1:
agregar_nodo(&ptr_cabeza);
break;
case 2:
mostrar_lista(ptr_cabeza);
break;
case 3:
buscar_nodo(ptr_cabeza);
break;
case 4:
modificar_nodo(ptr_cabeza);
break;
case 5:
insertar_nodo(ptr_cabeza);
break;
case 6:
borrar_nodo(&ptr_cabeza);
break;
case 7:
printf("\n\t\t********** FIN DEL PROGRAMA **********\n\n"); break;
default:
menu();
break;
} /* fin del switch */
} /* fin del do */
while(opcion!=7);
return 0;
}
void menu(void)
{
printf("\n\t\t******** Menu principal ********\n"); printf("2 - Mostrar lista\n"); printf("4 - Modificar nodo\n"); printf("5 - Insertar nodo\n"); }
/************** Funcion: agregar_nodo ***************/
/* cada vez que se crea un nodo este se crea a la izquierda del que ya se encuentra en la lista,
es decir el primer nodo ingresado va a ser la cola de la lista y el ultimo a ingresar va a ser
el primero(cabeza) de la lista */
void agregar_nodo(struct nodo **enlace) /* preguntar por que se pasa puntero a puntero ??? se pasa xq recibe un puntero al cual
se le cambia la direccion a donde apunta */
{
struct nodo *ptr_nuevo; /* creo un puntero a la estructura nodo */
ptr_nuevo=crear_nodo();
if(ptr_nuevo==NULL) /* no se reservo memoria */
{
printf("No se pudo asignar memoria\n"); return;
}
ptr_nuevo->siguiente=*enlace;//el nodo creado ahora apunta al nodo que se encuentra a su derecha (cuando la lista se encuentra vacia el primenr nodo creado apunta a NULL)
*enlace=ptr_nuevo;//el puntero enlace(cabeza) ahora apunta al nodo creado
}
/*************** Funcion mostrar_lista ********************/
/* Imprime en pantalla los nodos de la lista, si esta se encuentra vacia informa que no hay nodos creados */
void mostrar_lista(struct nodo *p_actual)
{
if(p_actual==NULL) /* la lista se encuentra vacia */
{
return;
}
/* existe la lista */
printf("\n\t\t********* LISTA *********\n"); while(p_actual!=NULL){/* imprime los miembros de cada nodo hasta que el ultimo nodo apunte a NULL */
printf("Nombre: %s ",p_actual
->nombre
); printf("Inventario: %d ",p_actual
->inventario
); printf("Stock: %d --> ",p_actual
->stock
); p_actual=p_actual->siguiente;
} /* fin del while */
}
void buscar_nodo(struct nodo *p)
{
if(p==NULL)//la lista se encuentra vacia
{
return;
}
int opcion,inven;
char name[NOMBRE];
printf("0 - Para busqueda por nombre\n"); printf("1 - Para busqueda por inventario\n"); while(opcion!=0&&opcion!=1)
{
}
switch(opcion)
{
/* la busqueda se realiza por nombre */
case 0:
printf("Ingrese nombre a buscar: "); while((p
!=NULL
)&&strcmp(name
,p
->nombre
)!=0)//preguntar por el orden ??? p=p->siguiente; /* cambia al nodo a su derecha */
if(p==NULL) /* no se encontro el nodo */
printf("Nodo no encontrado\n"); else /* se encontro el nodo */
{
printf("Nombre: %s\n",p
->nombre
); printf("Inventario: %d\n",p
->inventario
); printf("Stock: %d\n",p
->stock
); }
break;
/* la busqueda se realiza por inventario */
case 1:
printf("Ingrese numero de inventario: "); while(p!=NULL&&(p->inventario!=inven))
p=p->siguiente;
if(p==NULL) /* nose encontro nodo */
printf("Nodo no encontrado\n"); else /* se encontro el nodo */
{
printf("Nombre: %s\n",p
->nombre
); printf("Inventario: %d\n",p
->inventario
); printf("Stock: %d\n",p
->stock
); }
}/* fin del switch */
}
void modificar_nodo(struct nodo *p)
{
if(p==NULL) /* la lista se encuentra vacia */
{
printf("Lista vacia. No hay nodos para modificar\n"); return;
}
char name[NOMBRE];
printf("Inserte un nombre para modificar su nodo\n");
while(p
!=NULL
&&strcmp(name
,p
->nombre
)!=0) p=p->siguiente;
if(p==NULL)
printf("El nombre no se encuentra en la lista\n"); else
{
printf("Modifique los campos del nodo\n"); }
}
void insertar_nodo(struct nodo *p)
{
if(p==NULL) /* la lista se encuentra vacia */
{
return;
}
char name[NOMBRE];
printf("Especifique delante de que elemento desea insertar un nodo:\n");
/* bucle de busqueda, del elemento indicado, en la lista */
while(p
!=NULL
&&strcmp(name
,p
->nombre
)!=0) p=p->siguiente;
if(p==NULL)
printf("El elemento no se encuentra en la lista\n"); else{
struct nodo *ptr_nuevo;
ptr_nuevo=crear_nodo();
if(ptr_nuevo==NULL)/* no se reservo memoria */
printf("No se pudo asignar memoria\n"); else{ /* se creo el nuevo nodo; se enlazan los punteros */
ptr_nuevo->siguiente=p->siguiente; /* el nuevo nodo apunta a su derecha. Si es el ultimo nodo donde se inserto apunta a NULL */
p->siguiente=ptr_nuevo; /* el nodo izquierdo del nuevo nodo ahora apunta al nuevo nodo */
} /* fin del else interno */
} /* fin del else externo */
}
void borrar_nodo(struct nodo **cabeza)
{
if(*cabeza==NULL) /* la lista se encuentra vacia */
{
printf("Lista vacia. No hay nodos para borrar\n"); return;
}
struct nodo *actual,*anterior;
char name[NOMBRE];
actual=*cabeza;
printf("Especifique un nombre para borrar su nodo:\n");
/* bucle de busqueda, del elemento indicado, en la lista */
while(actual
!=NULL
&&strcmp(name
,actual
->nombre
)!=0) {
anterior=actual;
actual=actual->siguiente;
}
if(actual==NULL)
printf("El elemento no se encuentra en la lista\n"); else
{/* se distingue entre si el nodo a borrar es la cabeza de la lista o no */
if(actual==*cabeza) /* si el nodo a borrar es la cabeza */
*cabeza=actual->siguiente;/* ahora la *cabeza es el nodo que se encuentra a su derecha */
else /*el nodo a borrar no es la cabeza */
anterior->siguiente=actual->siguiente;/*el nodo anterior al nodo a borrar ahora apunta al nodo que esta a la derecha del nodo a borrar */
free(actual
);//libero el espacio de memoria del nodo borrado }
}
struct nodo *crear_nodo(void)
{
struct nodo *p_crear;
p_crear
=(struct nodo
*)malloc(sizeof(struct nodo
));
if(p_crear==NULL)/* no se pudo almacenar memoria para el nuevo nodo */
return NULL;
/* se creo y se ingresan los campos del nodo */
scanf("%s",p_crear
->nombre
); printf("Ingrese numero de inventario: "); scanf("%d",&p_crear
->inventario
); p_crear->siguiente=NULL;
return p_crear;
}