Problema con punteros

Iniciado por NEGRO_PABLO, 29 Noviembre 2012, 05:09 AM

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

NEGRO_PABLO

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 : ");
}







x64core

Ordena el codigo y se más especifico con tu problema, pon el codigo con Geshi:

Código (cpp) [Seleccionar]
tucodigo

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

durasno

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
Ahorrate una pregunta, lee el man

twins

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