Bueno se me ha adelantado durasno , la proxima vez que postees , por favor pon las etiquetas GeSHi y los errores , verás que pronto acuden los usuarios a ayudar. Y lo que te venia diciendo durasno corregido , mas una cosa ¿Porqué utilizas conio.h? para hacer el getch , simplemente en vez de utilizar valores enteros de carácteres para comparar en el switch ,utiliza valores enteros que es mas fácil , y recoges la opcion con:
Te dejo el código corregido , he dejado los comentarios y eso , he añadido la función de buscar persoa para que te buscase un nombre que tu le metieses también , y los problemillas puntuales que salían
¡Un saludo!
Código (c) [Seleccionar]
scanf("%d",&opcion);Te dejo el código corregido , he dejado los comentarios y eso , he añadido la función de buscar persoa para que te buscase un nombre que tu le metieses también , y los problemillas puntuales que salían
Código (c) [Seleccionar]
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//#include <conio.h> Omitido , acostumbrate a no usarla...
typedef struct perso//definimos la estructura que usaremos, debemos tener cuidado de no elegir los mismo nombres
//para la definicion de la variable y para la variable
{
char nombre [30];
char apellido [30];
int edad;
struct perso *lista;
} persona;
void ingrese_persona(persona *p);//declaramos las funciones
void imprima_persona(persona *p);
persona *busca_persona(persona *listanueva,char *nombre);
persona *agregar_persona(persona*lista);
int main ()
{
int opcion=0,N=0;
persona *listanueva=NULL;
char nombpersbusc[30];//Variable para albelgar el nombre de la persona a buscar.
do //ciclo do while para evitar seleccionar un numero que no este entre las opciones
{
printf ("\n\nMenu:\n\n");
printf("Seleccione una opcion:\n\t\t");
printf("\n\n\t\t 1.-Ingresar persona");
printf("\n\t\t2.-Imprimir lista");
printf("\n\t\t3.Buscar persona");
printf("\n\t\t4.-Salir\n\n");
scanf("%d", &opcion);
//opcion=getch();//se ocupa getch() y no getchar() o si no me devuelve dos veces el menu cada vez y nos lee el caracter desde teclado, parecido a scanf
switch (opcion)
{
case 1://definimos las opciones y sus correspondientes valores
if(N<5)
{
printf("Selecciono opcion: 1\n\n");
listanueva=agregar_persona(listanueva);//llama a funcion
N++;
}
else
printf("limite de personas");
break;
case 2:
printf("Selecciono opcion: 2\n\n");
imprima_persona(listanueva);//llama para imprimri
break;
case 3:
printf("Selecciono opcion:3\n\n");
printf("Digame el nombre de la persona a buscar:");
scanf("%s",nombpersbusc);
listanueva=busca_persona(listanueva,nombpersbusc);
break;
default:
printf("seleccion no valida\n\n"); //nos evita
break;
}
}
while (opcion!=4);
return 0;
}
void ingrese_persona (persona *p)
{
printf("\nIngrese nombre: ");
scanf("%s", p->nombre);
printf("Ingrese apellido: ");
scanf("%s", p->apellido);
printf("Ingrese edad: ");
scanf("%d", &(p->edad));
p++;
p->lista=NULL;
}
void imprima_persona(persona *p)
{
persona *aux3=p;
while (aux3!=NULL)
{
printf(" %s %s (%d años)\n",aux3->nombre, aux3->apellido, aux3->edad);
aux3=aux3->lista;//definimos un puntero auxiliar para evitar que el puntero quede en nULL
}
}
persona *agregar_persona(persona *auxlista)//definicion de puntero a persona lista
{
persona *aux2lista=(persona*)malloc(sizeof(persona));//reservamos con memoria dinamica un espacio para el puntero
ingrese_persona(aux2lista);//agregamos la funcnio
aux2lista->lista=NULL;//ahora debemos usar un puntero auxiliar para que asi lista nos quede apuntando a NULL
if (auxlista==NULL)
{
auxlista=aux2lista;//si el puntero auxiliar es igual a NULL quedara apuntando a NUll
}
else
{
persona *actual=auxlista,*anterior;//creacion de dos punteros para recorrer la lista
while (actual!=NULL)
{
anterior=actual;//anterior queda apuntando a actual
actual=actual->lista;//actual apunta al siguietne
}
anterior->lista=aux2lista;//de esta forma se genera que el puntero no este apuntando a NULL si no al puntero siguiente
}
return(auxlista);//devuleve el puntero a lista
}
persona *busca_persona(persona *listanueva,char *nombre)
{
persona *auxbuscar=listanueva;
while (auxbuscar!=NULL)
{
//if (strcmp(auxbuscar->nombre,nombre)==0) Para comparar cadenas utiliza strcmp!!!!!
if(strcmp(auxbuscar->nombre,nombre)==0)
{
printf("nombre encontrado\n");
return auxbuscar;
}
auxbuscar=auxbuscar->lista;
}
printf ("no existe\n");
return auxbuscar;
}
¡Un saludo!

, por cierto me he dado cuenta de que en el source que he puesto falta una carpeta llamada recursos que es donde está el .glade que le da la interfaz al programa y también he cambiado algunas cosillas para no tener problemas con las codificaciones de Windows y Linux así que lo actualizo y edito los links del post inicial.
