Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] listas en C

Estas en el tema de listas en C en el foro de C/C++ en Foros del Web. Que tal, soy nuevo aca. tengo el siguiente ejercicio crear una función que recibe como parámetro dos listas y engancharas. Hay dos listas de personas, ...
  #1 (permalink)  
Antiguo 29/07/2013, 15:49
 
Fecha de Ingreso: julio-2013
Mensajes: 3
Antigüedad: 10 años, 9 meses
Puntos: 0
Pregunta listas en C

Que tal, soy nuevo aca.
tengo el siguiente ejercicio crear una función que recibe como parámetro dos listas y engancharas.

Hay dos listas de personas, una de padres y una de hijos.


struct persona{
char nombre[20];
char antecesor[20];
persona *sig;
};
hay que escribir un procedimiento void enganchar(persona *padres, persona **hijos); que cambiase la lista de padres de tal manera que la lista quedara de la siguiente forma: A → 1er hijo de A → 2do hijo de A → B → 1er hijo de B → C → NULL

Es decir, que estén los padres ordenados según el mismo orden que la lista original, pero que entre ellos estén todos los hijos correctos.

codigo de mi funcion:

void enganchar_hijos_a_padres(persona *padres, persona *hijos)
{
persona *aux1=NULL, *aux2=NULL, *aux3=NULL;
aux1=padres;

for(;aux1!=NULL;aux1=aux1->sig)
{
aux2=hijos;
for(;aux2!=NULL;aux2=aux2->sig)
{
if(strcmp(aux1->nombre,aux2->antecesor)==0)
{
aux3=aux1->sig;
aux1->sig=aux2;
aux1->sig->sig=aux3;

}
}

}
}

pero solo logro enganchar un solo hijo por padre. osea si en la lista de hijos hay mas de uno que pertenece a un mismo padre no logro mostrarlo correctamente. en donde falla la logica??

muchas gracias
saludos Juan
  #2 (permalink)  
Antiguo 03/08/2013, 02:07
Avatar de Spike_ak  
Fecha de Ingreso: marzo-2005
Ubicación: Argentina
Mensajes: 442
Antigüedad: 19 años, 2 meses
Puntos: 0
Respuesta: listas en C

Todavia no aprendí a usar de esa manera el For, proba usando While.
__________________
*****************************************
la Ignorancia es la fuerza
  #3 (permalink)  
Antiguo 03/08/2013, 06:12
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 9 meses
Puntos: 83
Respuesta: listas en C

Una cosa, no se si soy yo que me estoy liando: todos los nodos pueden actuar como hijos y como padres ok? En base a esto deberias usar dos punteros internos: uno para la lista de hijos y el otro para la lista principal de padres:

Código C:
Ver original
  1. struct nodo {
  2.    tipo dato;
  3.    struct nodo *hijos;
  4.    struct nodo *siguiente;
  5. };

Lo que estas haciendo tiene la misma distribucion que los arboles parseados de un xml por libxml2 (puedes echar un vistazo a la libreria de xmlsoft, de hecho la estructura de nodos es la misma solo que cambian 'nodo' por '_xmlNode', 'siguiente' por 'next' y 'hijos' por 'children')

Saludos
vosk
  #4 (permalink)  
Antiguo 03/08/2013, 10:28
 
Fecha de Ingreso: julio-2013
Mensajes: 3
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: listas en C

Spike_ak gracias por la sugerencia.

vosk: respecto a tu pregunta las dos listas de padres e hijos tienen la misma estructura. solo que padres en el campo antecesor no tiene nada.

padres->|A||->|B||->|C||->NULL

hijos->|h1|B|->|h2|A|->|h3|A|->NULL

y lo que la funcion debe lograr es

padres->|A||->|h2|A|->|h3|A|->|B||->|h1|B|->|C||->NULL

espero haber sido mas claro, saludos.
  #5 (permalink)  
Antiguo 04/08/2013, 14:54
 
Fecha de Ingreso: julio-2013
Mensajes: 3
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: listas en C

listo creo que ya esta, la solucion


void enganchar_hijos_a_padres(persona *padre, persona **hijos)
{
persona *ip=NULL, *ih=NULL, *preh=NULL;

ip=padre;
if(ip != NULL)
{
ih=*hijos;
preh=*hijos;
while(ih != NULL)
{
if( !strcmp(padre->nombre,ih->antecesor) ) //si es hijo lo engancho al padre
{
if( ih==*hijos ) //Si hay que desenganchar un nodo de una lista, el primero es un caso especial.
{
*hijos=(*hijos)->sig;
ih->sig=(*ip).sig;
ip->sig=ih;
ip=ih;
ih=*hijos;
preh=*hijos;
}
else
{
preh->sig=ih->sig;
ih->sig=ip->sig;
ip->sig=ih;
ih=preh->sig;
}
}
else {preh=ih; ih=ih->sig;}
}
enganchar_hijos_a_padres(ip->sig , hijos); //paso la lista de padres comenzando desde el siguiente padre
}
}
  #6 (permalink)  
Antiguo 07/08/2013, 18:58
Avatar de Spike_ak  
Fecha de Ingreso: marzo-2005
Ubicación: Argentina
Mensajes: 442
Antigüedad: 19 años, 2 meses
Puntos: 0
Respuesta: listas en C

Usando While e IF es la forma correcta. Con FOR no se puede debido a los NULL
__________________
*****************************************
la Ignorancia es la fuerza

Etiquetas: funcion, lista, listas, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:09.