[AYUDA] Punteros y Nodos!!!!

Iniciado por dixson, 24 Enero 2011, 21:14 PM

0 Miembros y 1 Visitante están viendo este tema.

dixson

Hola como estan buenos amigos espero que me ayuden..

me mandaron hacer un proyecto en la Uni..

sobre un sistema que tome la consultas de los pacientes en unca clinica..

el problema es que cuando elimino un paciente que esta de primero  no me muestra un segundo

ejemplo:

1er paciente
nombre: dixson
cedula: 19750xxx
edad: 19
fecha de la cita 18/01/11


2do paciente
nombre: jose
cedula: 19750xxx
edad: 20
fecha de la cita 18/01/11


elimino al 1er paciente y el segundo no me lo muestra cuando lo pido.. asumo yo que es porque no vuelve a enlazar el nodo o nose

gracias aqui esta el codigo..

#include<stdio.h> //declaracion de librerias basicas
#include<stdlib.h>
struct nodo //declaracion del nodo con su campos
{
char nombre[30], fecha[15];
int cedula,edad;
struct nodo *siguiente;
};

typedef nodo lista;  //typedef de cada nodo, que se convierte en la lista
lista *primero, *segundo, *tercero, *cuarto, *quinto;

void crear_nodo() //creacion e incializacion del nodo
{
primero=new(nodo); //creacion del primer nodo
primero->nombre[30]= NULL;  //NULL para dejar vacio el arreglo de caracteres
primero->fecha[30]= NULL;
primero->cedula=0;
primero->edad=0;
primero->siguiente=0;

segundo=new(nodo); //creacion del segundo
segundo->nombre[30]= NULL;
segundo->fecha[30]= NULL;
segundo->cedula=0;
segundo->edad=0;
segundo->siguiente=0;

tercero=new(nodo); //creacion del tercero
tercero->nombre[30]= NULL;
tercero->fecha[30]= NULL;
tercero->cedula=0;
tercero->edad=0;
tercero->siguiente=0;

cuarto=new(nodo); //creacion del cuarto
cuarto->nombre[30]= NULL;
cuarto->fecha[30]= NULL;
cuarto->cedula=0;
cuarto->edad=0;
cuarto->siguiente=0;

quinto=new(nodo); //creacion del quinto
quinto->nombre[30]= NULL;
quinto->fecha[30]= NULL;
quinto->cedula=0;
quinto->edad=0;
quinto->siguiente=0;

}

void enlazar_nodos() //enlazar los nodos con el siguiente
{
primero->siguiente=segundo;
segundo->siguiente=tercero;
tercero->siguiente=cuarto;
cuarto->siguiente=quinto;
}

void leerdatos() //funcion que lee los datos de las personas y los agrega a la lista de citas
{
lista *temp; //declaro variable temp
temp=primero;
char extra[20]; //variable adicional para recibir el nombre con los espacios
int x=0,y=0; //variables que se usaran para comparar durante el while
printf("Cuantas personas desea agregar?");
scanf("%i",&x); //obtenemos el valor de X
while ((x!=0) && (x<5) && (x!=y)) //mientras x no sea 0 y x sea menor que 5 y X y Y sean diferentes;
{
if (temp->cedula == 0) //verifica que el nodo este vacio para agregar la infomacion
{
printf("\nIntroduzca La cedula: "); //pide los datos
scanf("%i",&temp->cedula);
printf("\nIntroduzca El Nombre: ");
gets(extra);
gets(temp->nombre);
printf("\nIntroduzca Edad: ");
scanf("%i",&temp->edad);
printf("\nIntroduzca Fecha de Proxima Cita: ");
scanf("%s",&temp->fecha);
temp=temp->siguiente; //mueve el puntero temporal al siguiente nodo
x=x-1; //cuenta las veces que se hace el proceso dependiendo del valor deseado
}
else //si el nodo no esta vacio
{
temp=temp->siguiente; //mueve el puntero hacia el siguiente nodo
}
}
}


void imprimir() //mostrar datos almacenados
{
lista *tempo; //puntero temporal
tempo=primero;
while(tempo->cedula!=0) //mientras la parte cedula de lo que apunta el puntero no sea 0, verificando que no este vacio
{
if (tempo->cedula==0) //si la parte cedula del punterp tempo es igual a 0
{
tempo=tempo->siguiente; //mueve el puntero al siguiente
}
else //sino
{
printf("El Nombre: %s \n",tempo->nombre); //imprime los datos almacenados
printf("La Edad: %i \n",tempo->edad);
printf("Cedula: %i \n",tempo->cedula);
printf("Fecha: %s \n",tempo->fecha);
tempo=tempo->siguiente;
}
}
printf("\nNo Hay Mas Citas Pendientes\n");  //al final imprime esto.
system("pause");
}



void buscar() //para buscar al paciente por numero de cedula
{
bool bandera; //un bool que usamos para la busqueda
lista *aux; //puntero auxiliar que se movera por la lista
int ced; //variable que se comparara con la cedula
bandera=false; //bandera=false para que siempre entre a la busqueda
printf("\nIntroduzca la cedula a buscarr: ");
scanf("%i",&ced); //obtenemos el valor de la cedula a buscar
aux=primero;
while((bandera == false) && (aux!=0)) //comenzamos la busqueda mientras bandera sea false y lo que apunta aux no sea 0
{
if (aux->cedula == ced) //si la parte cedula del auxiliar es igual a la cedula solicitada entonces,
{
bandera = true; //hace bandera = true para que al proximo intento no entre en la busqueda
printf("\nPaciente Encontrado:\n  "); //muestra los datos almacenados del paciente encontrado.
printf("\nEl Nombre: %s ",aux->nombre);
printf("\nLa Edad: %i ",aux->edad);
printf("\nCedula: %i ",aux->cedula);
printf("\nFecha: %s ",aux->fecha);
}
else aux=aux->siguiente; // en caso de que las cedulas sean diferentes solo mueve el puntero al siguiente nodo
}
if (aux == 0) printf("\nNo Tiene Citas"); //si aux es igual a 0, osea que no hay valores en los nodos entonces muestra esto.
system("pause");
}


void eliminar() // funcion que elimina los datos de un paciente de la lista //revisar
{
bool busqueda; // busqueda para que realice la busqueda de la cedula
lista *borrar; // puntero adicional que se movera por los nodos
int ce; // ce es para comparar la cedula a buscar con esta
busqueda=false;
printf("\nIntroduzca el Numero de cedula: \n");
scanf("%i",&ce);  // obtenemos ce para comparar con la cedula en el nodo
borrar=primero;  //hacemos que el puntero apunte al primer nodo
while (busqueda == false) //y comenzamos la busqueda
{
if (borrar->cedula == ce)  //si la parte cedeula de lo que apunta borrar es igual a la cedula pedida
{
busqueda= true; //hace bandera = true para que al proximo intento se salga de la lista
borrar->cedula=0; //e inicializa todos los campos en 0
borrar->nombre[30]= NULL;
borrar->edad=0;
borrar->fecha[15]= NULL;
printf("Paciente Eliminado \n");
borrar=borrar->siguiente;  //y mueve el puntero al siguiente
}
else //si las cedulas no son iguales
{
borrar=borrar->siguiente; //mueve el puntero al siguiente y vuelve a comparar
}
}
if (borrar == 0) printf("\nNo Existen Datos"); //si la cedula no se consigue muestra esto
system("pause");
}

void menu()     //menu principal
{
int op;    //variable que determina la opcion sugerida por el usuario
system("cls");
printf(" \n\nControl De Citas.");
printf(" \n1.- Nueva Cita. ");
printf(" \n2.- Ver Citas Pendientes. ");
printf(" \n3.- Buscar Paciente.");
printf(" \n4.- Eliminar Citas.");
printf(" \n5.- Salir.");
printf(" \nseleccionar opcion: ");
scanf("%i",&op);  //obtenemos el valor de la opcion

switch (op) //hacemos el switch con las llamadas a las respectivas funciones segun sea el caso
{
case 1: system("cls");
leerdatos();
menu();
    break;
case 2: system("cls");
    imprimir();
menu();
break;
case 3: system("cls");
    buscar();
menu();
break;
case 4: system("cls");
eliminar();
menu();
break;
case 5: exit(0);
}
}

void main()  //void principal, que llama a las funciones basicas
{
crear_nodo();  //llamado a crear nodo
enlazar_nodos();  //lamado para enlazar los nodos creados
menu();  //y muestra el menu
} //fin

Oblivi0n

Ahora mismo no tengo mucho tiempo para leer el codigo, asique le heche un vistacillo por encima, los errores mas basicos que veo es declarar main() como void, el standart dice (no hay por que cumplirlo pero se recomienda) que este debe ser dclarado como int, y obviamente devolvr un valor, por lo general 0

Y luego, mezclas C con C++, usas librerias de C y funciones de C++ como new, cierto es que puede que resulte mas facil usar new que malloc(), pero es como mezclar ingles y español.... (por poner algun parecido  :xD )

Cuando tenga mas tiempo miro el codigo, ahora ando liado con examenes xD

dixson

perdon pero asi me enseñaron en la universidad...

y porfavor espero me ayuden lo mas pronto posible

negux

por que no en tu funcion de imprimir haces el recorrido pero comprobando que no sea null

while(tempo!=NULL)
       if(tempo->sig==NULL)


espero no equivocarme, no tengo con que compilarlo ahorita ;D

dixson

#4
ya lo probe me sale este error y noc que hacer..

me salen todos los nodos ahora

http://img121.imageshack.us/i/dedas.jpg

negux

no se porke usas 5 listas, creo que con una es suficiente  :P
a lo mejor cuando enlazas el primero con el segundo etc... pues a ellos no vi que les asignaras algo solo los inicializas, ademas de algunos errores que ya te mencionaron

void imprimir()
{
lista *tempo;
tempo=primero;
if(tempo!=NULL)
{
while(tempo->sig!=NULL)
{

printf("El Nombre: %s \n",tempo->nombre);
printf("La Edad: %i \n",tempo->edad);
printf("Cedula: %i \n",tempo->cedula);
printf("Fecha: %s \n",tempo->fecha);
tempo=tempo->siguiente;
}
}else{
        printf("Lista vacia\n");

system("pause");
}