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

Problema con listas circulares doblemente enlazadas

Estas en el tema de Problema con listas circulares doblemente enlazadas en el foro de C/C++ en Foros del Web. Pues tengo un problema estoy haciendo una pratica, pero no me queda tengo un problemita el problema es a la hora de imprimir mi lista ...
  #1 (permalink)  
Antiguo 10/10/2009, 12:50
 
Fecha de Ingreso: octubre-2009
Mensajes: 39
Antigüedad: 14 años, 7 meses
Puntos: 0
Problema con listas circulares doblemente enlazadas

Pues tengo un problema estoy haciendo una pratica, pero no me queda tengo un problemita el problema es a la hora de imprimir mi lista circular les dejare el codigoo:

Lo que hace el programa es insertar estructuras de tipo alumno en mi lista circular:

Código:
typedef struct persona
{
    char  nombre[20];  
    char  apellido[20]; 
    int edad;
    float sueldo;
} item;

typedef struct NodoLC
{
    item dato;
    struct NodoLC *siguiente;
} NODOLC;
Y luego ingreso los datos en otra funcion:

Código:
void ingresar()
{
    system("CLS");
    printf("Nuevo registro de alumno creado:\n\n");
    item *alumno;
        
    alumno=(item*)malloc(sizeof(item));
    alumno->nombre=(char*)malloc(30*sizeof(char));
    alumno->apellido=(char*)malloc(30*sizeof(char));
    
    printf("Nombre: ");
    gets(alumno->nombre);
    
    printf("\n\nApellido: ");
    gets(alumno->apellido);
    
    printf("\n\nBoleta: ");
    scanf("%d",&alumno->boleta);
    
    printf("\n\nCalificacion: ");
    scanf("%d",&alumno->calif);
    
    insertarDLC(&cab,alumno);
    free(alumno);
}
y mis funciones de insertar e imprimir respectivamente:
Código:
void insertarDLC(NODODLC **cab,item *elem)
{
    NODODLC *aux=(NODODLC*)malloc(sizeof(NODODLC));
    
    aux->dato.nombre=elem->nombre;
    aux->dato.apellido=elem->apellido;
    aux->dato.boleta=elem->boleta;
    aux->dato.calif=elem->calif;
    
    aux->sig=aux->ant=aux;
    aux->sig=*cab;
    
    if(*cab)
    {
      aux->sig=(*cab)->sig;
      (*cab)->sig=aux;
    }
    
    *cab=aux;
}
Código:
void imprimirDLC(NODODLC *cab)
{
    NODODLC *ptr=cab;
    int contador=1;
     
    if(cab==NULL)
    {
        printf("La lista esta vacia");
        return;
    }
    
    for(; ptr;ptr=ptr->sig,contador++)
    {
       printf("%d.-",contador);
       printf("\tNombre: %s \n",ptr->dato.nombre);
       printf("\tApellido: %s \n",ptr->dato.apellido);
       printf("\tBoleta: %d \n",ptr->dato.boleta);
       printf("\tCalificacion: %d \n",ptr->dato.calif);
    }    
}
Espero alguien me pueda ayudar gracias!!!!
  #2 (permalink)  
Antiguo 10/10/2009, 14:55
 
Fecha de Ingreso: octubre-2009
Mensajes: 39
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema con listas circulares doblemente enlazadas

me equivoque con las estructuras

Código:
typedef struct _persona     //Se define la estructura para un alumno con sus respectivos datos
{
    char *nombre;  
    char *apellido; 
    unsigned long int boleta;
    unsigned int calif;
}item;

typedef struct _nododc      //La definicion de nuestra lista circular doblemente enlazada
{
    item dato;
    struct _nododc *sig,*ant;
}NODODLC;
  #3 (permalink)  
Antiguo 12/10/2009, 01:43
 
Fecha de Ingreso: septiembre-2009
Mensajes: 56
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Problema con listas circulares doblemente enlazadas

Que tal metal_boy.
En la función insertarDLC falta dar espacio en memoria para nombre y apellido del nodo "aux", también hay un error al copiar las cadenas, hay que usar strcpy.
Ahora, para que quede circular doblemente enlazada, cambié la forma en que se apuntan entre sí:
- el siguiente a aux es cab
- el anterior a aux es el anterior de cab.
Lo que falta es romper la cadena entre cab y su anterior, asi:
- El siguiente del anterior a cab ya no va a ser cab sino aux.
- El anterior a cab va a ser aux.

Aquí va el código:
Código:
void insertarDLC(NODODLC **cab,item *elem)
{   NODODLC *aux=(NODODLC*)malloc(sizeof(NODODLC));
    aux->dato.nombre = (char*)malloc(30*sizeof(char));
    aux->dato.apellido=(char*)malloc(30*sizeof(char));
    strcpy(aux->dato.nombre,elem->nombre);
    strcpy(aux->dato.apellido,elem->apellido);
    aux->dato.boleta=elem->boleta;
    aux->dato.calif=elem->calif;
    
    aux->sig=*cab;
    aux->ant=(*cab)->ant;
    (*cab)->ant->sig=aux;
    (*cab)->ant=aux;
}
Luego para imprimir, como es una lista circular no se llega a ningún NULL, lo que hay que hacer en el for es imprimir "ptr" hasta dar una vuelta, es decir, hasta que vuelta a ser "cab".

Código:
void imprimirDLC(NODODLC *cab)
{
    NODODLC *ptr=cab;
    int contador=1;
     
    if(cab==NULL)
    {
        printf("La lista esta vacia");
        return;
    }
    ptr=ptr->sig;
    for(; ptr!=cab;ptr=ptr->sig,contador++)
    {
       printf("%d.-",contador);
       printf("\tNombre: %s \n",ptr->dato.nombre);
       printf("\tApellido: %s \n",ptr->dato.apellido);
       printf("\tBoleta: %d \n",ptr->dato.boleta);
       printf("\tCalificacion: %d \n",ptr->dato.calif);
    }    
}
Espero que esto ayude.
Saludos.
  #4 (permalink)  
Antiguo 12/10/2009, 06:46
Avatar de r0d
r0d
 
Fecha de Ingreso: noviembre-2007
Mensajes: 86
Antigüedad: 16 años, 5 meses
Puntos: 3
Respuesta: Problema con listas circulares doblemente enlazadas

A ver tambien: boost::circular_buffer
__________________
Alicia: Sólo quiero saber que camino debo tomar.
Gato risón: Pues... depende mucho de donde quieras ir.

Mi página web
  #5 (permalink)  
Antiguo 12/10/2009, 11:20
 
Fecha de Ingreso: octubre-2009
Mensajes: 39
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Problema con listas circulares doblemente enlazadas

muchas gracias!! joticajulian me sirvio mucho de ayuda creo qe eso era el problema principal pero la funcion imprimir que me pasaste aun se queda pasmada jejeje pero gracias por tu ayuda men saludos
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 17:05.