Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: attackers en 24 Noviembre 2011, 18:01 PM

Título: mostrar contactos de una agenda por equipo
Publicado por: attackers en 24 Noviembre 2011, 18:01 PM
amigos tengo una agenda pero quiero una opcion de mostrar todos los contactos que sean del equipo caraquista

aqui le dejo el codig paa ver si me pueden ayudar




#include <stdio.h>

struct _agenda {
       char nombre[20];
       char telefono[12];
       char equipo[20];
       struct _agenda *siguiente;
       };

struct _agenda *primero, *ultimo;

void mostrar_menu() {
     system("cls");
     printf("\n\nMenu:\n=====\n\n");
     printf("1.- Agregar elementos\n");
     printf("2.- Borrar elementos\n");
     printf("3.- Mostrar contacto\n");
     printf("4.- Mostrar contacto magallanero\n");
     printf("5.- Salir\n\n");
     printf("Escoge una opcion: ");fflush(stdout);
}

void anadir_elemento() {
     struct _agenda *nuevo;

     /* reservamos memoria para el nuevo elemento */
     nuevo = (struct _agenda *) malloc(sizeof(struct _agenda));
     if (nuevo==NULL) printf( "No hay memoria disponible!\n");

     printf("\nNuevo elemento:\n");
     printf("Nombre: "); fflush(stdout);
     gets(nuevo->nombre);
     printf("Telefono: "); fflush(stdout);
     gets(nuevo->telefono);
     printf("Equipo: "); fflush(stdout);
     gets(nuevo->equipo);

     /* el campo siguiente va a ser NULL por ser el último elemento
        de la lista */
     nuevo->siguiente = NULL;


     if (primero==NULL) {
        printf( "Primer elemento\n");
        primero = nuevo;
        ultimo = nuevo;
        }
     else {
          /* el que hasta ahora era el último tiene que apuntar al nuevo */
          ultimo->siguiente = nuevo;
          /* hacemos que el nuevo sea ahora el último */
          ultimo = nuevo;
     }
}



void mostrar_lista() {
     struct _agenda *auxiliar;
     int i;

     i=0;
     auxiliar = primero;
     printf("\nMostrando la lista completa:\n");
     while (auxiliar!=NULL) {
           printf( "Nombre: %s \n Telefono: %s \n equipo: %s\n",
                   auxiliar->nombre,auxiliar->telefono,auxiliar->equipo);
           auxiliar = auxiliar->siguiente;
           i++;
     }
     if (i==0) printf( "\nLa agenda esta vacia!!\n" );
}



void mostrar_magallanes() {

     int x;
           struct _agenda *auxiliar;
     printf("\nLos contacto magallaneros son: \n");
     
     for(x=0; x < 5; x++)
         {
     if(strcmp(primero->equipo[x],"magallanero") == 0)
        {
     printf("los contactos magallanero son");
   printf("\nEl nombre es: %s \n",auxiliar->nombre[x]);
   printf ("el telefono: %s  \n",auxiliar->telefono[x]);
   
          }
          }
          }


void borrar_elemento(){

 free(primero=NULL);

                    }

int main() {
    char opcion;

    primero = (struct _agenda *) NULL;
    ultimo = (struct _agenda *) NULL;
    do {
        mostrar_menu();
        opcion = getch();
            switch ( opcion ) {
               case '1': anadir_elemento();
                      break;
               case '2':  borrar_elemento();
                       break;
               case '3': mostrar_lista(primero);
                       break;
               case '4': mostrar_magallanes();
               break;
               
               case '5': exit( 1 );
               default: printf( "Opción no válida\n" );
                        break;
            }
    } while (opcion!='5');
}





http://pastebin.com/SvxGbaRZ

en la linea 75 a 91 esta la funcion que mas o menos quiero pero no se trabajar con punteros
Título: Re: mostrar contactos de una agenda por equipo
Publicado por: satu en 24 Noviembre 2011, 19:20 PM
Hola

Te pongo sólo el código de la función

void mostrar_magallanes()
{
    struct _agenda *auxiliar = primero;
    printf("\nLos contacto magallaneros son: \n");

    while(auxiliar != NULL)
    {
        if(strcmp(auxiliar->equipo,"magallanero") == 0)
        {
            printf("\nEl nombre es: %s \n",auxiliar->nombre);
            printf ("el telefono: %s  \n",auxiliar->telefono);
        }
        auxiliar = auxiliar->siguiente;
    }
}


Saludos
Título: Re: mostrar contactos de una agenda por equipo
Publicado por: attackers en 24 Noviembre 2011, 21:50 PM
amigo y para eliminar un contacto en especifico por que como yo lo tengo borra TODOS los contactos  me podrias pasar esa funcion ??
Título: Re: mostrar contactos de una agenda por equipo
Publicado por: satu en 24 Noviembre 2011, 22:20 PM
Hola

Para borrar un único elemento sería algo así:


void borrar_elemento()
{
    int borrado = 0;
    char nombre[20];
    struct _agenda *auxiliar1 = primero, *auxiliar2 = NULL;

    printf("Introduce el nombre:");
    scanf("%s", nombre);
    while(getchar() != '\n'); //Limpiamos el buffer

    while((auxiliar1 != NULL) && (borrado == 0))
    {
        if(strcmp(auxiliar1->nombre, nombre) == 0)
            borrado = 1;
        else
        {
            auxiliar2 = auxiliar1;
            auxiliar1 = auxiliar1->siguiente;
        }
    }

    if(borrado == 1)
    {
        if(auxiliar1 == primero)
        {
            primero = primero->siguiente;
            auxiliar1->siguiente = NULL;
            free(auxiliar1);
        }
        else
            if(auxiliar1 == ultimo)
            {
                ultimo = auxiliar2;
                ultimo->siguiente = NULL;
                free(auxiliar1);
            }
            else
            {
                auxiliar2->siguiente = auxiliar1->siguiente;
                auxiliar1->siguiente = NULL;
                free(auxiliar1);
            }
        printf("El elemento con nombre %s ha sido borrado\n", nombre);
    }
    else
        printf("El elemento con nombre %s no se encuentra\n", nombre);
}


Lo he hecho a ojo sin probarlo pero los tiros van por ahí.

Saludos