Anidar una lista enlazada dentro de otra en C.

Iniciado por samur88, 25 Enero 2011, 18:44 PM

0 Miembros y 1 Visitante están viendo este tema.

samur88

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.

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

typedef struct Articulo {
       int numero;
       int numero2;
       struct Articulo *sig;
      }TLista;

typedef struct nodo_art {
         int codigo;
         TLista *primero;
         struct nodo_art *sig;
        }lista;

int add_nod(lista **first,int a,int b,int c){
lista *nuevo,*aux;
TLista *nuevonum,*aux2;
nuevo = (lista *) malloc (sizeof(lista));
nuevonum = (TLista *) malloc (sizeof(TLista));
nuevo->codigo = a;
nuevo->sig = NULL;
nuevo->primero = NULL;


nuevonum->numero = b;
nuevonum->numero2 = c;
nuevonum->sig = NULL;

   if(nuevo->primero == NULL){
             nuevo->primero = nuevonum;
            } else {
               aux2 = nuevo->primero;
               while(aux2->sig != NULL){
                 aux2 = aux2->sig;
                }
               aux2->sig = nuevonum;
              }

if(*first == NULL){
             *first = nuevo;
            } else {
               aux = *first;
               while(aux->sig != NULL){
                 aux = aux->sig;
                }
               aux->sig = nuevo;
              }
}


int see_list(lista *first){
lista *aux;

if(first == NULL){return -1;}
while(aux != NULL){
  printf("%d- %d %d\n",aux->codigo,aux->primero->numero,aux->primero->numero2);
  aux = aux->sig;
}
}


int main(){
    lista *first;
    first = NULL;
   
    add_nod(&first,5,3,5);
    add_nod(&first,3,2,7);
   
    add_nod(&first,4,3,2);
    see_list(first);
    getchar();
}


Un saludo y gracias por todo.

Sauruxum

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

jessec01

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

"originalidad en todo "