Queria saber si esta bien el modulo crear(nuevo) donde asigno enteros a una variable logica o hay otra forma mas "estetica"? gracias
#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);
}
			
			
			
				Por qué esto??
typedef struct ambito{
	bool local;
};
typedef struct simbolo{
	//...
	ambito global;
}; 
Primero que es más simple directamente crear una variable de tipo <bool> dentro de <simbolo>. Y segundo tal y como está ahí, si asignas <true> a <bool local>; entonces <ambito global> es igual a <true>. Osea a la inversa...
Y si no quieres asignar un <int> a un <bool> comprueba cada caso con <if>.
do{
	cout<<"Ingrese ambito local(0)/global(1): ";
	cin>>auxiliar;
	if(auxiliar==0)
		nuevo->dato.global.local=true;
	else if(auxiliar == 1)
                nuevo->dato.global.local = false;
}while(auxiliar != 0 && auxiliar != 1); 
No sé si está bien asignado o es al revés ya que es un lio el "global.local".
PD: Hay un <system("pause")> por ahí que quedaría mejor con un <cin.get()>... :rolleyes:
Y para mí la mayor ventaja de C++ en comparación a C es el uso de <string> en vez de <char*>, así evitas tener que usar <fflush(stdin)> Y coger el valor con un <cin> o <getline()> y no tener que usar <gets()> (y mejor que <gets()> es usar <fgets()>). :-X
			
			
			
				typedef struct ambito{
	bool local;
};
Eso porque la consigna pedia una estructura ambito(local,global) y bueno ... pero si tienes razon, y con lo de  validar que solo sea 1 o 0 el dato entero est bien queda mejor asi como lo hiciste, muchas gracias
do{
			cout<<"Ingrese ambito local(0)/global(1): ";
			cin>>auxiliar;
			if(auxiliar==0)
				nuevo->dato.global.local=false;
			else if(auxiliar==1)
		        nuevo->dato.global.local=true;
		}while(auxiliar!=0 && auxiliar!=1);