Donar $20 Donar $50 Donar $100 Donar mensualmente
 


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
[Aporte+Ayuda]Informática I - 1er.Parcial
Autor Mensaje
matyary Sin conexión
Presidente del CEIT
SORPRENDEME!
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 1.796
Agradecimientos dados: 65
Agradecimientos: 313 en 77 posts
Registro en: Mar 2011
Mensaje: #1
[Aporte+Ayuda]Informática I - 1er.Parcial Parciales y 1 más Informática I (Electrónica)
Hola gente,
Mi primer post referido específicamente a mi carrera. Hará unos diez días que me tomaron el recuperatorio del primer parcial de esta queridísima materia. La parte práctica pedía realizar un programa que intercambie dos nodos de una lista doblemente enlazada, compare lexicográficamente dos cadenas (esta función se pedía usarla en la función intercambiar),y copiar aquellos nodos donde los nombres de socio empiecen con una letra tipeada por el usuario.
Bueno, el profesor nos dijo que el que entrega el programa funcionando tiene más chances de aprobar. Pero tiene que estar perfecto (por eso también la razón del post Jaja).


Aclaración: La función copiar si bien funciona no está del todo bien, pues imprimo el resultado en la misma función y no en el main. Y la función intercambiar a veces al imprimir se vuelve loca (esto último es en lo que quiero que algún alma generosa me ayude).

Al que le interese y desee ayudarme bienvenido sea.

A continuación mi código:

Spoiler: Mostrar
//Librerías.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Estructura.
struct nodo
{
char nombre[50];
int socio;
struct nodo *Siguiente;
struct nodo *Anterior;
struct nodo *Inicio;
struct nodo *Fin;
int tam;
};

//Prototipos de las funciones.
int insertar (struct nodo *Lista , char *n, int s);
struct nodo *intercambiar (struct nodo *Lista, char *cadena1, char *cadena2);
int comparar(char *cad1,char *cad2);
void *copiar(struct nodo *Lista, char letra);
int menu (struct nodo *Lista);
void imprimir (struct nodo *Lista);

//---------------------------------------MAIN-------------------------------------------//
int main (void)
{
struct nodo *lista;
lista=malloc(sizeof(struct nodo));
char *nom;
nom=malloc(50);
int opcion=1;
int soc;
int aux;
char *str1, *str2;
char l;

//Asignación de memoria.
str1=malloc(50);
str1=malloc(50);

//Incicialización de variables.
lista->Inicio=NULL;
lista->Fin=NULL;
lista->tam=0;

while (opcion!=4)
{
opcion=menu(lista);
switch (opcion)
{
case 4:
printf ("\nFin de la ejecución.\n");
exit(-1);
break;
case 0:
printf ("\nIngrese un nombre:");
scanf ("%s",nom);
printf ("\nIngrese nro. de socio:");
scanf ("%d",&soc);
insertar (lista,nom, soc);
imprimir(lista);
printf ("\n%d elementos.\n",lista->tam);
break;
case 1:
printf ("\nIngrese primer nombre:");
scanf ("%s",str1);
printf ("\nIngrese segundo nombre:");
scanf ("%s",str2);
intercambiar (lista,str1,str2);
imprimir (lista);
break;
case 2:
printf ("\nIngrese primer nombre:");
scanf ("%s",str1);
printf ("\nIngrese segundo nombre:");
scanf ("%s",str2);
aux = comparar (str1,str2);
if (aux==0)
printf ("\nCadenas iguales.\n");
if (aux==1)
printf ("\nPrimera cadena mayor.\n");
if (aux==-1)
printf ("\nPrimera cadena menor.\n");
break;
case 3:
printf ("\nIngrese letra:");
scanf ("\n%c",&l);
getchar();
copiar (lista,l);
}
}

return 0;
}

//---------------------------------------MENU-------------------------------------------//
int menu (struct nodo *Lista)
{
int eleccion;

if (Lista->tam==0)
{
printf ("\nElija una de las opciones que aparecen en pantalla:\n");
printf ("\n0-Insertar nuevo nodo.\n1-Salir.\n");
printf ("\nOpción:");
scanf ("%d",&eleccion);
if (eleccion==1)
eleccion=4; //Para que coincida con el menú de abajo.
}
else
{
printf ("\nElija una de las opciones que aparecen en pantalla:\n");
printf ("\n0-Insertar nuevo nodo.\n1-Intercambiar nodos.\n2-Comparar nodos.\n3-Copiar nodos.\n4-Salir.\n");
printf ("\nOpción:");
scanf ("%d",&eleccion);
}

return eleccion;
}

//---------------------------------INSERTAR NUEVO NODO----------------------------------//
int insertar (struct nodo *Lista , char *n, int s)
{
struct nodo *Nuevo, *Actual;
int insert;
int i=0;

//Reserva memoria para el nuevo nodo.
if ( (Nuevo = malloc (sizeof (struct nodo) ) ) == NULL)
return -1;

//Recorre el nombre/cadena ingresado por el usuario.
for( i=0; *(n+i)!='\0'; i++ )
{
Nuevo->nombre[i] = *(n+i); //Y lo almacena en el nuevo nodo.
}
Nuevo->nombre[i]='\0'; //Agrega el caracter NULL al final de la cadena.
Nuevo->socio=s; //Guarda el nro. de socio ingresado en el nuevo nodo.

if (Lista->tam==0) //Si la lista está está vacía.
{
Nuevo->Anterior=Lista->Inicio;
Nuevo->Siguiente=Lista->Fin;
Lista->Inicio=Nuevo;
Lista->Fin=Nuevo;
Lista->tam++; //Incrementa el tamaño de la lista, debido al nuevo nodo ingresado.
return 0;
}

else //Inserta después del último nodo ingresado.
{
Actual=Lista->Inicio;
while ( Actual->Siguiente != NULL && strcmp(n,Actual->nombre ) !=0 )
//Mientras el elemento siguiente al nodo actual no sea NULL y el nombre ingresado por
//el usuario sea distinto al nombre del nodo actual...
Actual=Actual->Siguiente; //Salta al siguiente nodo.


Nuevo->Anterior=Actual; //El nodo anterior a 'Nuevo' es el actual.
if (Actual->Siguiente==NULL)
Lista->Fin=Nuevo;
else Actual->Siguiente->Anterior=Nuevo;
Actual->Siguiente=Nuevo;
Lista->tam++; //Incrementa el tamaño de la lista, debido al nuevo nodo ingresado.
return 0;
}
}

//------------------------------------IMPRIMIR LISTA--------------------------------------//
void imprimir (struct nodo *Lista)
{
struct nodo *Inverso, *Actual;
int choice; //Variable para elegir modo de impresión de la lista.

printf ("\nElija una de las opciones que aparecen en pantalla:\n");
printf ("\n1-Imprimir lista.\n2-Imprimir lista al revés.\n");
printf ("\nOpción:");
scanf ("%d",&choice);

Actual=Lista->Inicio;
printf ("\n----->");

//Imprime desde el incio hasta el fin de la lista.
if (choice==1)
{
while (Actual!=NULL)
{
Inverso=Actual; //Cuando se termina de recorrer la lista, almacena el último nodo en 'Inverso'.
printf ("Nombre:%s/Socio:%d----->",Actual->nombre,Actual->socio); //Imprime nombre y socio del nodo.
Actual=Actual->Siguiente; //Salta al siguiente nodo.
}
}

//Imprime de atrás para delante.
if (choice==2)
{
while (Inverso!=NULL)
{
printf ("Nombre:%s/Socio:%d----->",Inverso->nombre,Inverso->socio);
Inverso=Inverso->Anterior; //Salta al nodo anterior.
}
}
}

//------------------------------------COMPARA NODOS-----------------------------------//
int comparar(char *cad1,char *cad2)
{
int i=0; //Auxiliar para recorrer cadenas.

while ( (*(cad1+i)!='\0') || (*(cad2+i)!='\0') )
{
if (*(cad1+i)<*(cad2+i)) //Si la primera cadena es menor a la segunda cadena...
return -1;
if (*(cad1+i)>*(cad2+i)) //Si la primera cadena es mayor a la segunda cadena...
return 1;

i++;
}

if (*(cad1+i)<*(cad2+i)) //Si la primera cadena es menor a la segunda cadena...
return -1;
else if (*(cad1+i)>*(cad2+i)) //Si la primera cadena es mayor a la segunda cadena...
return 1;
return 0; //Retorna la variable aux.
}

//------------------------------------INTERCAMBIA NODOS-------------------------------//
struct nodo *intercambiar (struct nodo *Lista, char *cadena1, char *cadena2)
{
struct nodo *Actual, *T1, *T2, *Aux1, *Aux2;
int i=0; //Variable auxiliar para recorrer cadenas.

//Asignación de memoria a variables auxiliares.
Aux1 = malloc (sizeof (struct nodo) );
Aux2 = malloc (sizeof (struct nodo) );
Actual = malloc (sizeof (struct nodo) );
//Memoria asignada.

//Recorremos la lista desde su primer nodo.
Actual=Lista->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=Lista->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==Lista->Inicio)
{
//Muevo el segundo nodo al inicio de la lista y al primer nodo a la posición
//donde se encontraba el segundo nodo.
Lista->Inicio=Aux2;
Aux2->Anterior->Siguiente=Aux1;
}
//Si el segundo nodo es el primer elemento...
else if (Aux2==Lista->Inicio)
{
//Muevo el primer nodo al inicio de la lista y al segundo nodo a la posición
//donde se encontraba el primer nodo.
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!=Lista->Fin)
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==Lista->Fin)
Aux2->Siguiente->Anterior=Aux1;
//Si es el último elemento...
Aux2->Siguiente=T2;
}
return Lista->Inicio; //Retorna el lo apuntado por el inicio de la lista.
}
else return NULL; //Retorna NULL si uno de los nodos no fue encontrado.

}

//-------------------------------------ARRAY DE NODOS---------------------------------//
void *copiar(struct nodo *Lista, char letra)
{
struct nodo *Actual;
int i=0; //Variable auxiliar para recorrer el array de punteros.
char *p[Lista->tam]; //Array de punteros, almacena los nombres que empiecen con la
//letra ingresada por el usuario.

Actual=Lista->Inicio; //Parte desde el primer elemento de la lista.
printf("\n----->");
while (Actual!=NULL) //Mientras no llegue al final de la lista...
{
if (Actual->nombre[0] == letra) //Si la primera letra del nombre del nodo que se
//está analizando es igual a letra...
{
p[i]=Actual->nombre; //Se guarda el nombre del nodo en un array de punteros.
printf ("%s----->",p[i]); //Imprime dicho nombre.
i++; //Incrementa la posición del array de punteros en 1.
}
Actual=Actual->Siguiente; //Nos corremos al siguiente nodo.
}
}

Les adjunto el enunciado del parcial.

Saludos!


Archivo(s) adjuntos
.pdf  rec_1_p.pdf (Tamaño: 32,09 KB / Descargas: 212)



... and it was good!

Mi web: Von Hexlein
11-11-2011 11:38
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Feer Sin conexión
Presidente del CEIT
win-win
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.565
Agradecimientos dados: 594
Agradecimientos: 2.486 en 411 posts
Registro en: Apr 2010
Mensaje: #2
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
Te lo agradezco ahora porque se que tarde o temprano lo voy a necesitar JAJAJAJA.

[Imagen: digitalizartransparent.png]
11-11-2011 19:56
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
rld Sin conexión
Secretario General
ლ(ಠ益ಠლ)
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 787
Agradecimientos dados: 9
Agradecimientos: 10 en 9 posts
Registro en: Nov 2010
Mensaje: #3
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
Aca el codigo indentado para el que lo necesite: http://pastebin.com/x39tEztY

Posteate algun caso concreto en el que falle el programa, para que tambien podamos reproducir los bugs =)

ρλδ
11-11-2011 20:06
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.796
Agradecimientos dados: 65
Agradecimientos: 313 en 77 posts
Registro en: Mar 2011
Mensaje: #4
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
Función intercambiar:

Trabaja lo más lindo la primera vez, al llamarla por segunda vez imprime innumerables veces la lista.

Por ej.: Ingreso tres nodos (pepe/1 - marcos/2 - julia/3). Intercambio el nodo de pepe con el nodo de marcos y funciona perfecto, cuando quiere intercambiar ambos nodos por segunda vez hace la cosa loca que dije anteriormente.

La función copiar dejenme modificarla y la subo nuevamente, para los fines que el profesor me pidió.



... and it was good!

Mi web: Von Hexlein
12-11-2011 10:20
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.796
Agradecimientos dados: 65
Agradecimientos: 313 en 77 posts
Registro en: Mar 2011
Mensaje: #5
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
Modifiué un par de cosas.

Perdón, no sé como subirlo tal como hizo rld.

Spoiler: Mostrar
//Librerías.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Estructura.
struct nodo
{
char nombre[50];
int socio;
struct nodo *Siguiente;
struct nodo *Anterior;
struct nodo *Inicio;
struct nodo *Fin;
int tam;
};

//Prototipos de las funciones.
int insertar (struct nodo *Lista , char *n, int s);
struct nodo *intercambiar (struct nodo *Lista, char *cadena1, char *cadena2);
int comparar(char *cad1,char *cad2);
void *copiar(struct nodo *Lista, char letra);
int menu (struct nodo *Lista);
void imprimir (struct nodo *Lista);

//---------------------------------------MAIN-------------------------------------------//
int main (void)
{
struct nodo *lista;
lista=malloc(sizeof(struct nodo));
char *nom;
nom=malloc(50);
int opcion=1;
int soc;
int aux;
char *str1, *str2;
char l;
char **nombres;
int i=0;

//Asignación de memoria.
str1=malloc(50);
str1=malloc(50);

//Incicialización de variables.
lista->Inicio=NULL;
lista->Fin=NULL;
lista->tam=0;

while (opcion!=4)
{
opcion=menu(lista);
switch (opcion)
{
case 4:
printf ("\nFin de la ejecución.\n");
exit(-1);
break;
case 0:
printf ("\nIngrese un nombre:");
scanf ("%s",nom);
printf ("\nIngrese nro. de socio:");
scanf ("%d",&soc);
insertar (lista,nom, soc);
imprimir(lista);
printf ("\n%d elementos.\n",lista->tam);
break;
case 1:
printf ("\nIngrese primer nombre:");
scanf ("%s",str1);
printf ("\nIngrese segundo nombre:");
scanf ("%s",str2);
intercambiar (lista,str1,str2);
imprimir (lista);
break;
case 2:
printf ("\nIngrese primer nombre:");
scanf ("%s",str1);
printf ("\nIngrese segundo nombre:");
scanf ("%s",str2);
aux = comparar (str1,str2);
if (aux==0)
printf ("\nCadenas iguales.\n");
if (aux==1)
printf ("\nPrimera cadena mayor.\n");
if (aux==-1)
printf ("\nPrimera cadena menor.\n");
break;
case 3:
printf ("\nIngrese letra:");
scanf ("\n%c",&l);
getchar();
nombres=copiar (lista,l);
printf ("\n----->");
while (*(nombres+i)!='\0')
{
printf ("%s----->",*(nombres+i));
i++;
}
}
}

return 0;
}

//---------------------------------------MENU-------------------------------------------//
int menu (struct nodo *Lista)
{
int eleccion;

if (Lista->tam==0)
{
printf ("\nElija una de las opciones que aparecen en pantalla:\n");
printf ("\n0-Insertar nuevo nodo.\n1-Salir.\n");
printf ("\nOpción:");
scanf ("%d",&eleccion);
if (eleccion==1)
eleccion=4; //Para que coincida con el menú de abajo.
}
else
{
printf ("\nElija una de las opciones que aparecen en pantalla:\n");
printf ("\n0-Insertar nuevo nodo.\n1-Intercambiar nodos.\n2-Comparar nodos.\n3-Copiar nodos.\n4-Salir.\n");
printf ("\nOpción:");
scanf ("%d",&eleccion);
}

return eleccion;
}

//---------------------------------INSERTAR NUEVO NODO----------------------------------//
int insertar (struct nodo *Lista , char *n, int s)
{
struct nodo *Nuevo, *Actual;
int insert;
int i=0;

//Reserva memoria para el nuevo nodo.
if ( (Nuevo = malloc (sizeof (struct nodo) ) ) == NULL)
return -1;

//Recorre el nombre/cadena ingresado por el usuario.
for( i=0; *(n+i)!='\0'; i++ )
{
Nuevo->nombre[i] = *(n+i); //Y lo almacena en el nuevo nodo.
}
Nuevo->nombre[i]='\0'; //Agrega el caracter NULL al final de la cadena.
Nuevo->socio=s; //Guarda el nro. de socio ingresado en el nuevo nodo.

if (Lista->tam==0) //Si la lista está está vacía.
{
Nuevo->Anterior=Lista->Inicio;
Nuevo->Siguiente=Lista->Fin;
Lista->Inicio=Nuevo;
Lista->Fin=Nuevo;
Lista->tam++; //Incrementa el tamaño de la lista, debido al nuevo nodo ingresado.
return 0;
}

else //Inserta después del último nodo ingresado.
{
Actual=Lista->Inicio;
while ( Actual->Siguiente != NULL && strcmp(n,Actual->nombre ) !=0 )
//Mientras el elemento siguiente al nodo actual no sea NULL y el nombre ingresado por
//el usuario sea distinto al nombre del nodo actual...
Actual=Actual->Siguiente; //Salta al siguiente nodo.


Nuevo->Anterior=Actual; //El nodo anterior a 'Nuevo' es el actual.
if (Actual->Siguiente==NULL)
Lista->Fin=Nuevo;
else Actual->Siguiente->Anterior=Nuevo;
Actual->Siguiente=Nuevo;
Lista->tam++; //Incrementa el tamaño de la lista, debido al nuevo nodo ingresado.
return 0;
}
}

//------------------------------------IMPRIMIR LISTA--------------------------------------//
void imprimir (struct nodo *Lista)
{
struct nodo *Inverso, *Actual;
int choice; //Variable para elegir modo de impresión de la lista.

printf ("\nElija una de las opciones que aparecen en pantalla:\n");
printf ("\n1-Imprimir lista.\n2-Imprimir lista al revés.\n");
printf ("\nOpción:");
scanf ("%d",&choice);

Actual=Lista->Inicio;
printf ("\n----->");

//Imprime desde el incio hasta el fin de la lista.
if (choice==1)
{
while (Actual!=NULL)
{
Inverso=Actual; //Cuando se termina de recorrer la lista, almacena el último nodo en 'Inverso'.
printf ("Nombre:%s/Socio:%d----->",Actual->nombre,Actual->socio); //Imprime nombre y socio del nodo.
Actual=Actual->Siguiente; //Salta al siguiente nodo.
}
}

//Imprime de atrás para delante.
if (choice==2)
{
while (Inverso!=NULL)
{
printf ("Nombre:%s/Socio:%d----->",Inverso->nombre,Inverso->socio);
Inverso=Inverso->Anterior; //Salta al nodo anterior.
}
}
}

//------------------------------------COMPARA NODOS-----------------------------------//
int comparar(char *cad1,char *cad2)
{
int i=0; //Auxiliar para recorrer cadenas.

while ( (*(cad1+i)!='\0') || (*(cad2+i)!='\0') )
{
if (*(cad1+i)<*(cad2+i)) //Si la primera cadena es menor a la segunda cadena...
return -1;
if (*(cad1+i)>*(cad2+i)) //Si la primera cadena es mayor a la segunda cadena...
return 1;

i++;
}

if (*(cad1+i)<*(cad2+i)) //Si la primera cadena es menor a la segunda cadena...
return -1;
else if (*(cad1+i)>*(cad2+i)) //Si la primera cadena es mayor a la segunda cadena...
return 1;
return 0; //Retorna la variable aux.
}

//------------------------------------INTERCAMBIA NODOS-------------------------------//
struct nodo *intercambiar (struct nodo *Lista, char *cadena1, char *cadena2)
{
struct nodo *Actual, *T1, *T2, *Aux1, *Aux2;
int i=0; //Variable auxiliar para recorrer cadenas.

//Recorremos la lista desde su primer nodo.
Actual=Lista->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=Lista->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==Lista->Inicio)
{
//Muevo el segundo nodo al inicio de la lista.
Lista->Inicio=Aux2;
Aux2->Anterior->Siguiente=Aux1;
}
//Si el segundo nodo es el primer elemento...
else if (Aux2==Lista->Inicio)
{
//Muevo el primer nodo al inicio de la lista.
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!=Lista->Fin)
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==Lista->Fin)
Aux2->Siguiente->Anterior=Aux1;
//Si es el último elemento...
Aux2->Siguiente=T2;
}
return Lista->Inicio; //Retorna el lo apuntado por el inicio de la lista.
}
else return NULL; //Retorna NULL si uno de los nodos no fue encontrado.

}

//-------------------------------------ARRAY DE NODOS---------------------------------//
void *copiar(struct nodo *Lista, char letra)
{
struct nodo *Actual;
int i=0; //Variable auxiliar para recorrer el array de punteros.
char **p; //Array de punteros, almacena los nombres que empiecen con la
//letra ingresada por el usuario.
char **pnom;

p = malloc (50*sizeof(char *));

Actual=Lista->Inicio; //Parte desde el primer elemento de la lista.
while (Actual!=NULL) //Mientras no llegue al final de la lista...
{
if (Actual->nombre[0] == letra) //Si la primera letra del nombre del nodo que se
//está analizando es igual a letra...
{
p[i]=Actual->nombre; //Se guarda el nombre del nodo en un array de punteros.
i++; //Incrementa la posición del array de punteros en 1.
}
Actual=Actual->Siguiente; //Nos corremos al siguiente nodo.
}
pnom = realloc(p,i*sizeof(char *));


return pnom;
}

Función intercambiar: funciona una determinada cantidad de veces (5 o 6 veces) y luego tira fallo de segmentación y se cierra el programa. Escuché decir que esto es común que pase al intercambiar nodos y no el contenido de los nodos. ¿Algún alumno avanzado o experto en C u otro lenguaje que pueda afirmar o contradecir esto?

Función copiar (cambiada, ahora imprime el resultado en el main porque retorno una variable desde la función): Funciona correctamente hasta que se inserta un nuevo nodo y se la vuelve a llar, ahí es cuando no trabaja correctamente.

Muchas gracias por contestar y saludos!



... and it was good!

Mi web: Von Hexlein
12-11-2011 12:25
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
yaoming Sin conexión
Secretario de la SAE
Deutschland :D
******

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 450
Agradecimientos dados: 49
Agradecimientos: 523 en 86 posts
Registro en: Nov 2011
Mensaje: #6
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
Hola, estoy checkeando el programa, dame un par de dias jajaj

Nota:

Actual = malloc (sizeof (struct nodo) );

no hace falta, porque estas generando un espacio de memoria sin utilizarlo, pones directamente->

Actual = NULL;

va a funcionar igual.
Saludos.
en la parte de intercambiar podes probar con lo siguiente->

struct *ant,*sig;

----en el momento de intercambiar------

ant = Aux1->Anterior
sig = Aux1->SIguiente;

Aux1->Anterior = Aux2->Anterior;
Aux1->SIguiente = Aux2->Siguiente;
Aux2->Anterior = ant;
Aux2->Siguiente = sig;

-----------------------------

Esto lo que hace es intercambiar las dos listas.
Saludos
(Este mensaje fue modificado por última vez en: 13-11-2011 01:36 por yaoming.)
13-11-2011 01:26
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.796
Agradecimientos dados: 65
Agradecimientos: 313 en 77 posts
Registro en: Mar 2011
Mensaje: #7
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
Antes que nada, gracias por contestar.
Lo que decís está bien, es más hice algo similar Jaja
Pero faltaría analizar una serie de posibilidades, entre ellas: si el primer nodo buscado es el primer nodo de la lista, si el segundo nodo buscado es el primer nodo de la lista, si el primer nodo buscado es el último nodo de la lista o si el segundo nodo es el último nodo de la lista.
Igualmente voy a probar en otro código tu razonamiento a ver si funciona, no sea cosa que opere bien y me ahorro de poner tantos renglones con innumerables if al dope.
A continuación, todo el código modificado. Ahora funciona intercambiar. El "fallo de segmentación" que tiraba lo solucioné agregando una serie de paréntesis (en el código de abajo los marqué en color rojo) para separar los punteros Anterior y Siguiente. Queda por solucionar la función copiar, me funciona hasta que modifico la lista. Si agrego nodo o intercambio nodos y llamo a la función copiar de nuevo me tira "fallo de segmentación."
Ya no sé que pensar, si no sé nada o el programa me está boludeando Jaja

Spoiler: Mostrar
//Librerías.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Estructura.
struct nodo
{
char nombre[50];
int socio;
struct nodo *Siguiente;
struct nodo *Anterior;
struct nodo *Inicio;
struct nodo *Fin;
int tam;
};

//Prototipos de las funciones.
int insertar (struct nodo *Lista , char *n, int s);
struct nodo *intercambiar (struct nodo *Lista, char *cadena1, char *cadena2);
int comparar(char *cad1,char *cad2);
void *copiar(struct nodo *Lista, char letra);
int menu (struct nodo *Lista);
void imprimir (struct nodo *Lista);

//---------------------------------------MAIN-------------------------------------------//
int main (void)
{
struct nodo *lista;
lista=malloc(sizeof(struct nodo));
char *nom;
nom=malloc(50);
int opcion=1;
int soc;
int aux;
char *str1, *str2;
char l;
char **nombres;
int i=0;

//Asignación de memoria.
str1=malloc(50);
str1=malloc(50);

//Incicialización de variables.
lista->Inicio=NULL;
lista->Fin=NULL;
lista->tam=0;

while (opcion!=4)
{
opcion=menu(lista);
switch (opcion)
{
case 4:
printf ("\nFin de la ejecución.\n");
exit(-1);
break;
case 0:
printf ("\nIngrese un nombre:");
scanf ("%s",nom);
printf ("\nIngrese nro. de socio:");
scanf ("%d",&soc);
insertar (lista,nom, soc);
imprimir(lista);
printf ("\n%d elementos.\n",lista->tam);
break;
case 1:
printf ("\nIngrese primer nombre:");
scanf ("%s",str1);
printf ("\nIngrese segundo nombre:");
scanf ("%s",str2);
intercambiar (lista,str1,str2);
imprimir (lista);
break;
case 2:
printf ("\nIngrese primer nombre:");
scanf ("%s",str1);
printf ("\nIngrese segundo nombre:");
scanf ("%s",str2);
aux = comparar (str1,str2);
if (aux==0)
printf ("\nCadenas iguales.\n");
if (aux==1)
printf ("\nPrimera cadena mayor.\n");
if (aux==-1)
printf ("\nPrimera cadena menor.\n");
break;
case 3:
printf ("\nIngrese letra:");
scanf ("\n%c",&l);
getchar();
nombres=copiar (lista,l);
printf ("\n----->");
while (*(nombres+i)!='\0')
{
printf ("%s----->",*(nombres+i));
i++;
}
}
}

return 0;
}

//---------------------------------------MENU-------------------------------------------//
int menu (struct nodo *Lista)
{
int eleccion;

if (Lista->tam==0)
{
printf ("\nElija una de las opciones que aparecen en pantalla:\n");
printf ("\n0-Insertar nuevo nodo.\n1-Salir.\n");
printf ("\nOpción:");
scanf ("%d",&eleccion);
if (eleccion==1)
eleccion=4; //Para que coincida con el menú de abajo.
}
else
{
printf ("\nElija una de las opciones que aparecen en pantalla:\n");
printf ("\n0-Insertar nuevo nodo.\n1-Intercambiar nodos.\n2-Comparar nodos.\n3-Copiar nodos.\n4-Salir.\n");
printf ("\nOpción:");
scanf ("%d",&eleccion);
}

return eleccion;
}

//---------------------------------INSERTAR NUEVO NODO----------------------------------//
int insertar (struct nodo *Lista , char *n, int s)
{
struct nodo *Nuevo, *Actual;
int insert;
int i=0;

//Reserva memoria para el nuevo nodo.
if ( (Nuevo = malloc (sizeof (struct nodo) ) ) == NULL)
return -1;

//Recorre el nombre/cadena ingresado por el usuario.
for( i=0; *(n+i)!='\0'; i++ )
{
Nuevo->nombre[i] = *(n+i); //Y lo almacena en el nuevo nodo.
}
Nuevo->nombre[i]='\0'; //Agrega el caracter NULL al final de la cadena.
Nuevo->socio=s; //Guarda el nro. de socio ingresado en el nuevo nodo.

if (Lista->tam==0) //Si la lista está está vacía.
{
Nuevo->Anterior=Lista->Inicio;
Nuevo->Siguiente=Lista->Fin;
Lista->Inicio=Nuevo;
Lista->Fin=Nuevo;
Lista->tam++; //Incrementa el tamaño de la lista, debido al nuevo nodo ingresado.
return 0;
}

else //Inserta después del último nodo ingresado.
{
Actual=Lista->Inicio;
while ( Actual->Siguiente != NULL && strcmp(n,Actual->nombre ) !=0 )
//Mientras el elemento siguiente al nodo actual no sea NULL y el nombre ingresado por
//el usuario sea distinto al nombre del nodo actual...
Actual=Actual->Siguiente; //Salta al siguiente nodo.


Nuevo->Anterior=Actual; //El nodo anterior a 'Nuevo' es el actual.
if (Actual->Siguiente==NULL)
Lista->Fin=Nuevo;
else (Actual->Siguiente)->Anterior=Nuevo;
Actual->Siguiente=Nuevo;
Lista->tam++; //Incrementa el tamaño de la lista, debido al nuevo nodo ingresado.
return 0;
}
}

//------------------------------------IMPRIMIR LISTA--------------------------------------//
void imprimir (struct nodo *Lista)
{
struct nodo *Inverso, *Actual;
int choice; //Variable para elegir modo de impresión de la lista.

printf ("\nElija una de las opciones que aparecen en pantalla:\n");
printf ("\n1-Imprimir lista.\n2-Imprimir lista al revés.\n");
printf ("\nOpción:");
scanf ("%d",&choice);

Actual=Lista->Inicio;
printf ("\n----->");

//Imprime desde el incio hasta el fin de la lista.
if (choice==1)
{
while (Actual!=NULL)
{
Inverso=Actual; //Cuando se termina de recorrer la lista, almacena el último nodo en 'Inverso'.
printf ("Nombre:%s/Socio:%d----->",Actual->nombre,Actual->socio); //Imprime nombre y socio del nodo.
Actual=Actual->Siguiente; //Salta al siguiente nodo.
}
}

//Imprime de atrás para delante.
if (choice==2)
{
while (Inverso!=NULL)
{
printf ("Nombre:%s/Socio:%d----->",Inverso->nombre,Inverso->socio);
Inverso=Inverso->Anterior; //Salta al nodo anterior.
}
}
}

//------------------------------------COMPARA NODOS-----------------------------------//
int comparar(char *cad1,char *cad2)
{
int i=0; //Auxiliar para recorrer cadenas.

while ( (*(cad1+i)!='\0') || (*(cad2+i)!='\0') )
{
if (*(cad1+i)<*(cad2+i)) //Si la primera cadena es menor a la segunda cadena...
return -1;
if (*(cad1+i)>*(cad2+i)) //Si la primera cadena es mayor a la segunda cadena...
return 1;

i++;
}

if (*(cad1+i)<*(cad2+i)) //Si la primera cadena es menor a la segunda cadena...
return -1;
else if (*(cad1+i)>*(cad2+i)) //Si la primera cadena es mayor a la segunda cadena...
return 1;
return 0; //Retorna la variable aux.
}

//------------------------------------INTERCAMBIA NODOS-------------------------------//
struct nodo *intercambiar (struct nodo *Lista, char *cadena1, char *cadena2)
{
struct nodo *Actual, *T1, *T2, *Aux1, *Aux2;
int i=0; //Variable auxiliar para recorrer cadenas.

//Recorremos la lista desde su primer nodo.
Actual=Lista->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=Lista->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==Lista->Inicio)
{
//Muevo el segundo nodo al inicio de la lista.
Lista->Inicio=Aux2;
(Aux2->Anterior)->Siguiente=Aux1;
}
//Si el segundo nodo es el primer elemento...
else if (Aux2==Lista->Inicio)
{
//Muevo el primer nodo al inicio de la lista.
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 Lista->Inicio; //Retorna el lo apuntado por el inicio de la lista.
}
else return NULL; //Retorna NULL si uno de los nodos no fue encontrado.

}

//-------------------------------------ARRAY DE NODOS---------------------------------//
void *copiar(struct nodo *Lista, char letra)
{
struct nodo *Actual;
int i=0; //Variable auxiliar para recorrer el array de punteros.
char **p; //Array de punteros, almacena los nombres que empiecen con la
//letra ingresada por el usuario.
char **pnom;

p = malloc (50*sizeof(char *));

Actual=Lista->Inicio; //Parte desde el primer elemento de la lista.
while (Actual!=NULL) //Mientras no llegue al final de la lista...
{
if (Actual->nombre[0] == letra) //Si la primera letra del nombre del nodo que se
//está analizando es igual a letra...
{
p[i]=Actual->nombre; //Se guarda el nombre del nodo en un array de punteros.
i++; //Incrementa la posición del array de punteros en 1.
}
Actual=Actual->Siguiente; //Nos corremos al siguiente nodo.
}
pnom = realloc(p,i*sizeof(char *));


return pnom;
}

Saludos!
Ya lo probé. No funciona, pasa exactamente lo mismo que me pasaba antes de analizar esas 4 posibilidades que decía. Al intercambiar dos nodos cualesquiera, imprime la lista nuevamente perdiendo la dirección de uno de los nodos que se intercambió. Debe ser por eso que el profesor insistió tanto en analizar todos los casos. Igual sigo pensando que es más fácil y eficiente intercambiar el contenido de los nodos y no sus direcciones. Pero bueno, si lo dejaba intercambiando contenido (como había hecho en su momento) me desaprobaba.



... and it was good!

Mi web: Von Hexlein
(Este mensaje fue modificado por última vez en: 13-11-2011 12:13 por matyary.)
13-11-2011 12:03
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
yaoming Sin conexión
Secretario de la SAE
Deutschland :D
******

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 450
Agradecimientos dados: 49
Agradecimientos: 523 en 86 posts
Registro en: Nov 2011
Mensaje: #8
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
uuhh que bajon :/

algun moco debe haber en el programa para que no ande... u.u
21-11-2011 14:19
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.796
Agradecimientos dados: 65
Agradecimientos: 313 en 77 posts
Registro en: Mar 2011
Mensaje: #9
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
Todavía ni siquiera me aprobó el primer parcial el profesor, mañana decide. Me dijo que tiene que ver si el error que tengo es muy grave o no. Hay que cruzar los dedos Jaja



... and it was good!

Mi web: Von Hexlein
21-11-2011 14:35
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
yaoming Sin conexión
Secretario de la SAE
Deutschland :D
******

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 450
Agradecimientos dados: 49
Agradecimientos: 523 en 86 posts
Registro en: Nov 2011
Mensaje: #10
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
(21-11-2011 14:35)matyary escribió:  Todavía ni siquiera me aprobó el primer parcial el profesor, mañana decide. Me dijo que tiene que ver si el error que tengo es muy grave o no. Hay que cruzar los dedos Jaja


Off-topic:
uhh suerte!
22-11-2011 14:58
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.796
Agradecimientos dados: 65
Agradecimientos: 313 en 77 posts
Registro en: Mar 2011
Mensaje: #11
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
(22-11-2011 14:58)electroquimica escribió:  
(21-11-2011 14:35)matyary escribió:  Todavía ni siquiera me aprobó el primer parcial el profesor, mañana decide. Me dijo que tiene que ver si el error que tengo es muy grave o no. Hay que cruzar los dedos Jaja


Off-topic:
uhh suerte!

Ya está, me lo dio por aprobado. La semana que viene me hace un par de preguntas teóricas y me pone el tan esperado 4 Jaja



... and it was good!

Mi web: Von Hexlein
24-11-2011 15:52
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Feer Sin conexión
Presidente del CEIT
win-win
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.565
Agradecimientos dados: 594
Agradecimientos: 2.486 en 411 posts
Registro en: Apr 2010
Mensaje: #12
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
eaea...
Che ya estan las fechas de recuperatorio de la catedra son una goma las que pusieron...
Te felicito maty

[Imagen: digitalizartransparent.png]
24-11-2011 16:29
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.796
Agradecimientos dados: 65
Agradecimientos: 313 en 77 posts
Registro en: Mar 2011
Mensaje: #13
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
Gracias!
Sí, 6 y 12 meparece. Espero no irme a ningún recu... la semana que viene recupero teoría de ambos parciales y llevo funcionando el programa del segundo parcial y apruebo los dos parciales. Lástima que me faltan unos 20tps para poder firmar Jajajaja



... and it was good!

Mi web: Von Hexlein
24-11-2011 16:47
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Feer Sin conexión
Presidente del CEIT
win-win
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.565
Agradecimientos dados: 594
Agradecimientos: 2.486 en 411 posts
Registro en: Apr 2010
Mensaje: #14
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
Ah por lo menos tenes los dos parciales para hacer en tu casa xd, a mi era o parcial con recu o proyecto..
Tengo hasta el 22 de feb. mas coloquio u.u

[Imagen: digitalizartransparent.png]
24-11-2011 17:38
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.796
Agradecimientos dados: 65
Agradecimientos: 313 en 77 posts
Registro en: Mar 2011
Mensaje: #15
RE: [Aporte+Ayuda]Informática I - 1er.Parcial
Si no sé que es mejor y peor a esta altura. Hay que rezar Jaja... antes de empezar la cursada nos hablamos capaz que podemos coincidir en alguna materia. Me voy a estudiar AM2 que estoy al horno Jaja



... and it was good!

Mi web: Von Hexlein
24-11-2011 17:47
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




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



    This forum uses Lukasz Tkacz MyBB addons.