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