#include
#include
#include
#include
struct datos{
char nombre[30];
int matricula;
char carrera[20];
int semestre;};
struct node{
struct datos info;
struct node *izq,*der;};
typedef struct node nodo;
typedef nodo *tipoarbol;
struct node3{
tipoarbol info3;
struct node3 *sigc;};
typedef struct node3 nodo3;
typedef nodo3 *tipocola;
void altas(tipoarbol *raiz, struct datos x);
void bajas(tipoarbol *raiz,int);
void cambios(tipoarbol *raiz, int, int);
void consulta(tipoarbol,int);
void cambiaxnombre(tipoarbol *raiz, char [],int);
void cambiaxmatricula(tipoarbol *raiz, int, int);
void reportematricula(tipoarbol);
void reporteniveles(tipoarbol raiz);
int buscamatricula(tipoarbol, int);
int buscanombre(tipoarbol, char[]);
void ingresar(tipocola *frente, tipocola *final, tipoarbol x);
int colavacia(tipocola frente);
tipoarbol eliminar(tipocola *frente, tipocola *final);
void main()
{
clrscr();
struct datos x;
tipoarbol raiz=NULL;
int b,c,op,i,opc,mat;
while(op!=6)
{
clrscr();
printf("1)ALTAS\n");
printf("2)BAJAS\n");
printf("3)CAMBIOS\n");
printf("4)CONSULTA\n");
printf("5)REPORTE\n");
printf("6)SALIR\n");
scanf("%d",&op);
clrscr();
switch(op)
{
case 1:
a1:;clrscr();
printf("ALTAS\n");
printf("MATRICULA: ");
flushall();scanf("%d",&x.matricula);
if(!buscamatricula(raiz,x.matricula))
{
printf("NOMBRE: ");
flushall();gets(x.nombre);
printf("CARRERA: ");
flushall();gets(x.carrera);
printf("SEMESTRE: ");
flushall();scanf("%d",&x.semestre);
altas(&raiz,x);
}
else
{printf("ya existe esa matricula...");goto a1;}
break;
case 2:
if(raiz==NULL)
printf("No hay alumnos capturados...");
else
{
a5:;clrscr();
printf("BAJAS");
printf("MATRICULA PARA DAR DE BAJA: ");
scanf("%d",&mat);
if(buscamatricula(raiz,mat))
bajas(&raiz,mat);
else
{printf("no existe la matricula...");getch();goto a5;}
}
getch();
break;
case 3:
if(raiz==NULL)
printf("No hay alumnos capturados...");
else
{
printf("CAMBIOS\n");
printf("BUSCAR POR:\n1)MATRICULA\n2)NOMBRE\n");
scanf("%d",&b);
printf("DESEA HACER CAMBIOS EN:\n1)CARRERA\n2)SEMESTRE\n");
scanf("%d",&c);
cambios(&raiz,b,c);
}
getch();
break;
case 4:
if(raiz==NULL)
printf("No hay alumnos capturados...");
else
{
a4:;clrscr();
printf("MATRICULA PARA CONSULTAR: ");
scanf("%d",&mat);
if(buscamatricula(raiz,mat))
consulta(raiz,mat);
else
{printf ("No existe la matricula..");getch();goto a4;}
}
getch();
break;
case 5:
if(raiz==NULL)
printf("No hay alumnos capturados...");
else
{
printf("1)ORDENADA X MATRICULA\n");
printf("2)ORDENADA X NIVELES\n");
scanf("%d",&opc);clrscr();
gotoxy(1,1);printf("MATRICULA");
gotoxy(20,1);printf("NOMBRE");
gotoxy(40,1);printf("CARRERA");
gotoxy(60,1);printf("SEMESTRE");
for(i=1;i<80;i++)
{gotoxy(i,2);printf("Í");}
printf("\n");
if(opc==1)
reportematricula(raiz);
if(opc==2)
reporteniveles(raiz);
}
getch();
break;
}
}
}
void bajas(tipoarbol *raiz,int mat)
{
tipoarbol p=*raiz, q, aux=*raiz;
if(p->info.matricula==mat)
{
aux=aux->izq;
while(aux->der)
{
q=aux;
aux=aux->der;
}
p->info=aux->info;
if(aux->izq)
q->der=aux->izq;
}
else
{
while(p->info.matricula!=mat)
{
q=p;
if(mat>p->info.matricula)
p=p->der;
else
p=p->izq;
}//while
if(p->der==NULL&&p->izq==NULL)
{
aux=p;
if(q->info.matricula>mat)
q->izq=NULL;
else
q->der=NULL;
goto e;
}//if
else
{
if(p->izq)
{
aux=p->izq;
while(aux->der)
{
q=aux;
aux=aux->der;
}//while
p->info=aux->info;
if(p->izq!=NULL)
{
if(aux->info.matricula==p->izq->info.matricula)
p->izq=aux->izq;
else
if(aux->izq!=NULL)
q->der=aux->izq;goto e;
}//if
else
{
aux=p;
q->izq=p->der;goto e;
}//else
}//else
}//else
e:;
free(aux);
}
}
void altas(tipoarbol *raiz,struct datos x)
{
tipoarbol p=*raiz, q,n;
n=(nodo*)malloc(sizeof(nodo));
n->info=x;
n->der=NULL;n->izq=NULL;
if(*raiz==NULL)
*raiz=n;
else
{
while(p)
{
q=p;
if(x.matricula>p->info.matricula)
p=p->der;
else
p=p->izq;
}
if(x.matricula>q->info.matricula)
q->der=n;
else
q->izq=n;
}
}
void cambios(tipoarbol *raiz,int b, int c)
{
clrscr();
tipoarbol p=*raiz;
int mat, ba;
char nom[20];
if(b==1)
{
a2:;clrscr();
printf("MATRICULA DEL ALUMNO: ");
scanf("%d",&mat);
if(buscamatricula(p,mat))
cambiaxmatricula(raiz,mat,c);
else
{printf("no existe esa matricula...");getch();goto a2;}
}
if(b==2)
{
a3:;clrscr();
printf("NOMBRE DEL ALUMNO: ");
flushall();gets(nom);
if(buscanombre(p,nom))
cambiaxnombre(raiz,nom,c);
else
{printf("no existe esa matricula...");goto a3;}
}
}
void consulta(tipoarbol raiz,int mat)
{
clrscr();
tipoarbol p=raiz;
int ban=1;
while(ban)
{
if(p->info.matricula==mat)
ban=0;
else
{
if(mat>p->info.matricula)
p=p->der;
else
p=p->izq;
}
}
printf("MATRICULA: %d\n",p->info.matricula);
printf("NOMBRE: %s\n",p->info.nombre);
printf("CARRERA: %s\n",p->info.carrera);
printf("SEMESTRE: %d\n",p->info.semestre);
}
void cambiaxmatricula(tipoarbol *raiz, int mat, int c)
{
int sem,ban=1;
char car[20];
tipoarbol p=*raiz;
while(ban)
{
if(p->info.matricula==mat)
ban=0;
else
{
if(mat>p->info.matricula)
p=p->der;
else
p=p->izq;
}
}
if(c==1)
{
printf("NUEVA CARRERA: ");
flushall();gets(car);
strcpy(p->info.carrera,car);
}
if(c==2)
{
printf("NUEVO SEMESTRE: ");
flushall();scanf("%d",&sem);
p->info.semestre=sem;
}
}
void cambiaxnombre(tipoarbol *raiz, char nom[],int c)
{
char car[20];
int sem, ban=1;
tipoarbol p=*raiz;
while(ban)
{
if(!strcmp(p->info.nombre,nom))
ban=0;
else
{
if(strcmp(nom,p->info.nombre)>0)
p=p->der;
else
p=p->izq;
}
}
if(c==1)
{
printf("NUEVA CARRERA: ");
flushall();gets(car);
strcpy(p->info.carrera,car);
}
if(c==2)
{
printf("NUEVO SEMESTRE: ");
flushall();scanf("%d",&sem);
p->info.semestre=sem;
}
}
void reporteniveles(tipoarbol raiz)
{
tipocola frente=NULL,final=NULL;
tipoarbol p=raiz;
ingresar(&frente,&final,p);
while(colavacia(frente))
{
p=eliminar(&frente,&final);
printf("%d\t\t %s\t\t %s\t\t %d\n",p->info.matricula,p->info.nombre,p->info.carrera,p->info.semestre);
if(p->izq!=NULL)ingresar(&frente,&final,p->izq);
if(p->der!=NULL)ingresar(&frente,&final,p->der);
}
}
void reportematricula(tipoarbol raiz)
{
if(raiz)
{
reportematricula(raiz->izq);
printf("%d\t\t %s\t\t %s\t\t %d\n",raiz->info.matricula,raiz->info.nombre,raiz->info.carrera,raiz->info.semestre);
reportematricula(raiz->der);
}
}
int buscamatricula(tipoarbol raiz, int n)
{
tipoarbol p=raiz;
while(p)
{
if(p->info.matricula==n)
return 1;
else
if(n>p->info.matricula)
p=p->der;
else
p=p->izq;
}
return 0;
}
int buscanombre(tipoarbol raiz, char nom[])
{
tipoarbol p=raiz;
while(p)
{
if(!strcmp(p->info.nombre,nom))
return 1;
else
if(strcmp(nom,p->info.nombre)>0)
p=p->der;
else
p=p->izq;
}
return 0;
}
//funcion para ingresar direcciones a la cola
void ingresar(tipocola *frente, tipocola *final, tipoarbol x)
{
tipocola n;
tipoarbol q=x;
n=(nodo3*)malloc(sizeof(nodo3));
n->info3=q;
n->sigc=NULL;
if(*frente==NULL)
{
*frente=n;
*final=n;
}
else
{
(*final)->sigc=n;
*final=n;
}
}
int colavacia(tipocola frente)
{
if(frente)
return 1;
return 0;
}
/*funcion para eliminar los valores de la cola, regresa una direccion
a la cual apunta x que es un apuntador de tipoarbol*/
tipoarbol eliminar(tipocola *frente,tipocola *final)
{
tipocola p=*frente;
tipoarbol x;
x=p->info3;
if((*frente)==(*final))
{
*frente=NULL;
*final=NULL;
}
else
*frente=(*frente)->sigc;
free(p);
return x;
}
2006-12-12 17:11:14
·
answer #3
·
answered by michael scofield 3
·
0⤊
1⤋