PDA

View Full Version : Code tìm kiếm trong cây nhị phân trong C++. Lỗi chỉ tìm được từ đầu tiên trong file thôi sửa thế nào?



elvish
27-03-2010, 05:26 PM
các bro giúp mình với, khi mình tìm từ thì chỉ tìm được từ đầu tiên trong file thôi, còn mấy từ khác tìm kô được.


#include <iostream>
#include <string.h>
#include <fstream>
#include <stdio.h>
#include <conio.h>
#define MAX_WORD 15
#define MAX_MEANING 100
using namespace std;

typedef struct tagDICTIONARY_NODE
{
char Word[MAX_WORD];
char Meaning[MAX_MEANING];
tagDICTIONARY_NODE *pLeft;
tagDICTIONARY_NODE *pRight;
} DICTIONARY_NODE;

typedef struct DICTIONARY_TREE
{
int nCount;
DICTIONARY_NODE *pRoot;
} DICTIONARY_TREE;

void DictionaryCreate (DICTIONARY_TREE &t)
{
t.nCount = 0;
t.pRoot = NULL;
}

int DictionaryIsEmpty (const DICTIONARY_TREE &t)
{
if (t.pRoot==NULL) return 1;
return 0;
}

DICTIONARY_NODE* DictionarySearch (DICTIONARY_NODE *&pCurr, char keyword[])
{
if (pCurr==NULL)
return NULL;
if (strcmp(pCurr->Word, keyword)==0)
return pCurr;
else
if (pCurr->Word>keyword)
return DictionarySearch (pCurr->pLeft, keyword);
else
return DictionarySearch (pCurr->pRight, keyword);
}

DICTIONARY_NODE * SearchStandFor (DICTIONARY_NODE *&p, DICTIONARY_NODE *pCurr)
{
if (p->pRight != NULL)
return SearchStandFor (p->pRight, pCurr);
strcmp (pCurr->Word, p->Word);
DICTIONARY_NODE *pTemp = p;
p = p->pLeft;
return pTemp;
}

int DictionaryInsert (DICTIONARY_NODE *&pCurr, char newword[], char meaning[])
{
if (pCurr==NULL)
{
pCurr = new DICTIONARY_NODE;
strcpy(pCurr->Word, newword);
strcpy(pCurr->Meaning,meaning);
pCurr->pLeft = pCurr->pRight=NULL;
return 1;
}
if (strcmp(pCurr->Word, newword)>0)
return DictionaryInsert (pCurr->pLeft, newword, meaning);
else
if (strcmp(pCurr->Word, newword)<0)
return DictionaryInsert (pCurr->pRight, newword, meaning);
else return 0;
}

void Delete (DICTIONARY_NODE *&pCurr)
{
DICTIONARY_NODE *pTemp = pCurr;
if (pCurr->pRight==NULL)
pCurr = pCurr->pLeft;
else
if (pCurr->pLeft==NULL)
pCurr = pCurr->pRight;
else
pTemp = SearchStandFor (pCurr->pLeft, pCurr);
delete pTemp;
}

int DictionaryDelete (DICTIONARY_NODE *&pCurr, char delword[])
{
if (pCurr==NULL) return 0;
if (strcmp(pCurr->Word, delword)>0)
return DictionaryDelete (pCurr->pLeft, delword);
else
if (strcmp(pCurr->Word, delword)<0)
return DictionaryDelete (pCurr->pRight, delword);
Delete (pCurr);
return 1;
}

int HeightOfTree (DICTIONARY_NODE *pRoot)
{
int h1, h2;
if (pRoot==NULL)
return 0;
h1=HeightOfTree ((pRoot)->pLeft);
h2=HeightOfTree (pRoot->pRight);
if (h1>h2) return 1+h1;
else
return 1+h2;
}

void BuildDictionary (DICTIONARY_TREE &DT)
{
fstream f("tudien.txt");
char keyword[MAX_WORD];
char meaning[MAX_MEANING];

while (!f.eof())
{
f>>keyword;
f.getline (meaning, MAX_MEANING);
DictionaryInsert (DT.pRoot, keyword, meaning);
}
}

void main ( )
{
DICTIONARY_TREE DT;
DICTIONARY_NODE* A;
int choice;
cout<<" o0o---Chuong Trinh Tra Cuu Tu Dien Anh-Viet---o0o"<<endl<<endl;
do
{
cout<<"<MENU>"<<endl<<endl;
cout<<"1. Tao cay tu dien A-V"<<endl;
cout<<"2. Tim nghia mot tu"<<endl;
cout<<"3. Them mot tu moi vao cay tu dien"<<endl;
cout<<"4. Xoa mot tu khoi cay tu dien"<<endl;
cout<<"5. Dem so tu trong cay tu dien"<<endl;
cout<<"6. Tinh chieu cao cua cay tu dien"<<endl;
cout<<"7. In cay tu dien tai vi tri cua mot tu"<<endl;
cout<<"8. Thong tin ve chuong trinh"<<endl;
cout<<"9. Ket thuc chuong trinh"<<endl;
cout<<endl<<"Ban hay chon mot chuc nang, sau do bam Enter: ";
cin>>choice;
cout<<"-------------------------------------------------------------------------------"<<endl;
switch (choice)
{
case 1:
DictionaryCreate (DT);
BuildDictionary (DT);
cout<<"Qua trinh nap du lieu thanh cong!\a \a \a"<<endl;
cout<<"-------------------------------------------------------------------------------"<<endl;
break;
case 2:
char keyword[MAX_WORD];
cout<<"Ban hay nhap vao tu can tim: ";
cin>>keyword;
A=DictionarySearch (DT.pRoot, keyword);
if (A==NULL)
cout<<endl<<"Khong tim thay tu "<<keyword<<" trong tu dien!"<<endl<<"-------------------------------------------------------------------------------"<<endl;
else
cout<<endl<<A->Word<<": "<<A->Meaning<<endl<<"-------------------------------------------------------------------------------"<<endl;
break;
case 3:
char addword[MAX_WORD];
char addmeaning[MAX_MEANING];
cout<<"Ban hay nhap tu can them: ";
cin>>addword;
cout<<"Ban hay nhap nghia cua tu: ";
cin.ignore ();
cin.getline (addmeaning, MAX_MEANING);
DictionaryInsert (DT.pRoot, addword, addmeaning);
cout<<"Tu moi da duoc them!";
cout<<"-------------------------------------------------------------------------------"<<endl;
break;
case 4:
char delword[MAX_WORD];
cout<<"Ban hay nhap tu can xoa: ";
cin>>delword;
if (DictionarySearch (DT.pRoot, delword))
DictionaryDelete (DT.pRoot, delword);
cout<<"Tu da duoc xoa!";
cout<<"-------------------------------------------------------------------------------"<<endl;
break;
case 6:
{
int Height=0;
Height=HeightOfTree (DT.pRoot);
cout<<"Chieu cao cua cay tu dien la: "<<Height<<endl<<"-------------------------------------------------------------------------------"<<endl;
break;
}
}
} while (choice!=9);
getch();
}
-----------------------
Đây là nội dung trong file tudien.txt của mình. Nó chỉ tìm được từ apple thôi, còn mấy từ khác thì không tìm được.

apple (n) trai tao
blue (n) mau xanh duong
book (n) sach (v) dat cho truoc
boy (n) con trai
computer (n) may vi tinh
girl (n) con gai
go (v) di
internet (n) mang Internet
laptop (n) may vi tinh xach tay
light (n) anh sang, anh den (adj) nhe, nhe nhang, nhat
man (n) nguoi, con nguoi, dan ong
orange (n) trai cam
red (n) mau do
rose (n) hoa hong
run (v) chay
yellow (n) mau vang

tauit_dnmd
11-04-2010, 09:43 PM
Hic.Cấu trúc lưu trữ trên cây nhị phân chưa tốt lắm.Cái bài từ điển làm bằng cây nhị phân này tui cũng làm rồi ,cấu trúc lưu trữ khác mấy you tí xíu:
-Đây là file demo(bị lỗi phần nhập thêm từ mới->lí do hồi trước chạy đúng rồi ,tự nhiên ngồi sửa -->thành ra lỗi -->chán bỏ không làm nữa-->giờ đang code lại bài này-->nâng cấp giao diên DOS)
-Khi chạy lần đầu tiên nhớ nhập đường dẫn tới file Resourcefirst.dll mình đính kèm trong đó nha VD:E:\\HOCTAP\\Resourcefirst.dll