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

Duda Listas Enlazadas, ayuda!!

Estas en el tema de Duda Listas Enlazadas, ayuda!! en el foro de C/C++ en Foros del Web. Hola! Hace un tiempo que vengo programando en C, como un curso introductorio en mi facultad, hasta el dia de hoy que me dieron una ...
  #1 (permalink)  
Antiguo 24/11/2007, 20:10
 
Fecha de Ingreso: noviembre-2007
Mensajes: 2
Antigüedad: 17 años, 1 mes
Puntos: 0
Duda Listas Enlazadas, ayuda!!

Hola! Hace un tiempo que vengo programando en C, como un curso introductorio en mi facultad, hasta el dia de hoy que me dieron una tarea que no logro hechar a andar.

Mi idea es esta:

1) Escribir el main con las opciones para escoger en el menu.
2)A traves de void realizar las distintas operaciones, dandole un puntero al void con la direccion de la estructura y el tamaño de caballeros (en el programa sale con ese nombre) se han designado a crear.
3)Mostrar los caballeros, o la lista enlazada.

Mi problema va en que cuando hago el void se pierde el vector de inicio de la estructura, y cuando quiero verla con listar_caballeros() no puedo mostrarla, y tampoco se me ocurre como hacerla.

Es una lista enlazada circular (mesa redonda).

Ademas tengo problemas cuando pongo printf y deseo mostrar lo que esta dentro de la estructura.

Si alguien me podria hechar una manito, o arreglarme el codigo, o decirme que tengo malo, o simplemente explicarme un poco del asunto, estaria muy agradecido.

El codigo es el siguiente:
__________________________________________________ _________

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

//creamos la estructura
struct datos {
struct datos *anterior; //asignamos un puntero con la direccion de la estructura anterior.
char *nombre;
char *habilidad;
int asiento;
struct datos *siguiente; //asignamos un puntero en la segunda pocicion de la estructura.
}; //con la posicion de la estructura siguiente

//asignamos un puntero con la direccion de la memoria que almacena la estructura.
struct datos *direcciondatos(){
return((struct datos *)malloc(sizeof(struct datos)));
}

//Procedimiento para crear mesa redonda
void crear_mesa_redonda(struct datos *r,int n){
struct datos *p,*q;
int i,num,opc;
system("cls");
printf("CREAR MESA REDONDA\n");
printf("------------------");
printf("\n\nIngrese numero de caballeros: ");
scanf("%d",&num);
printf("\n\nIngresar datos:\n");
for(i=1;i<=num;i++){
//asignamos la direccion de la estructura al puntero
if(i==1){
p=direcciondatos();
r=p; //guardamos la direccion de la primera estructura en el puntero r
p->anterior=p; //agregamos el puntero de la estructura anterior
}
else {
p=direcciondatos();
p->anterior=q; //asignamos la direccion de la estructura
}
//pedimos al usuario los datos del caballero
printf("\nCaballero %d:",i);
printf("\n------------");
printf("\n\n\tNombre: ");
scanf("%s",&(p->nombre));
printf("\n\tHabilidad: ");
scanf("%s",&(p->habilidad));
//asignamos numero de asiento
p->asiento=i;
//asignamos direccion a estructura siguiente
if(i!=num){
q=direcciondatos(); //direccion de la siguiente estructura
p->siguiente=q;
}
else {
p->siguiente=r;
}
}
n=num; //guardamos el numero de caballeros
printf("\n\nSe ingresaron correctamente un total de %d caballeros.",i-1);
printf("\n%.4x",r);
//Opciones a seguir
printf("\n1. Listar Caballeros");
printf("\n2. Volver a Menu Principal");
printf("\n\nIngrese numero de opcion a seguir: ");
scanf("%d",&opc);
if(opc==1)
;//listar_caballeros();
else if(opc==2)
main();
return;
}

//Procedimiento para mostrar la lista de caballeros
void listar_caballeros(struct datos *p,int n){
struct datos *q;
int i=1,opc;
// while(p->asiento!=(n+1)){
printf("Caballero %d:",i);
printf("\nAnterior: %.4x",p->anterior);
printf("\nAsiento: %d",p->asiento);
printf("\nNombre: %c",p->nombre);
printf("\nHabilidad: %c",p->habilidad);
printf("\nSiguiente: %.4x\n\n",p->siguiente);
q=p->siguiente;

printf("Caballero %d:",i);
printf("\nAnterior: %.4x",q->anterior);
printf("\nAsiento: %d",q->asiento);
printf("\nNombre: %c",q->nombre);
printf("\nHabilidad: %c",q->habilidad);
printf("\nSiguiente: %.4x\n\n",q->siguiente);
//}
//Opciones a seguir
printf("\n1. Volver a Menu Principal");
printf("\n\nIngrese numero de opcion a seguir: ");
scanf("%d",&opc);
if(opc==1)
main();
return;
}

int main(){
struct datos *pdatos;
int num,opc;
//presentacion
system("cls");
printf("Segunda Tarea Sistemas de Computacion - DIE\n");
printf("-------------------------------------------\n\n");
printf("Opciones:");
printf("\n\n\t1. Crear Mesa Redonda");
printf("\n\t2. Editar Mesa Redonda");
printf("\n\t3. Listar Caballeros");
printf("\n\t4. Ingresar Numero Aleatorio");
printf("\n\t5. Comenzar Seleccion");
printf("\n\t6. Salir");
pdatos=direcciondatos();
printf("\n%.4x",pdatos);
printf("\n\nIngrese numero de opcion a seguir:");
scanf("%d",&opc);
//direccion de memoria para el puntero cabeza de la estructura
//opciones
if(opc==1)
crear_mesa_redonda(&pdatos,num);
if(opc==3)
listar_caballeros(&pdatos,num);
else if(opc==6){
printf("\nHasta pronto...\n\n");
system("PAUSE");
}
return(0);
}

__________________________________________________ _______

De todas maneras, gracias!.
  #2 (permalink)  
Antiguo 28/11/2007, 09:07
Avatar de Solenbum  
Fecha de Ingreso: noviembre-2007
Mensajes: 45
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Duda Listas Enlazadas, ayuda!!

leer eso me rompe los ojos

tienes algun problema con listas circulares en ejemplos sencillos?
  #3 (permalink)  
Antiguo 30/11/2007, 08:35
 
Fecha de Ingreso: noviembre-2007
Mensajes: 2
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Duda Listas Enlazadas, ayuda!!

Lleno la estructura circular, pero como puedo pasar el puntero con la direccion de la primera estructura o cabezera, a un void que me lea la estructura por ejemplo y no perder la direccion del puntero cabeza.

O mejor dicho, cuando lleno la estructura con un void, como guardar la direccion del puntero cabezera, porque cuando salgo del void se pierde dicha direccion y quedo sin nada. Por ahi lei, y se llama valors por referencia, pero no me resulta.

Gracias!
  #4 (permalink)  
Antiguo 02/12/2007, 18:07
Avatar de Solenbum  
Fecha de Ingreso: noviembre-2007
Mensajes: 45
Antigüedad: 17 años, 1 mes
Puntos: 0
Re: Duda Listas Enlazadas, ayuda!!

¿ A que te refieres con llenar la estructura con un "void" y sales del "void" ?¿ Es culpa mia, es que aun no entiendo mucho, pero explica jeje.

Un apunte, si es lista circular, porque tienes un puntero "anterior" en cada "nodo"!?? ¿no es eso de lista doblemente enlazada? o que quieres hacer, una lista doblemente enlazada circular? jeje.

La verdad es que domino mas c++ que c (aunque tan poco tanto, mas bien menosjeje), solo me queda esperar a esa explicacion del void y a que depures/tracees el programa y/o revises tu codigo con el ejemplo generico de lista circular en C de conclase.net (el codigo):

http://www.conclase.net/c/edd/index.php?cap=004c#4_7

Espero que resuelvas el problema.

posdata: Se nota que no me he leido todo tu codigo, pero creo que en problemas de este tipo no creo que sea conveniente poner muchas cosas cuando quizas no todo tenga que ver con el problema.
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 18:51.