Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: samur88 en 25 Enero 2011, 18:44 pm



Título: Anidar una lista enlazada dentro de otra en C.
Publicado por: samur88 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.


Título: Re: Anidar una lista enlazada dentro de otra en C.
Publicado por: Sauruxum en 25 Enero 2011, 21:33 pm
Yo diria que para poner una lista anidada de ese modo hacer como sucede en las matrices: hacer una lista ( que seria la clave principal ) y que contenga solo un puntero y que cada uno de esots punteros apunte a una nueva lista.
Asi si quieres acceder a las listas anidadas, primero tendras que acceder a la lista principal y de ahi acceder normalmente a los elementos de la lista correspondiente.
Asi decirlo no suena dificil ( quiza no lo es ), dejame hecharle un ojo al codigo con todo.

Saludos


Título: Re: Anidar una lista enlazada dentro de otra en C.
Publicado por: jessec01 en 4 Noviembre 2016, 22:42 pm
 :laugh:

como anidar una lista copie tu código lo probé verifique los detalles tu codigo esta bien lo unico que tiene malo es que no tiene un inicio y ultimo  y hay cosas que estaban de mas y tambien no estaba guardando los datos en la siguiente lista sino que se gurdaba en la misma y se reasignaba otra vez

 y llegué a la conclusión a como anidar una lista correctamente

Este aporte lo hago también  ya que es un tema muy complejo y hay poca información!!

// lista
typedef struct producto
{
   char nombre[300];
   int  cantidad[3];
   float precio[3];
   char marca[3][700];
   struct producto *sig;
}pro;
//lista anidada
typedef struct carrito
{     
  pro *primer; // el nombre y luego el puntero para acceder a la lista
   struct carrito *sig;
}car;
 car *inicio,*ultimo2; // para tener mas control en la lista
// crear
//funcion
// la lista debe estar llena
void crear(pro *prim ,int *dato,int opc)// int dato y opc no es necesario

 /////////////////
 pro *inicio2;
 pro *ultimo3;
 /////////////////
 inicio2=(pro *)NULL;
 ultimo3=(pro *)NULL;   
 //////////////////////
 pro *aux,*actul;
//////////////////////
 car *aux2;
 int *nu_dat; nu_dat=dato; char dato2[50]; int n;
 ///////////////////////
 pro *princi; princi=prim;
  //////////////////////////////
   aux=(pro *) malloc(sizeof(pro));
   aux2=(car *) malloc(sizeof(car));
   /////////////////////////////
   if(aux==NULL && aux2==NULL)
    {
     printf("no hay memoria disponible");             
    }//actul recibe segun opc la direcion que contiene
     ///////////////////////////////
     actul=posicion(princi,opc);//la lista cuando opc Ej:opc=1
     aux->cantidad[0]++;//cada vez que entra al menu hay un 
     ///////////////////
     if(dato[1]==0)      //producto nuevo
     {//segun el dato[posicion] se le asina de lista 
      strcpy(aux->nombre,actul->nombre);//a lista anidada
      strcpy(aux->marca[0],actul->marca[dato[1]]);           
       aux->precio[0]=actul->precio[dato[1]];
     //Ej: Alicate lacutre 12.4 se copia a la otra lista anidada
     }
    /////////////////////
     if(dato[1]==1)
     { strcpy(aux->nombre,actul->nombre);
       strcpy(aux->marca[0],actul->marca[dato[1]]);           
       aux->precio[0]=actul->precio[dato[1]];
     }
    /////////////////////
     if(dato[1]==2)
     {strcpy(aux->nombre,actul->nombre);
       strcpy(aux->marca[0],actul->marca[dato[1]]);           
       aux->precio[0]=actul->precio[dato[1]];
     }
 //////////////////////////   
     aux2->primer=aux; //se le asigna lo que hay aux a aux->primer
     aux2->sig=NULL;  //donde aux->prime es la istancia de la otra
    /////////////////// lista
      aux->sig=NULL;  //tanto aux aux NULL para inicializarlo
     if(inicio==NULL)
      {             
       ultimo2=aux2;                 
       inicio=aux2;   
      }
      else
      {   
       ultimo2->sig=aux2; 
       ultimo2=aux2;
       }
      //printf("%s",r->primer->nombre);
     getch();
}
//““““““““““““““““““““““““““““““““““““““““““““““““““““““““““