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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Temas
Páginas: 1 [2] 3
11  Programación / Programación C/C++ / Anidar una lista enlazada dentro de otra en C. en: 25 Enero 2011, 18:44 pm
Hola muy buenas.
Tengo una duda sobre si es posible anidar listas enlazadas, es decir una lista enlazada por cada nodo que cree de otra lista enlazada.
He hecho un código, parece funcionar, pero solo me muestra el ultimo nodo insertado, dejo el código aquí puesto por si podeís ayudarme a corregir los posibles errores que pueda a ver o si no es posible anidar una lista dentro de otra.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct Articulo {
  5.       int numero;
  6.       int numero2;
  7.       struct Articulo *sig;
  8.      }TLista;
  9.  
  10. typedef struct nodo_art {
  11.         int codigo;
  12.         TLista *primero;
  13.         struct nodo_art *sig;
  14.        }lista;
  15.  
  16. int add_nod(lista **first,int a,int b,int c){
  17. lista *nuevo,*aux;
  18. TLista *nuevonum,*aux2;
  19. nuevo = (lista *) malloc (sizeof(lista));
  20. nuevonum = (TLista *) malloc (sizeof(TLista));
  21. nuevo->codigo = a;
  22. nuevo->sig = NULL;
  23. nuevo->primero = NULL;
  24.  
  25.  
  26. nuevonum->numero = b;
  27. nuevonum->numero2 = c;
  28. nuevonum->sig = NULL;
  29.  
  30.   if(nuevo->primero == NULL){
  31.             nuevo->primero = nuevonum;
  32.            } else {
  33.               aux2 = nuevo->primero;
  34.               while(aux2->sig != NULL){
  35.                 aux2 = aux2->sig;
  36.                }
  37.               aux2->sig = nuevonum;
  38.              }
  39.  
  40. if(*first == NULL){
  41.             *first = nuevo;
  42.            } else {
  43.               aux = *first;
  44.               while(aux->sig != NULL){
  45.                 aux = aux->sig;
  46.                }
  47.               aux->sig = nuevo;
  48.              }
  49. }
  50.  
  51.  
  52. int see_list(lista *first){
  53. lista *aux;
  54.  
  55. if(first == NULL){return -1;}
  56. while(aux != NULL){
  57.  printf("%d- %d %d\n",aux->codigo,aux->primero->numero,aux->primero->numero2);
  58.  aux = aux->sig;
  59. }
  60. }
  61.  
  62.  
  63. int main(){
  64.    lista *first;
  65.    first = NULL;
  66.  
  67.    add_nod(&first,5,3,5);
  68.    add_nod(&first,3,2,7);
  69.  
  70.    add_nod(&first,4,3,2);
  71.    see_list(first);
  72.    getchar();
  73. }
  74.  
  75.  
Un saludo y gracias por todo.
12  Programación / ASM / ¿Dudas sobre si aprender primero ASM del pic o del microprocesador? en: 20 Enero 2011, 00:12 am
Saludos a todos.
El caso es que quiero aprender ensamblador, pero me interesaría aprender tanto el ensamblador de los microcontroladores, en principio el del pic 16f84 aunque por lo que tengo el ensamblador de ese pic es muy parecido al de otros pics de la familia de microchips.
Quiero aprender también ensamblador del microprocesador de los ordenadores actuales, el caso es que no se por cual empezar, no se si es mejor empezar por el ensamblador de los pic y luego pasar al de los microprocesadores o por el contrario aprender primero el del microprocesador y luego pasar al del microcontrolador.
¿es muy diferente uno de otro?¿el hecho de aprender uno, hace que el otro sea mas fácil de aprender?
Espero que podaís ayudarme.
Un saludo.
13  Programación / Programación C/C++ / 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");
}

14  Programación / Programación C/C++ / ¿Errores en los enunciados de un examen de C? en: 13 Enero 2011, 14:27 pm
Saludos, mire tengo el siguiente problema, el caso es que un profesor me ha puesto el siguiente ejercicio en un examen, no quiero que me lo resolváis ni nada por el estilo, lo único que necesito que me digáis si este profesor esta cometiendo algunas locuras en los ejercicios.

Veréis se como implementar una cola en C lo he echo otras veces y me funciona perfectamente, pero el caso es que en el examen de este hombre me he encontrado con lo siguiente y esta poniendo en duda mis conocimientos sobre C:

Dada la siguiente declaración:
Código:
struct Componente {
 int dato;
 struct Componetne  *sig
}
typedef Componente *Puntero;
struct Cola { Puntero principio, final; }

El dice que eso es la implementación de una cola , yo la verdad veo algunos errores en ese codigo para que eso sea dicha implementación pero bueno vosotros me diréis.
Luego sobre esa estructura de datos que el denomina cola, quieres que hagamos una serie de operaciones sobre la cola:
Citar
Inicializar la cola.
Primero: Devuelve el elemento que ocupe la primera posición.
Encolar: Introduce un nuevo elemento en la cola.
SacarCola: Elimina el elemento en la cabeza de la cola. (Aquí veo otro error si hablamos de colas solo puedo sacar de ella el ultimo elemento, otra cosa es que sean Bicolas, pero el eso no lo ha explicado)
Vacia: Averigua si la cola no tiene nada en su interior.

Un saludo, espero que podáis ayudarme.

15  Programación / Programación C/C++ / Problemas con punteros en listas. en: 4 Enero 2011, 03:00 am
Saludos.

Tengo la siguiente duda:
Tengo el siguiente codigo fuente de una lista circular:

Código:

#include <stdio.h>
#include <stdlib.h>

typedef struct listacompleta {
         int dato;
         struct listacompleta *next;
        }lista;


void add_nod(lista **nodoe, int dato){
 lista *nuevo,*aux;
 nuevo = (lista *) malloc (sizeof(lista));
 nuevo->dato = dato;
 aux = *nodoe;
 if(*nodoe == NULL ){
             nuevo->next = nuevo;
             *nodoe = nuevo;
            } else{
              /* *nodoe = *nodoe->next; */
               nuevo->next = aux->next;
               aux->next = nuevo;
              }
}



int main(){
 lista *nodoe;
 nodoe = NULL;
 
 add_nod(&nodoe,8);
 add_nod(&nodoe,2);
 add_nod(&nodoe,3);
 add_nod(&nodoe,5);

 system("pause");
 return 0;

}


El caso es que dentro de add_nod la linea que esta comentada no me compila, pero me gustaría avanzar en uno el elemento nodoe para agregar elementos a partir del ultimo insertado en la lista circular, como puedo hacer eso y por que me da error al compilar, me he mirado el error y creo que es porque es un puntero de puntero, pero no se como solucionarlo.

Un saludo y gracias a todos.
16  Programación / Programación C/C++ / ¿Lista circular en C bien implementada? en: 2 Enero 2011, 02:31 am
Saludos y un Feliz Año Nuevo a todos  :)
Comiendo preguntando mi primera duda del año jeje

Me gustaría saber si he implementando bien las listas circulares en C.
El código para añadir elementos a la lista es el siguiente:

Código:
void add_nod(lista **nodoe, int dato){
 lista *nuevo,*aux;
 nuevo = (lista *) malloc (sizeof(lista));
 nuevo->dato = dato;
 aux = *nodoe;
 
 if(*nodoe == NULL ){
             nuevo->next = nuevo;
             *nodoe = nuevo;
            } else{
               nuevo->next = aux->next;
               aux->next = nuevo;
              }
}

Un saludo.
17  Programación / Programación C/C++ / ¿Función bien implementada para borrar elementos en listas? en: 22 Diciembre 2010, 01:49 am
Hola ^^
Saludos a todos.
Estoy liado con las listas en C y he creado la siguiente función, me gustaría saber si esta bien implementada para no tener luego problema con los punteros.

Código:
int del_list(lista **primero,int a){
      lista *aux,*ant;
      if(a == 0){printf("El elemento no existe\n"); return 0;}
      /* if a es mayor que los elementos que contiene la lista, el elemento no existe */
      if(a == 1){
           ant = *primero;
           *primero = ant->next;
           free(ant);
      } else{
            a = a - 2;
            ant = *primero;
            while(a >0 && aux != NULL){
              ant = ant->next;
              a--;
             }
            aux = ant->next;
            ant->next = ant->next->next;
            free(aux);
           }
     }

Lo ultimo que me faltaría por hacer es que si introduzco un elemento mayor que el numero de elementos que contiene la lista me diga elemento invalido, pero por lo demás me gustaría saber si esta bien implementada.
Un saludo.
18  Programación / Programación C/C++ / Problema al insertar en listas abiertas. en: 2 Diciembre 2010, 12:15 pm
Saludos.
El tema de las listas en C me esta volviendo loco, a ver si podéis ayudarme en el siguiente error.
Tengo la siguiente lista abierta, el caso es que el programa me compila pero supuestamente en la lista solo esta el primer elemento, a la hora de mostrármela solo me muestra el 4.
Código:
#include <stdio.h>
#include <stdlib.h>

typedef struct listacompleta {
         int dato;
         struct listacompleta *next;
        }lista;

lista *primero;

void add_nod(int dato){
  lista *nuevo,*aux;
  nuevo = (lista *) malloc (sizeof(lista));
  nuevo->dato = dato;
  nuevo->next = NULL;       
  if(primero == NULL){
              aux = primero;
              primero = nuevo;
             } else {
                     aux = primero;
                     while(aux != NULL){
                       aux = aux->next;
                      }
                     aux = nuevo;
                    }
 
 }
 

void see_list(lista *primero){
      lista *auxiliar;
      int i;
     
      auxiliar = primero;
      while (auxiliar!=NULL) {
            printf( "%d\n",auxiliar->dato);
            auxiliar = auxiliar->next;
            i++;
      }
      if (i==0) printf( "\nLa lista está vacía!!\n" );
     
     
     }
main(){
 primero = NULL;
 add_nod(4);
 add_nod(3);
 add_nod(5);
 see_list(primero); 
}
Un saludo.
19  Programación / Programación C/C++ / Problema con listas enlazadas. en: 28 Noviembre 2010, 18:26 pm
Hola, tengo el siguiente problema que me trae totalmente loco con el tema de las listas enlazadas en C.

El caso es que tengo el siguiente código:

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

typedef struct elementslist {
         int data;
         struct elementslist *next;
        }element;

element *first,*nodo,*nodo2;

void insertarnodo(element *nodo, int dato){
                nodo = (element*) malloc(sizeof(element));
                nodo->data = dato;
                nodo->next = NULL;
                first = nodo;
     }

main(){
 first = NULL;
 insertarnodo(nodo,5);
 printf("%d\n",nodo->data);
}

Este código me compila pero cuando lo ejecuto se me cierra y no imprime el valor de la lista.
Luego tengo este otro que si me funciona pero no se si esta mal o bien programado, el caso es que me gustaría saber por que el primero no me funciona y el segundo si, ya que al tratarse de variables globales no tengo por que retornar ningún nodo como en el segundo.

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

typedef struct elementslist {
         int data;
         struct elementslist *next;
        }element;

element *first,*nodo,*nodo2;

element *insertarnodo(element *nodo, int dato){
                nodo = (element*) malloc(sizeof(element));
                nodo->data = dato;
                nodo->next = NULL;
                first = nodo;
                return nodo;
     }

main(){
 first = NULL;
 nodo = insertarnodo(nodo,5);
 printf("%d\n",nodo->data);
}

Un saludo a todos.
20  Programación / Programación C/C++ / Problema con Malloc y cadenas de tamaño variable. en: 22 Noviembre 2010, 12:58 pm
Hola. Saludos a todos.

Tengo un problema a la hora de entender malloc, el caso es que quiero un array que cada elemento almacene cadenas de dimension variable.
En principio tengo:

Código:
char nombre[2];
nombre[0] = (char *)malloc(sizeof(char));

Supuestamente esto me funciona, es decir, yo puedo usar scanf y almacenar una cadena del tamaño que yo quiera en nombre[0], pero el caso es que creo que la asignación de memoria esta mal, es decir, yo estoy reservando memoria para lo que ocupa un carácter, es decir un byte, por lo tanto no me tendría que dejar almacenar mas de un bye, al menos que este machando la memoria a partir de la posición de asignación de dicho byte, por eso quería saber si este código es correcto.
Es decir, si de esta forma yo estoy reservando memoria para una cadena de tamaño variable en nombre[0].

Un Saludo.
Páginas: 1 [2] 3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines