Hola, el siguiente programa añade nodo al principio, al final, recorre la lista, busca nodo, elimina nodo y añade después de un nodo determinado. Sólo utilizo un dato de tipo char. He intentado añadir otro dato y hacer las operaciones, pero no me sale bien. A ver si alguien puede ayudarme. Gracias.
Código C:
Ver original#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEE_CAD(c,n) { int i=0; \
c[i]=getchar();\
while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
while ((c[i]!='\n') && (i < (n-1))){ \
i++;\
c[i]=getchar(); }\
c[i]='\0'; }
#define T_NOM 101
struct persona {
char nom[100];
struct persona *siguiente;
};
int main(){
struct persona *lista=NULL;
struct persona *nodo;
int op;
void alta_inicio();
void alta_final();
void alta_despues_de();
void recorrer_lista();
void borrar_nodo();
struct persona * buscar_nodo();
do{
do{
printf("Elija una opción:\n"); printf("1--> Añadir al principio.\n"); printf("2--> Añadir al final.\n"); printf("3--> Recorrer la lista.\n"); printf("4--> Buscar nodo.\n"); printf("5--> Eliminar nodo.\n"); printf("6--> Añadir despues de...\n"); }while((op < 1) || (op > 7));
if(op != 7)
switch(op){
case 1: { alta_inicio(&lista);break;}
case 2: { alta_final(&lista);break;}
case 3: { recorrer_lista(&lista);break;}
case 4: { nodo=buscar_nodo(&lista);
printf("\n%s\n",nodo
->nom
);break; case 5: { borrar_nodo(&lista);break;}
case 6: { alta_despues_de(&lista);break;}
}
}while(op != 7);
}
////////////////////////////////////////////////////////////////////////////
void alta_inicio(struct persona **lista){
struct persona *nuevo_nodo;
nuevo_nodo
=(struct persona
*)malloc(sizeof(struct persona
)); if(nuevo_nodo != NULL){
nuevo_nodo->siguiente = *lista;
*lista = nuevo_nodo;
LEE_CAD(nuevo_nodo->nom,T_NOM);
}
}
////////////////////////////////////////////////////////////////////////////////
void recorrer_lista(struct persona **lista){
struct persona *nodo_aux;
nodo_aux = *lista;
while(nodo_aux != NULL){
nodo_aux = nodo_aux->siguiente;
}
}
//////////////////////////////////////////////////////////////////////////////
void alta_final(struct persona **lista){
struct persona *nuevo_nodo;
struct persona *nodo_aux;
nuevo_nodo
=(struct persona
*)malloc(sizeof(struct persona
)); if(nuevo_nodo != NULL){
nodo_aux = *lista;
while(nodo_aux->siguiente != NULL)
nodo_aux = nodo_aux->siguiente;
nodo_aux->siguiente=nuevo_nodo;
nuevo_nodo->siguiente=NULL;
printf("Nombre del nuevo elemento: "); LEE_CAD(nuevo_nodo->nom,T_NOM);
}
else
printf("Error al tomar memoria del nuevo nodo.\n"); }
/////////////////////////////////////////////////////////////////////////////////
struct persona *buscar_nodo(struct persona **lista){
struct persona *nodo_aux, *resultado;
char nom[100];
char edad[3];
int encontrado = 0;
nodo_aux = *lista;
while((nodo_aux->siguiente != NULL) && (!encontrado)){
if(strcmp(nom
,nodo_aux
->nom
) == 0) encontrado = 1;
else
nodo_aux = nodo_aux->siguiente;
}
if((nodo_aux->siguiente == NULL) && (!encontrado))
if(strcmp(nom
,nodo_aux
->nom
) == 0) encontrado = 1;
if(encontrado)
resultado = NULL;
return(resultado);
}
////////////////////////////////////////////////////////////////////////////////
void borrar_nodo(struct persona **lista){
struct persona *nodo_aux, *nodo_anterior;
char nom[100];
char edad[3];
int encontrado = 0;
nodo_aux = *lista;
if(strcmp(nom
,nodo_aux
->nom
) == 0){ *lista=nodo_aux->siguiente;
else{
nodo_anterior = nodo_aux;
nodo_aux = nodo_aux->siguiente;
while((nodo_aux->siguiente != NULL) && (!encontrado)){
if(strcmp(nom
,nodo_aux
->nom
) == 0) encontrado = 1;
else{
nodo_anterior = nodo_aux;
nodo_aux = nodo_aux->siguiente;
}
}
if((nodo_aux->siguiente == NULL) && (!encontrado))
if(strcmp(nom
,nodo_aux
->nom
) == 0) encontrado = 1;
if(encontrado){
nodo_anterior->siguiente = nodo_aux->siguiente;
}
}
}
///////////////////////////////////////////////////////////////////////////////
void alta_despues_de(struct persona **lista){
struct persona *nuevo_nodo;
struct persona *nodo_aux;
char nom[100];
char edad[3];
int encontrado = 0;
printf("Nombre a buscar para insertar después de el: ");
nuevo_nodo
=(struct persona
*)malloc(sizeof(struct persona
));
if(nuevo_nodo != NULL){
nodo_aux = *lista;
while((nodo_aux->siguiente != NULL) && (!encontrado)){
if(strcmp(nom
,nodo_aux
->nom
) == 0) encontrado = 1;
else{
nodo_aux = nodo_aux->siguiente;
}
}
if((nodo_aux->siguiente == NULL) && (!encontrado))
if(strcmp(nom
,nodo_aux
->nom
) == 0) encontrado = 1;
if(encontrado){
nuevo_nodo->siguiente=nodo_aux->siguiente;
nodo_aux->siguiente=nuevo_nodo;
printf("Nombre del nuevo elemento: "); scanf("%99s",nuevo_nodo
->nom
); }
else{
printf("Elemento no encontrado.\n"); }
}
}