Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: samur88 en 19 Enero 2011, 15:08 pm



Título: Fallo de segmentación al agregar mas nodos en una lista.
Publicado por: samur88 en 19 Enero 2011, 15:08 pm
Saludos, tengo un problemita a ver si podéis ayudarme a solucionarlo, tengo el siguiente programa que lo que hace es meter datos en una cola, en este caso serian códigos de articulo, y luego mediante una función de comparación  extraigo los datos de la cola y agrego esos datos en otra lista de manera que solo haya un nodo por cada código de articulo y la cantidad de dicho articulo.
El programa me compila y me funciona, pero el caso es que cuando agrego más de un determinado número de nodos el programa da errores y se produce fallo de segmentación.
Los nodos en la cola los agrego mediante la función add_nod().

He dejado el código con el fallo de segmentación si quitáis una llamada a la función add_nod el programa funciona y no da errores.
He usado el entorno de programación Dev C++ y estoy en Windows XP.

Código:
#include <stdio.h>
#include <stdlib.h>

typedef struct nodo_art {
         int Codigo;
         struct nodo_art *sig;
        }lista;

typedef struct Articulo {
       int Codigo,Cant_Pedida;
       struct Articulo *sig;
      }TLista;

/* Agrega nodos a la cola */

int add_nod(lista **first,lista **ultimo,int Codigo){
 lista *nuevo;
 nuevo = (lista *) malloc (sizeof(lista));
 nuevo->Codigo = Codigo;
 nuevo->sig = NULL;     
 if(*first == NULL){
             *first = nuevo;
             *ultimo = nuevo;
            } else {
                   (*ultimo)->sig = nuevo;
                   *ultimo = nuevo;
              }
}
/* Extrae nodos de la cola */
int ext_nod(lista **first,lista **ultimo){
     lista *aux;
     int v;
     
     aux = *first;
     if(aux == NULL){return -1;}
     *first = (*first)->sig;
     v = aux->Codigo;
     free(aux);
     if(*first == NULL)
      *ultimo = NULL;
     return v;
    }

   
/* Funcion para agregar nodos a lista de Articulos, las llamadas a esta función las hace la función lol */
void add_tnod(TLista **primero,int Codigo,int Cantidad){
 TLista *nuevo,*aux;
 nuevo = (TLista *) malloc (sizeof(TLista));
 nuevo->Codigo = Codigo;
 nuevo->Cant_Pedida = Cantidad;
 nuevo->sig = NULL;     
 if(*primero == NULL){
             *primero = nuevo;
            } else {
                   aux = *primero;
                   while(aux->sig != NULL){
                   aux = aux->sig;
              }
             aux->sig = nuevo;
             }
}

/* Función de comparación, lo que hace es si un articulo esta en la cola pero no esta en la lista, lo extrae
   de la cola y lo inserta en la lista, si el articulo ya se encuentra en la lista, lo extrae de la cola
   e incrementa en 1 el campo Cantidad del articulo en cuestión dentro de la lista */
int lol(lista **primero,lista **ultimo,TLista **tprimero){
     lista *aux;
     TLista *aux2;
     int v,a;
     v = 0;
     a = 0;

     aux = *primero;
     while(aux != NULL){
      aux2 = *tprimero;
      if(aux2 == NULL){
         v = ext_nod(primero,ultimo);     
         add_tnod(tprimero,v,1);
         aux2 = *tprimero;
         aux = *primero;
        }
          while(aux2 != NULL){
           if(aux->Codigo == aux2->Codigo){
            a = aux2->Cant_Pedida;
            aux2->Cant_Pedida = a+1;
            ext_nod(primero,ultimo);
            aux = *primero;
            }else{
                   add_tnod(tprimero,aux->Codigo,1);
                   ext_nod(primero,ultimo);
                   aux = *primero;
                  }         
            aux2 = aux2->sig;
         }
     }
}

/* Función para visualizar la lista */
int see_tlist(TLista *tprimero){
      TLista *auxiliar;
       
      auxiliar = tprimero;
      if (auxiliar == NULL) {printf( "La lista esta vacia!!\n" ); return 0; }
      while (auxiliar!=NULL) {
             printf("Codigo:%d Cantidad:%d\n",auxiliar->Codigo,auxiliar->Cant_Pedida);             
             auxiliar = auxiliar->sig;
            }
     }

int main(){
  lista *primero,*ultimo;
  TLista *tprimero;
  primero = NULL;
  ultimo = NULL;
  tprimero = NULL;
 
  add_nod(&primero,&ultimo,45434);
  add_nod(&primero,&ultimo,45434);
  add_nod(&primero,&ultimo,45434);
  add_nod(&primero,&ultimo,2334);
  add_nod(&primero,&ultimo,111223);
  add_nod(&primero,&ultimo,8989);
  add_nod(&primero,&ultimo,2122);
  add_nod(&primero,&ultimo,2122);
  add_nod(&primero,&ultimo,2233);
  lol(&primero,&ultimo,&tprimero);
  see_tlist(tprimero);
  system("pause");
}