Seguimos buscando a Arshak. Ayudanos compartiendo!
Encuesta no oficial de docentes
Resultados de la encuesta no oficial de docentes
Probaste el SIGA Helper?

Donar $100 Donar $200 Donar $500 Donar mensualmente


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
[Ayuda] Ejercicio integrador [Info I]
Autor Mensaje
matyary Sin conexión
Presidente del CEIT
SORPRENDEME!
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 1.809
Agradecimientos dados: 68
Agradecimientos: 343 en 83 posts
Registro en: Mar 2011
Mensaje: #16
RE: [Ayuda] Ejercicio integrador [Info I]
Y buen, si no te es tanto quilombo subila... yo la tengo para doble enlazada (me lo habían tomado en el parcial Jaja).


//------------------------------------INTERCAMBIA NODOS-------------------------------//
struct nodo *intercambiar (struct nodo **Inicio, char *cadena1, char *cadena2)
{
struct nodo *Actual, *T1, *T2, *Aux1, *Aux2;

//Recorremos la lista desde su primer nodo.
Actual=*Inicio;
while (Actual!=NULL) //Mientras no se llegue el final de la lista...
{
if (comparar (Actual->nombre,cadena1)==0) //Al ser 0, quiere decir que las cadenas son iguales.
{
Aux1=Actual; //Guarda el nodo hallado (actual) en un auxiliar.
break;
}
//Si no encontro el nodo que buscamos se mueve el siguiente nodo.
else Actual=Actual->Siguiente;
}

//Si el primer nodo fue encontrado...
if (Aux1!=NULL)
{
//Recorremos la lista desde su primer nodo.
Actual=*Inicio;
while (Actual!=NULL) //Mientras no se llegue el final de la lista...
{
if (comparar (Actual->nombre,cadena2)==0) //Al ser 0, quiere decir que las cadenas son iguales.
{
Aux2=Actual; //Guarda todo el nodo hallado (actual) en un auxiliar.
break;
}
//Si no encontro el nodo que buscamos se mueve el siguiente nodo.
else Actual=Actual->Siguiente;
}

//Si el segundo nodo fue encontrado...
if (Aux2!=NULL)
{
//Si el primer nodo es el primer elemento...
if (Aux1==*Inicio)
{
//Muevo el segundo nodo al inicio de la lista.
*Inicio=Aux2;
(Aux2->Anterior)->Siguiente=Aux1;
}
//Si el segundo nodo es el primer elemento...
else if (Aux2==*Inicio)
{
//Muevo el primer nodo al inicio de la lista.
*Inicio=Aux1;
(Aux1->Anterior)->Siguiente=Aux2;
}
//Si ninguno de los dos nodos hallados es el primer elemento de la lista.
else
{
(Aux2->Anterior)->Siguiente=Aux1;
(Aux1->Anterior)->Siguiente=Aux2;
}

//Almaceno el puntero que apunta al nodo anterior del primer nodo en una variable
//temporal.
T1 = Aux1->Anterior;
//Muevo el puntero que apunta al nodo anterior del segundo nodo al primer nodo.
Aux1->Anterior = Aux2->Anterior;
//Almaceno el puntero que apunta al nodo siguiente del primer nodo en una variable
//temporal.
T2 = Aux1->Siguiente;

//Si el primer nodo no es el último elemento...
if (Aux1->Siguiente!=NULL)
(Aux1->Siguiente)->Anterior=Aux2;
//Si es el último elemento...
Aux1->Siguiente=Aux2->Siguiente;

//Muevo el puntero que apunta al nodo anterior del primer nodo al segundo nodo.
Aux2->Anterior = T1;
//Si el segundo nodo no es el último elemento...
if (Aux2->Siguiente!=NULL)
(Aux2->Siguiente)->Anterior=Aux1;
//Si es el último elemento...
Aux2->Siguiente=T2;

return *Inicio; //Retorna el lo apuntado por el inicio de la lista.
}
else return NULL; //Retorna el lo apuntado por el inicio de la lista.
}
else return NULL; //Retorna NULL si uno de los nodos no fue encontrado.

}


\[\sqrt{-1} \;\; 2^3 \;\; \sum \;\; \pi\]
... and it was good!


Mi web: Von Hexlein
23-03-2012 15:31
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
JulianD Sin conexión
Colaborador
~`☼`~
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 2.431
Agradecimientos dados: 271
Agradecimientos: 912 en 109 posts
Registro en: Feb 2011
Mensaje: #17
RE: [Ayuda] Ejercicio integrador [Info I]
Eso te tomaron en un parcial?
que hdps..

Yo habia hecho esto para simple, pero vos ya lo hiciste para doble enlazada
El metodo de ordenamiento lo invente yo, con burbuja te va a andar mucho mejor


void s_swap (nodo **lista, int pos1, int pos2) {

nodo *ant1, *nodo1, *ant2, *nodo2, *aux;
int i=0,j=0;

ant1=NULL;
nodo1=*lista;

if (pos1==pos2) {
printf ("\nSe ha indicado el mismo nodo. No se realiza ningun intercambio.");
return;
}

while (nodo1!=NULL && i<(pos1-1)) {
ant1=nodo1;
nodo1=nodo1->sig;
i++;
}

if (nodo1==NULL) {
printf ("\nNo hay ningun nodo que contenga el dato indicado.");
return;
}

ant2=NULL;
nodo2=*lista;

while (nodo2!=NULL && j<(pos2-1)) {
ant2=nodo2;
nodo2=nodo2->sig;
j++;
}

if (nodo2==NULL) {
printf ("\nNo hay ningun nodo que contenga el dato indicado.");
return;
}

printf ("\npos1 %d dato1 %d -- pos2 %d dato2 %d\n", pos1,nodo1->dato,pos2,nodo2->dato);

if (pos2<pos1) { /** Caso de que nodo2 quede posicionado delante de nodo1 */
aux=nodo1;
nodo1=nodo2;
nodo2=aux;
aux=ant1;
ant1=ant2;
ant2=aux;
}

if (nodo1->sig==nodo2) { /** Nodos a intercambiar pegados entre si */

aux=nodo2->sig; /** Almaceno la posicion del elemento siguiente al nodo2 que se perdera en los intercambios */

if (ant1==NULL)
(*lista)=nodo2; /** Intercambiar primer nodo */
else
ant1->sig=nodo2;

nodo2->sig=nodo1;
nodo1->sig=aux;

return; /** Importante: si no vuelve al main, se cumple la condicion de abajo */
}

if (nodo1->sig!=nodo2) {

aux=nodo2->sig; /** Almaceno la posicion del elemento siguiente al nodo2 que se perdera en los intercambios */

if (ant1==NULL)
(*lista)=nodo2; /** Intercambiar primer nodo */
else
ant1->sig=nodo2;

nodo2->sig=nodo1->sig;
ant2->sig=nodo1;
nodo1->sig=aux;

return;
}
}

//***********************************************************************************************************************//

void ordenar (nodo **lista) {

nodo *ant,*act, *temp;


if ((*lista)==NULL) {
printf ("\nNo hay elementos en la lista.");
return;
}

while (1) {

temp=*lista;
int n=1;

ant=(temp);
act=(temp)->sig;

while ((act!=NULL) && ((ant->dato)<=(act->dato))) {
ant=act;
act=act->sig;
n++; /** n indica ant, n+1 act */
}

if (act==NULL){ /** llego al final de la lista, la lista esta ordenada */
return;
}

s_swap (lista, n, n+1);

}

printf ("\nError!");
}

//***********************************************************************************************************************//


[Imagen: 2r27ldw.jpg]
23-03-2012 16:08
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
matyary Sin conexión
Presidente del CEIT
SORPRENDEME!
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 1.809
Agradecimientos dados: 68
Agradecimientos: 343 en 83 posts
Registro en: Mar 2011
Mensaje: #18
RE: [Ayuda] Ejercicio integrador [Info I]
Yu funció de ordenar es muy similar a lo que estaba pensando yo... Jeje tan equivocado no estaba.
Ahora miro la de intercambiar.

\[\sqrt{-1} \;\; 2^3 \;\; \sum \;\; \pi\]
... and it was good!


Mi web: Von Hexlein
23-03-2012 16:14
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
matyary Sin conexión
Presidente del CEIT
SORPRENDEME!
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 1.809
Agradecimientos dados: 68
Agradecimientos: 343 en 83 posts
Registro en: Mar 2011
Mensaje: #19
RE: [Ayuda] Ejercicio integrador [Info I]
He vuelto (?)
Traté de hacer algo medio casero, mirando un par de cositas de lo que posteó JulianD y no logro ordenar la puta lista Confused (hace 3 días que vengo peleando con esto Jaja).
Bueno, acá va el código... si no se entiende algo pregunten:


void OrdenarLista ( struct nodo **Cabeza ) //Paso el primer elemento de la lista.
{
struct nodo *Actual, *Anterior, *Temp;

Anterior = *Cabeza; //Primer elemento de la lista.

while ( Anterior != NULL ) { //Mientras el recorrido desde el primer elemento no sea NULL...
Actual = Anterior -> Siguiente; //Actual es el nodo siguiente a Prim, en esta primera
//instancia sería el segundo de lista.
while ( Actual != NULL ) { //Mientras el segundo elemento sea distinto a NULL...
if ( strcmp ( Actual -> nombre , Anterior -> nombre ) < 0 ) {
//Si Actual es menor que Anterior...
Temp = Actual; //Almaceno en una variable auxiliar a Actual.
Actual = Anterior;
Anterior = Temp;
Temp = Anterior -> Siguiente;
if ( Actual -> Siguiente != NULL ) //Si el nodo que sigue a Actual es el fin
//de la lista...
Anterior -> Siguiente = Actual -> Siguiente;
else Anterior -> Siguiente = NULL;
Actual -> Siguiente = Temp;
}
Actual = Actual -> Siguiente;
}
Anterior = Anterior -> Siguiente;
}
printf ("\nLista ordenada.\n"); //O al menos eso debería hacer...
}


\[\sqrt{-1} \;\; 2^3 \;\; \sum \;\; \pi\]
... and it was good!


Mi web: Von Hexlein
25-03-2012 11:18
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 2 invitado(s)