Gente tengo un problema que la verdad, me saca y no tengo ni idea porque lo hace. Si alguno sabe porque lo hace si seria tan amable de darme una mano, muchas gracias.



Les dejo el codigo de el main, el hpp y el cpp

Código:
main

#include<iostream>
#include<cstring>
#include<stdio.h>
#include<cstdlib>
#include"OBD.H"
using namespace std;


int main () 
{	
	Ttabla BD=NULL;
	char * opcion=new char;
	char * dat=new char;
	//char * dato=new char;
	do
		{
			cout<<"#^> ";
			cin>>opcion;
			if (strcmp(opcion,"exit")==0)
			{
				return 0;
			}
			else if (strcmp(opcion,"printTables")==0)
			{
				printTables(BD);
				//getchar();
				//system("cls");
			}
			cin>>dat;
			dat=strtok(dat,"()");
			cout<<dat<<endl;
			if (strcmp(opcion,"createTable")==0)
			{
				cout<<"Entrando"<<endl;
				if (createTable(BD,dat)==0)
				{
					cout<<"Tabla creada exitosamente."<<endl;
				}
				else
					{
						cout<<"Ya existe una tabla con nombre "<<dat<<" en la base de datos."<<endl;
					}
				//getchar();
				//system("cls");
			}
		}while(strcmp(opcion,"exit")!=0);
	return 0;
}
Código:
obd.cpp

#include<iostream>
#include<cstdio>
#include"OBD.H"
using namespace std;


Ttabla crearTabla(char * nombreTabla)
{
	cout<<"El error ocurre aca"<<endl;
	Ttabla nuevo = new tipoTabla;
	strcpy(nuevo->nombre,nombreTabla);
	nuevo->sigT=NULL;
	nuevo->priC=NULL;
	return nuevo;
}


int insertarTabla (Ttabla &b, Ttabla nuevo)
{
	Ttabla aux;
	if (b==NULL)
	{
		nuevo->sigT=b;
		b=nuevo;
		return 0;
	}
	else
		{
			aux = b;
			while (aux->sigT!=NULL)
			{
				aux = aux->sigT;
			}
			nuevo->sigT=aux->sigT;
			aux->sigT=nuevo;
		}
	return 0;
}


TipoRet createTable (Ttabla &base, char * nombreTabla) //Encabezado modificado, no se puede manejar una lista sin llamarla previamente
{
	Ttabla aux=base;
	int cont=0;
	while (aux!=NULL)
	{
		if (strcmp(aux->nombre,nombreTabla)==0)
		{
			cont++;
			cout<<"Nombres iguales"<<endl;
			getchar();
		}
		aux=aux->sigT;
	}
	if (cont==1)
	{
		cout<<"No insertamos"<<endl;
		return ERROR;
	}
	else
		{
			insertarTabla(base, crearTabla(nombreTabla));
			cout<<"Se crea la nueva tabla"<<endl;
			return OK;
		}
}


TipoRet dropTable (char * nombreTabla)
{
	return NO_IMPLEMENTADA;
}


TipoRet addCol (char * nombreTabla, char * nombreCol)
{
	return NO_IMPLEMENTADA;
}


TipoRet dropCol (char * nombreTabla, char * nombreCol)
{
	return NO_IMPLEMENTADA;
}


TipoRet insertInto (char * nombreTabla, char * valoresTupla)
{
	return NO_IMPLEMENTADA;
}


TipoRet deleteFrom (char * nombreTabla, char * condicionEliminar)
{
	return NO_IMPLEMENTADA;
}


TipoRet join (char * nombreTabla1, char * nombreTabla2, char * nombreTabla3)
{
	return NO_IMPLEMENTADA;
}


TipoRet equalTables (char * nombreTabla1, char * nombreTabla2, bool & iguales)
{
	return NO_IMPLEMENTADA;
}


TipoRet printTables (Ttabla b)//Necesita que le pase la BD, de lo contrario no tengo datos para mostrar
{
	Ttabla aux = b;
	if (b==NULL)
	{
		cout<<"No hay tablas en la base de datos."<<endl;
		return OK;
	}
	else
		{
			while (aux!=NULL)
			{
				cout<<"|| "<<aux->nombre<<" ||"<<endl;
				aux=aux->sigT;
			}
		}
	return OK;
}


TipoRet printMetadata (char * nombreTabla)
{
	return NO_IMPLEMENTADA;
}


TipoRet printDataTable (char * nombreTabla)
{
	return NO_IMPLEMENTADA;
}


TipoRet recent ()
{
	return NO_IMPLEMENTADA;
}
Código:
obd.h

//Operaciones sobre la Base de Datos
#ifndef OBD_H
#define OBD_H
enum _retorno{
						OK, ERROR, NO_IMPLEMENTADA
					};


typedef enum _retorno TipoRet;


typedef struct tabla{
	char * nombre;//nombre de la tabla
	struct tabla *sigT;//puntero a siguiente tabla
	struct columna *priC;//puntero a primer columna
}tipoTabla;


typedef struct columna{
	char nomCol;//nombre de la columna
	struct columna *sigC;//puntero a siguiente columna
	struct datos *priD;//puntero al dato de la columna
}tipoColumna;


typedef struct datos{
	char info;//datos en la columna
	struct datos *sigD;//puntero a siguiente dato
}tipoDato;


typedef tipoTabla *Ttabla;//  Tipo para crear tablas
typedef tipoColumna *Tcol; // Tipo para crear columnas
typedef tipoDato *Tdat;// Tipo para crear datos


Ttabla crearTabla (char * nombreTabla);
int insertarTabla (Ttabla &, Ttabla);
TipoRet createTable (Ttabla &, char * nombreTabla);
TipoRet dropTable (char * nombreTabla);
TipoRet addCol (char * nombreTabla, char * nombreCol);
TipoRet dropCol (char * nombreTabla, char * nombreCol);
TipoRet insertInto (char * nombreTabla, char * valoresTupla);
TipoRet deleteFrom (char * nombreTabla, char * condicionEliminar);
TipoRet join (char * nombreTabla1, char * nombreTabla2, char * nombreTabla3);
TipoRet equalTables (char * nombreTabla1, char * nombreTabla2, bool & iguales);
TipoRet printTables (Ttabla);
TipoRet printMetadata (char * nombreTabla);
TipoRet printDataTable (char * nombreTabla);
TipoRet recent ();




#endif