Ayuda en C

Iniciado por xtremehope, 28 Junio 2012, 22:49 PM

0 Miembros y 1 Visitante están viendo este tema.

xtremehope

alguien podría ayudarme en la Compilación de este programa que me da errores y warning en la programación:




#include <stdlib.h>
#include <stdio.h>
#include <conio.h>


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;
    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\n\t\t 1.-Ingresar persona\n \t\t2.-Imprimir lista\n\t\t3.-Salir\n\n");
    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
                  else
                                {
                                    printf("limite de personas");
                                }
                                    N++;
                  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("fin programa\n\n");
                  break;
                case '4':
                listanueva=busca_persona(listanueva);
                default:
                  printf("seleccion no valida\n\n"); //nos evita
                  break;

      }

    }

    while (opcion!='3');
   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 (auxbuscar->nombre==nombre)
        {
            printf("nombre encontrado\n");
            return auxbuscar;
        }
        auxbuscar=auxbuscar->lista;
    }
    printf ("no co existe\n");
    return auxbuscar;
}


atte: xtreme
Código (cpp) [Seleccionar]
[code=cpp][code=cpp][code=cpp][code=c][code=cpp][/code][/code][/code][/code][/code]hope

durasno

Hola! decidi compilarlo y ver los errores que marca, mira q facil:

1º: en el case 4 llamas a la funcion listanueva=busca_persona(listanueva); pero vos la definiste comopersona *busca_persona(persona *listanueva,char nombre);
Si vas a pasar un nombre a la funcion el prototipo debe ser
persona *busca_persona(persona *listanueva,char *nombre); // el nombre es un puntero a char

2º El warning es por esto:
if (auxbuscar->nombre==nombre) // nose puede comparar de esta manera
para comparar cadenas tenes que usar la funcion strcmp


Saludos
Ahorrate una pregunta, lee el man

avesudra

#2
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:
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 :)

#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!
Regístrate en