Código
#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); }