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