PDA

Ver la versión completa : Punteros a estructuras



Nelsou
31-10-2009, 03:25
Por favor ayudemen con el sigueinte código debo aplicarle puntero y no tengo ni idea de como hacerlo. Les agradeceré mucho su ayuda.

Les adjunto el código es creado en C++.

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>

#define p printf
#define s scanf

int indice=-1;
#define max 10


void Menu();
void IngresoAlumn();
void Ordenar();
void Buscaralumno();
void Eliminacionfisica();
//void Eliminaciologica();
void Salir();
void REGRESAR();

struct alumno
{
char Ced[25];
char Nomb[25];
char Ape[25];
int Ed;
};

alumno E;
alumno Lista[max],aux;

void main()
{

Menu();
getch();
}

void Menu()
{
clrscr();
p("\n\t\tPROGRAMA MENÚ");
p("\n\n\t1. Ingreso de Datos.");
p("\n\t2. Buscar alumno por Cedula");
p("\n\t3. Mostra Lista de alumnos ordenada");
p("\n\t4. Eliminar un alumno de la lista");
int N;
do
{
p("\n\n\tIngrese la opción:\t");
s("%d",&N);
}while(N<1 || N>5);
switch(N)
{
case 1:
p("\n\n\tIngresar un alumno");
IngresoAlumn();
break;
case 2:
p("\n\n\tBuscar el alumno por cedula");
Buscaralumno();
break;
case 3:
p("\n\n\tLista de alumnos ordenada");
Ordenar();
break;
case 4:
p("\n\n\tEliminar un Alumno de la Lista");
Eliminacionfisica();
//Eliminacionlogica();
break;
case 5:
Salir();
break;
}
}
void IngresoAlumn()
{
clrscr();
printf("\nIngrese Nombre:\t");
scanf("%s",&E.Nomb);
printf("Ingrese Apellido:\t");
scanf("%s",&E.Ape);
printf("Ingrese Cedula:\t");
scanf("%s",&E.Ced);
printf("Ingrese edad:\t");
scanf("%d",&E.Ed);
indice++;
Lista[indice]=E;
REGRESAR();
}

void Buscaralumno()
{
clrscr();
char Ced[9];
printf("Ingrese Cedula:\t");
scanf("%s",&Ced);
for(int i=0;i<=indice;i++)
{
if(strcmp(Lista[i].Ced,Ced)==0)
{
printf("Nombre:%s - Apellido:%s - Edad:%d",Lista[i].Nomb, Lista[i].Ape, Lista[i].Ed);

i=indice;
}
}
REGRESAR();
}

void Ordenar()
{
clrscr();
alumno aux;
for(int i=0;i<=indice-1;i++)
{
for(int j=i+1;j<=indice;j++)
{

if(strcmp(Lista[i].Nomb,Lista[j].Nomb)>0)
{
aux=Lista[i];
Lista[i]=Lista[j];
Lista[j]=aux;
}
else
if(strcmp(Lista[i].Nomb,Lista[j].Nomb)==0)
{
if(strcmp(Lista[i].Ape,Lista[j].Ape)>0)
{
aux=Lista[i];
Lista[i]=Lista[j];
Lista[j]=aux;
}

}
}
}
for(int x=0;x<=indice;x++)
{
printf("\nApellido:%s - Nombre:%s - cedula:%s - Edad:%d",Lista[x].Ape, Lista[x].Nomb, Lista[x].Ced, Lista[x].Ed);


}
REGRESAR();
}

void REGRESAR()
{
char r;
do
{
printf("\t\nDesea realizar otra Opción:S/N\t");
r=toupper(getche());
}while(r!='S' && r!='N');
if(r=='S')
Menu();
if(r=='N')
Salir();
}

void Salir()
{
clrscr();
gotoxy(25,20);
printf("M U C H A S G R A C I A S");
}

void Eliminacionfisica()
{
clrscr();
int i;
int Control;
char Ced[9];
printf("Ingrese Cedula:\t");
scanf("%s",&Ced);
for(i=0;i<=indice;i++)
{
if(strcmp(Lista[i].Ced,Ced)==0)
{
Control=i;
i=indice;
}
}
for(i=Control;i<indice-1;i++)
Lista[i]=Lista[i+1];
indice--;
REGRESAR();
}


/*void Eliminacionlogica();
{
p("\nIngrese Cedula a Eliminar");
s("%s",Ced);

for(int i=0;i<indice;i++)
{
if(strcmp(Lista[i].Ced,Ced)==0)
Lista[i].Estado=I;
}
REGRESAR();
} */

Marchi
31-10-2009, 18:05
Hola Nelsou, supongo que lo que en realidad querés es tener un código similar pero que haga uso de punteros y memoria dinámica para el manejo de estructuras.

Obviamente no voy a escribirte el código, lo mas probable es que sea una tarea que te asignaron a vos y no estamos acá para hacerle la tarea a nadie.

Se te puede ayudar pero para eso es necesario que plantees dudas concretas.

La idea principla en esto es usar listas enlazadas. Es decir, cada dato de tipo Alumno (en tu caso) deberá tener un puntero haciendo referencia a otro dato (en el caso de listas simplemente enlazadas) o dos datos (en el caso de listas doblemente enlazadas).

Esquematicamente sería algo así:

Cabeza -> Alumno1{datos} -> Alumno2{datos} -> ..... -> AlumnoN{datos} -> NULL

Cabeza -> Alumno1{datos} <-> Alumno2{datos} <-> ..... <-> AlumnoN{datos} -> NULL


Como consejo en cuanto al código, te recomendaría que te rijas por el estandar ANSI. No declares main como void, main debería ser int siempre.


Saludos