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