Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NEGRO_PABLO en 29 Noviembre 2012, 05:09 am



Título: Problema con punteros
Publicado por: NEGRO_PABLO en 29 Noviembre 2012, 05:09 am
Hola a todos estoy aprendiendo a programar en c y tengo un problema q no puedo solucionar ni buscandolo en internet ... El problema es en la parte de la ordenacion de una lista aqui les dejo el codigo, desde ya muchas graciasss!!!

/******************************************
*                                         *
*  Autor : Singh Pablo Roberto Manuel     *
*  Ejercicio nro 10                       *
*                                         *
******************************************/


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define V         1
#define F         0
#define M         20

struct tauto
{
       int codigo;
       char marca[M];
       char modelo[M];
       char color[M];
       struct tauto *sig;
};
typedef struct tauto coche;


//Prototipos.-
void menu();
void agregar (coche ** , int *);
void borrar  (coche ** , int *);
void buscar  (coche ** , int *);
void ordenar (coche ** , int *);
void mostrar (coche ** , int *);
void copiar  (coche  ** , coche  ** );

int main()
{
    int ind=0,*indx;       //Indice de cantidad de elementos en la lista
    indx=&ind;
   
    char opcion='z';         //Opcion para el menu
   
    coche *cabeza;
    cabeza=NULL;             
   
    //======== Bucle Menu ========//
    for ( ; opcion!='s' && opcion!='S' ; )
    {
        menu();
        fflush(stdin);
        printf("%c\n",opcion=getch());
        switch (opcion)
        {
               case '1': agregar(&cabeza,indx);
                         break;
               case '2': borrar(&cabeza,indx);
                         break;
               case '3': buscar(&cabeza,indx);
                         break;
               case '4': ordenar(&cabeza,indx);
                         break;
               case '5': mostrar(&cabeza,indx);
                         break;
               case 'S':;
               case 's': printf("\nCerrando programa...\n");
                         break;
               default:
                       printf("\nIngrese una opcion valida...\n\n");
                       system("pause");
                       break;     
       }
    }
    //======== Fin Bucle Menu ========//
    system("pause");
    return 0;
}

void agregar( coche **cabeza, int *indx)
{
     coche *p;
     p=NULL;
     if ( (*cabeza)==NULL )
     {
        printf("Lista vacia.-\n");
       
        p=(coche *)malloc(sizeof(coche));
     
        printf("\nAuto nro %i : ",*indx+1);
        printf("\n\tCodigo :  ");
        scanf("%i",&p->codigo);
        printf("\tMarca :   ");
        scanf("%s",p->marca);
        printf("\tModelo :  ");
        scanf("%s",p->modelo);
        printf("\tColor :   ");
        scanf("%s",p->color);
       
        p->sig=NULL;
        (*cabeza)=p;
     }
     else
     {
        p=(coche *)malloc(sizeof(coche));
     
        printf("\nAuto nro %i : ",*indx+1);
        printf("\n\tCodigo :  ");
        scanf("%i",&p->codigo);
        printf("\tMarca :   ");
        scanf("%s",p->marca);
        printf("\tModelo :  ");
        scanf("%s",p->modelo);
        printf("\tColor :   ");
        scanf("%s",p->color);
       
        p->sig=(*cabeza);
        (*cabeza)=p;
     }
     (*indx)=(*indx+1);
     printf("\n");
     system("pause");
}

void borrar ( coche **cabeza,int *indx )
{
     int i,codigo=0,flag=F;
     
     coche *p,*anterior=NULL;
     p=(*cabeza);
     
     printf("\nIngrese el codigo del auto a borrar : ");
     scanf("%i",&codigo);
     
     for (i=0;i<(*indx);i++)
     {
         if  ( anterior==NULL )
         {
             if  ( p->codigo==codigo )
            {
                  (*cabeza)=p->sig;
                  free(p);
                  //p=cabeza;
                  (*indx)=(*indx-1);
                  flag=V;
                  printf("\nSe borro con exito! .- \n");
                  break;
            }else
            {
                 anterior=p;
                 p=p->sig;
            }
         }
         else
         {
              if  ( p->codigo==codigo )
              {
                  anterior->sig=p->sig;
                  free(p);
                  (*indx)=(*indx-1);
                  flag=V;
                  printf("\nSe borro con exito! .- \n");
                  break;
              }else
              {
                   anterior=p;
                   p=p->sig;
              }
         }
     }
     if ( flag == F )
        printf("\nNo se encontro el auto.- \n");
     printf("\n");
     system("pause");     
}


void buscar ( coche **cabeza,int *indx )
{
     int i,flag=F;
     char mod[M];
     
     coche *p;
     p=(*cabeza);
     
     printf("\nIngrese el modelo a buscar : ");
     scanf("%s",&mod);
     printf("Auto : ");
     
     for ( i=0;i<(*indx);i++ )
     {
         if ( strcmp(p->modelo,mod)==0 )
         {
            printf("\n\tCodigo :  %i",p->codigo);
            printf("\n\tMarca :   %s",p->marca);
            printf("\n\tModelo :  %s",p->modelo);
            printf("\n\tColor :   %s\n\n",p->color);
            flag=V;
            break;
         }else
              p=p->sig;
     }
     if ( flag == F )
        printf("\n\tNo encontrado.-\n");
     printf("\n");
     system("pause");
}


void mostrar( coche **cabeza,int *indx)
{
     int i;
     coche *p;
     p=(*cabeza);
     
     printf("\n======Mostrando======\n");
     printf("\nElementos en la lista : %i \n",*indx);
     for (i=0;i<(*indx);i++)
     {
         printf("\nAuto nro %i : ",i+1);
         printf("\n\tCodigo :  %i",p->codigo);
         printf("\n\tMarca :   %s",p->marca);
         printf("\n\tModelo :  %s",p->modelo);
         printf("\n\tColor :   %s\n\n",p->color);
         
         p=p->sig;
     }
     printf("\n");
     system("pause");
}

void copiar (coche **d, coche **f)
{
     coche *temp,*dest,*fuent;
     
     dest=(*d);
     fuent=(*f);
     
     temp->codigo=dest->codigo;
     strcpy ( temp->marca,dest->marca );   
     strcpy ( temp->modelo,dest->modelo );   
     strcpy ( temp->color,dest->color );   
     
     dest->codigo=fuent->codigo;
     strcpy ( dest->marca,fuent->marca );   
     strcpy ( dest->modelo,fuent->modelo );   
     strcpy ( dest->color,fuent->color );   
     
     fuent->codigo=temp->codigo;
     strcpy ( fuent->marca,temp->marca );   
     strcpy ( fuent->modelo,temp->modelo );   
     strcpy ( fuent->color,temp->color );
     
}

void ordenar( coche **cabeza,int *indx )
{
     int i,j;
     coche *p,*aux;
     p=(*cabeza);
     
     printf("\nElementos en la lista : %i \n",*indx);
     for (i=0;i<(*indx)-1;i++)
     {   
         aux=p;     
         for (j=i+1;j<(*indx);j++)
         {
             printf("\n[%i][%i]",i,j);
             aux=aux->sig;
             if (strcmp(p->marca,aux->marca)>0)
             { 
                printf("\ncambio");
                copiar(&p,&aux);
             }
         }
         p=p->sig;
     }
     printf("\nLista Ordenanda .-\n");
     system("pause");
}

   
void menu()
{
     system("cls");
     printf("\n==============MENU==============");
     printf("\n1)Agregar");
     printf("\n2)Borrar");
     printf("\n3)Buscar");
     printf("\n4)Ordenar");
     printf("\n5)Mostrar");
     printf("\nS)Salir.-");
     
     printf("\n\n\t\tOpcion : ");
}








Título: Re: Problema con punteros
Publicado por: x64core en 29 Noviembre 2012, 06:55 am
Ordena el codigo y se más especifico con tu problema, pon el codigo con Geshi:

Código
  1. tucodigo

escribe detalles, linea del error, y depura el codigo.


Título: Re: Problema con punteros
Publicado por: durasno en 29 Noviembre 2012, 15:41 pm
Hola! nose con que estas compilando pero seguro te mostro bastantes warning, deberias prestarle atencion ya que te puede ayudar a encontrar el error... ayuda: mira en la funcion copiar() cual es el problema con temp



Saludos


Título: Re: Problema con punteros
Publicado por: twins en 30 Noviembre 2012, 18:41 pm
El problema no es nada grave, primero para leer una cadena de caracteres no necesitas el & y lo otro para usar la funcion strcpy necesitas incluir la libreria string.h saludos