elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Fallo de segmentación al agregar mas nodos en una lista.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Fallo de segmentación al agregar mas nodos en una lista.  (Leído 2,534 veces)
samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Fallo de segmentación al agregar mas nodos en una lista.
« 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");
}



En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[ASM]Syscall no me funciona + fallo de segmentacion
ASM
ny0x 5 3,792 Último mensaje 14 Junio 2009, 19:38 pm
por ny0x
Fallo de segmentación!!
Programación C/C++
<[(x)]> 6 2,631 Último mensaje 13 Julio 2010, 06:44 am
por nicolas_cof
Fallo en segmentación inexplicable (al menos para mi)
Programación C/C++
Gallu 5 2,353 Último mensaje 18 Julio 2010, 00:21 am
por nicolas_cof
Fallo de segmentación
Programación C/C++
W0lFy 2 3,308 Último mensaje 21 Octubre 2010, 01:09 am
por W0lFy
[?] Fallo de segmentación - C
Programación C/C++
8789poli 3 3,922 Último mensaje 14 Diciembre 2010, 19:50 pm
por 8789poli
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines