程序代码:
typedef struct BiTNode
{
char *data;
struct BiTNode *lchild,*rchild;
} BiTNode, *BiTree;
CString sentence="dj-ZW 他们/rN [ [ vp-ZZ 都/d [ [ vp-ZZ 会/vM [ [ vp-ZZ 尽力/d [ [ vp-PO 收集/v [ [ np-DZ 有关/b 信息/n ";int CreateBiTree(BiTree *Tree, CString &str)
{
CString word=str.SpanExcluding(" ");
str=str.Mid(word.GetLength());
str.TrimLeft();
if(word=="[" || word.IsEmpty()) {
(*Tree) = NULL;
return(0);
}
else {
if(!((*Tree) = (BiTree)malloc(sizeof(BiTNode))))
exit(0);
(*Tree)->data = (char*)(LPCTSTR)word;
List.AddTail((*Tree)->data);
CreateBiTree(&((*Tree)->lchild), sentence);
CreateBiTree(&((*Tree)->rchild), sentence);
}
return(1);
}
int Visit(char *str)
{
if (str)
{
CString msg;
msg.Format("%s", str);
AfxMessageBox(str);
return(1);
}
else
return(0);
} int PreOrderTraverse(BiTNode *T, int(*Fun) (char *str))
{
if(T)
{
if(Visit(T->data))
if(PreOrderTraverse(T->lchild,Fun))
if(PreOrderTraverse(T->rchild,Fun))
return(1);
return(0);
}
else
return(1);
} void CPreOrderDlg::OnButton1()
{
BiTree Tr=NULL;
int i=CreateBiTree(&Tr, sentence);
if(i==1)
AfxMessageBox("OoooK");
else
AfxMessageBox("ErrRR");
PreOrderTraverse(Tr,Visit);
}输出结果:不是预期的CString sentence中以空格隔开的字符串,而是乱码。请帮忙指正错误。非常感谢!
typedef struct BiTNode
{
char *data;
struct BiTNode *lchild,*rchild;
} BiTNode, *BiTree;
CString sentence="dj-ZW 他们/rN [ [ vp-ZZ 都/d [ [ vp-ZZ 会/vM [ [ vp-ZZ 尽力/d [ [ vp-PO 收集/v [ [ np-DZ 有关/b 信息/n ";int CreateBiTree(BiTree *Tree, CString &str)
{
CString word=str.SpanExcluding(" ");
str=str.Mid(word.GetLength());
str.TrimLeft();
if(word=="[" || word.IsEmpty()) {
(*Tree) = NULL;
return(0);
}
else {
if(!((*Tree) = (BiTree)malloc(sizeof(BiTNode))))
exit(0);
(*Tree)->data = (char*)(LPCTSTR)word;
List.AddTail((*Tree)->data);
CreateBiTree(&((*Tree)->lchild), sentence);
CreateBiTree(&((*Tree)->rchild), sentence);
}
return(1);
}
int Visit(char *str)
{
if (str)
{
CString msg;
msg.Format("%s", str);
AfxMessageBox(str);
return(1);
}
else
return(0);
} int PreOrderTraverse(BiTNode *T, int(*Fun) (char *str))
{
if(T)
{
if(Visit(T->data))
if(PreOrderTraverse(T->lchild,Fun))
if(PreOrderTraverse(T->rchild,Fun))
return(1);
return(0);
}
else
return(1);
} void CPreOrderDlg::OnButton1()
{
BiTree Tr=NULL;
int i=CreateBiTree(&Tr, sentence);
if(i==1)
AfxMessageBox("OoooK");
else
AfxMessageBox("ErrRR");
PreOrderTraverse(Tr,Visit);
}输出结果:不是预期的CString sentence中以空格隔开的字符串,而是乱码。请帮忙指正错误。非常感谢!
解决方案 »
- SQL 如何快速的返回某一行中的几列值?
- 高手请过来指点啊 Release和Debug的问题
- 基础问题:VC MFC程序中如何调用系统 API ,MessageBox 之类的
- 怎样用CImage实现图象伸缩?
- 请问如何判断某个窗体当前是否处于桌面顶层?
- 在滚动视图如何控制图形的重画?
- 不是把,GetSystemTime()怎么不准确阿!!!!
- socket通信中//Recv函数接受数据的大小,如何动态改变?
- 高分求解:如何将标点符号从一串字符串中区别开来?
- 如何将swf的flash文件加入到vc项目的资源中,程序中双如何调用?
- CDaoDatabase如何打开远程数据库
- VC++使用NTKO文档组件的问题
(*Tree)->data = (char*)(LPCTSTR)word;
这里data指向一个临时变量,那么就得看你的List.AddTail里面是否另外申请了内存来保存这个字符串,否则就是一个野指针,当然是乱码了。
这里的List.AddTail是CStringList类型,目的是把(*Tree)->data的内容保存起来,以便察看里面到底是什么。
经实验,List.AddTail显示的内容是预期的。就是说,(*Tree)->data的内容也是预期的。
(*Tree)->data = (char*)(LPCTSTR)word;
临时指针,函数执行完后就被销毁。
怎么改呢?
结帖。