#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
const int MAX=32;
typedef char tcad[MAX];
typedef struct ambito{
bool local;
};
typedef struct simbolo{
tcad nombre;
tcad tipo_dato;
int tamanyo;
int valor;
ambito global;
};
typedef struct tnodo *pnodo;
typedef struct tnodo{
simbolo dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
pnodo final;
};
void iniciar(tlista &tabla);
void crear(pnodo &nuevo);
bool validar(tcad cadena);
void agregar_final(tlista &tabla, pnodo nuevo);
int cantidad(pnodo i);
int total_bytes(pnodo i);
void ordenar(tlista &tabla);
void mostrar(tlista tabla);
void nueva_cadena(tcad &cadena);
int main()
{
int opcion;
tlista mitabla;
pnodo nuevo;
iniciar(mitabla);
do{
system("cls");
cout<<"1. Agregar variable a la tabla"<<endl;
cout<<"2. Mostrar cantidad de variables"<<endl;
cout<<"3. Calcular bytes de la tabla"<<endl;
cout<<"4. Ordenar tabla"<<endl;
cout<<"5. Mostrar tabla"<<endl;
cout<<"6. Salir"<<endl;
cin>>opcion;
switch(opcion){
case 1: crear(nuevo);
if(nuevo!=NULL)
agregar_final(mitabla,nuevo);
break;
case 2: cout<<"Cantidad de variables: "<<cantidad(mitabla.inicio)<<endl;break;
case 3: cout<<"Bytes totales de la tabla: "<<total_bytes(mitabla.inicio)<<endl;break;
case 4: ordenar(mitabla);break;
case 5: mostrar(mitabla);break;
case 6: cout<<"FIN DEL PROGRAMA"<<endl;break;
default: cout<<"Opcion incorrecta"<<endl;
}
system("Pause");
}while(opcion!=6);
}
void iniciar(tlista &tabla)
{
tabla.inicio=NULL;
tabla.final=NULL;
}
//Aca es donde quiero que vean si esta bien lo de asignar valor entero a esa variable logica nuevo->dato.global.local ya que ...
void crear(pnodo &nuevo)
{
int auxiliar;
bool valido;
nuevo=new tnodo;
if(nuevo!=NULL){
do{
cout<<"Ingrese nombre variable: ";
nueva_cadena(nuevo->dato.nombre);
}while(validar(nuevo->dato.nombre)==false);
cout<<"Ingrese tipo de dato: ";
nueva_cadena(nuevo->dato.tipo_dato);
cout<<"Ingrese tamaño: ";
cin>>nuevo->dato.tamanyo;
cout<<"Ingrese valor: ";
cin>>nuevo->dato.valor;
do{
cout<<"Ingrese ambito local(0)/global(1): ";
cin>>auxiliar;
if(auxiliar==0 || auxiliar==1){
nuevo->dato.global.local=auxiliar;
valido=true;
}
else
valido=false;
}while(valido==false);
nuevo->sig=NULL;
}
else
cout<<"MEMORIA INSUFICIENTE"<<endl;
}
//... de esta forma no me funciona :(
void crear(pnodo &nuevo)
{
nuevo=new tnodo;
if(nuevo!=NULL){
do{
cout<<"Ingrese nombre variable: ";
nueva_cadena(nuevo->dato.nombre);
}while(validar(nuevo->dato.nombre)==false);
cout<<"Ingrese tipo de dato: ";
nueva_cadena(nuevo->dato.tipo_dato);
cout<<"Ingrese tamaño: ";
cin>>nuevo->dato.tamanyo;
cout<<"Ingrese valor: ";
cin>>nuevo->dato.valor;
//JUSTO DESDE AQUI
do{
cout<<"Ingrese ambito local(0)/global(1): ";
cin>>nuevo->dato.global.local;
}while(nuevo->dato.global.local<0 || nuevo->dato.global.local>1);
nuevo->sig=NULL;
}
else
cout<<"MEMORIA INSUFICIENTE"<<endl;
}
bool validar(tcad cadena)
{
int i;
bool validado=true;
if(islower(cadena[0]) || isupper(cadena[0])){
for(i=1;i<strlen(cadena) && !validado;i++){
if(isdigit(cadena[i]) || isupper(cadena[i]) || islower(cadena[i]) || cadena[i]=='_')
validado=true;
else
validado=false;
}
}
else
validado=false;
return validado;
}
void agregar_final(tlista &tabla, pnodo nuevo)
{
if(tabla.inicio==NULL){
tabla.inicio=nuevo;
tabla.final=nuevo;
}
else{
tabla.final->sig=nuevo;
tabla.final=nuevo;
}
}
int cantidad(pnodo i)
{
if(i==NULL)
return 0;
else
return cantidad(i->sig)+1;
}
int total_bytes(pnodo i)
{
if(i==NULL)
return 0;
else
return i->dato.tamanyo+total_bytes(i->sig);
}
void ordenar(tlista &tabla)
{
pnodo i, j;
simbolo cambio;
bool ordenado=true;
if(tabla.inicio!=NULL){
while(ordenado){
ordenado=false;
for(i=tabla.inicio;i->sig!=NULL;i=i->sig){
j=i->sig;
if(i->dato.tamanyo>j->dato.tamanyo){
cambio=i->dato;
i->dato=j->dato;
j->dato=cambio;
ordenado=true;
}
}
}
}
}
void mostrar(tlista tabla)
{
pnodo i;
if(tabla.inicio!=NULL){
for(i=tabla.inicio;i!=NULL;i=i->sig){
cout<<"Nombre variable: "<<i->dato.nombre<<endl;
cout<<"Tipo de dato: "<<i->dato.tipo_dato<<endl;
cout<<"Tamaño: "<<i->dato.tamanyo<<" Bytes"<<endl;
cout<<"Valor: "<<i->dato.valor<<" Bytes"<<endl;
cout<<"Ambito: ";
if(i->dato.global.local==true)
cout<<"Global"<<endl;
else
cout<<"Local"<<endl;
cout<<endl;
}
}
else
cout<<"Tabla vacia"<<endl;
}
void nueva_cadena(tcad &cadena)
{
fflush(stdin);
gets(cadena);
fflush(stdin);
}