alex000sp
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Да есть одна проблемка но я думаю там проблема не в самом дереве а в указателе на элемент. Самое интересное если переменная "d" описываеться так struct Node{char d;Node*left;Node*right;}; int b[]={1,2,3,4,5,6,7,8};//это уже готовый массив чтобы не вводить в ручную или так struct Node{char d[];Node*left;Node*right;}; то всё замечательно работает но стоит char d[] заменить на char*d(именно так нужно сделать в задании) тоесть должно быть так: struct Node{char*d;Node*left;Node*right;}; и вся программа перестаёт работать, а менно когда создаёться новая структура(в двух первых случаях) переменная d получает новый адрес и записывает новое значение в переменную. В третьем случае программа сначала создаёт первый элемент дерева(вершину), потом создаёт первую ветку, (2 значение d) пока всё нормально далее читаем 3 значение из файла, и здесь начинаеться парадокс значения вроде должны быть разными но почему то адреса памяти 2 и 3 элемента совпадают в результате программа переписывает значение 2 на значение 3 и говорит что такой же элемент уже есть в дереве(хотя в файле не одного повторяющегося элемента нет)после чего программа выплёвывает всё на экран и завершает свою работу так и не дочитав фаил до конца Исходник-> struct Node{char*d;Node*left;Node*right;}; //вот этот массив программа читает из файла {'4','7','3','5','1','6','2','8'}; char*b; Node*first(); Node*search_insort(Node*root); void print_tree(Node*root,int l);//l-слой void excuse_tree(Node*); void main() {int i=0;b="0"; Node*root=first(); search_insort(root); print_tree(root,0); getch(); excuse_tree(root); getch(); } Node*first() { ifstream inClientFile("n.txt",ios::in); if(!inClientFile){cerr<<"” Ё« -Ґ ¬®¦Ґв Ўлвм ®вЄалв ¤«п звҐ-Ёп"<<endl;//Фаил не может быть открыт для чтения getch();exit(1);} Node*pv=new Node; inClientFile>>pv->d; pv->left=0; pv->right=0; return pv; } Node*search_insort(Node*root) {char d[10]; ifstream inClientFile("n.txt",ios::in); if(!inClientFile){cerr<<"” Ё« -Ґ ¬®¦Ґв Ўлвм ®вЄалв ¤«п звҐ-Ёп"<<endl;//Фаил не может быть открыт для чтения getch();exit(1);} inClientFile>>d; Node*pv=root,*prew; do{ pv=root; inClientFile>>d; int found=0; while(pv&&!found) { prew=pv; cout<<"pv->d="<<pv->d<<" d="<<d; if(d[0]==pv->d[0])found=1; else if(d[0]<pv->d[0]){pv=pv->left;cout<<" pv=pv->left\n";} else {pv=pv->right;cout<<" pv->right\n";} } if(found==1)return pv; Node*pnew=new Node; *pnew->d=*d; pnew->left=0; pnew->right=0; if(d[0]<prew->d[0])prew->left=pnew; else prew->right=pnew; if(inClientFile.eof())return pnew; }while(!inClientFile.eof()); cout<<"\nChtenie iz faila zaversheno\n"; } Заранее спасибо. |