Бинарное Дерево

Статус
Закрыто для дальнейших ответов.

newslayer

New member
30.05.2012
3
0
#1
Задание было такое:
Написать программу, которая содержит информацию про заявки на авиабилеты
Каждая заявка содержит:
-пункт назначения
-номер рейса
-имя пассажира
-время отправления
Программа должна:
1. Хранить все заявки в виде двоичного дерева
2. По заданному номеру рейса находить заявку, с последующим ее удалением
3. Удалять все заявки


Разбираюсь не очень, но программу написал.
Подскажите, пожалуйста,, в чем проблемма:
После добавления узла(функция search_insert), все поля предыдущих узлов(кроме номера рейса), заменяються на только что введенный.
То есть в итоге все узлы правильно располагаються, но все их поля (пункт, имя, время) равны последним введенным.
Получаеться проблема в передаче char *str в функцию..?
Этого всего можно избежать, если вводить str1="London", в самой программе (не понимаю в чем разница). Но нужно вводить с клавиатуры..
Заранее благодарен

Код:
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
int x,y;
char punkt[10][15],imya[10][15],data[10][15];
char str1[15], str2[15], str3[15];
int d[10];

struct Node
{
int  d;
char *punkt;
char *imya;
char *data;
Node *left;
Node *right;
};

Node *root;


int Menu();
Node *first(int d,char *,char *,char *);
Node *search_insert(Node *root,int d,char *,char *,char *);
Node *del(Node *root,int d);
void print_tree(Node *root, int i);

int main()
{
clrscr();

int c,n;

x=30;
y=1;
int k=0;
Node *root=0;

while(c!=EOF)
{
c= Menu();

switch(c)
{
case 1 : {


printf(" reis  ");
cin>>d[0];

printf(" punkt ");
cin>>str1;


printf(" imya  ");
cin>>str2;

printf(" data  ");
cin>>str3;



root=first(d[0],str1,str2,str3);

break;





}
case 2 : {
x=30;
y=1;



printf(" reis  ");
cin>>d[0];

printf(" punkt ");
cin>>str1;




printf(" imya  ");
cin>>str2;





printf(" data  ");
cin>>str3;



search_insert(root,d[0],str1,str2,str3);


break;

}

case 3 : {
printf("Vvedite nomer iskomogo reisa\n");

cin>>d[0];

Node *Del=del(root,d[0]);
printf("----- %d\n",Del->d);
printf("----- %s\n",Del->punkt);
printf("----- %s\n",Del->imya);
printf("----- %s\n",Del->data);


break;
}

case 4 : {
clrscr();
x=30;
y=1;

print_tree(root,0);
getche();
break;
}
case 5 : root=0; break;
case 0 : exit(0);
}

}



getche();
return 0;
}

Node *first(int d,char *punkt,char *imya,char *data)
{
Node *pv=new Node;
pv->punkt=punkt;
pv->imya=imya;
pv->data=data;
pv->d=d;

pv->left=0;
pv->right=0;
return pv;
}

Node *search_insert(Node *root, int d,char *punkt,char *imya,char *data)
{


Node *pv=root, *prev;
int found=0;
int k=0;
while(pv && !found)
{
k+=1;
prev=pv;
if(d==pv->d)
found=1;
else
if(d<pv->d)
pv=pv->left;
else pv=pv->right;
}
if(found)
return pv;


Node *pnew=new Node;
pnew->d=d;
pnew->punkt=punkt;
pnew->imya=imya;
pnew->data=data;
pnew->left=0;
pnew->right=0;

if(d<prev->d)
prev->left=pnew;
else
prev->right=pnew;
return pnew;
}


Node *del(Node *root, int d)
{
Node *pv=root, *prev;
int found=0;
while(pv && !found)
{
prev=pv;
if( (d==(pv->left)->d) || (d==(pv->right)->d) )
found=1;

if(d<pv->d)
pv=pv->left;
else
pv=pv->right;
}
if(!found)
{
printf("Ne naiden!\n");
return 0;
}

if(!(pv->left) && !(pv->right) )
{
if(d<prev->d)

prev->left=0;


else

prev->right=0;

return pv;

}
else

if( !(pv->left) && (pv->right) )
{
if(d<prev->d)
prev->left =pv->right;
else
prev->right=pv->right;
}
else

if ( (pv->left) && !(pv->right) )

{
if(d<prev->d)
prev->left =pv->left;
else
prev->right=pv->left;

}

else

if ( (pv->left) && (pv->right) )
{
Node *temp1=pv->left;
Node *temp2=pv->left;


while (temp2->right)
{temp1=temp2;
temp2=temp2->right;

}

temp1->right=0;


if(d>prev->d)
{
if(temp1!=temp2)
temp2->left=(prev->right)->left;
else
temp2->left=0;
temp2->right=(prev->right)->right;
prev->right=temp2;

}

else

{
if(temp1!=temp2)
temp2->left=(prev->left)->left;
else
temp2->left=0;
temp2->right=(prev->left)->right;
prev->left=temp2;

}


}



return pv;



}


void print_tree(Node *p, int level)
{
if(p)
{
print_tree(p->left,level+1);

y=y+level;
gotoxy(x,y);

cout<<p->d<<endl;

x=x+5;
y=1;

print_tree(p->right,level+1);
}
}



int Menu()
{
char a[10];
int c;
cout<<"ЪДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДї"<<endl;
cout<<"і Press: і To:				і"<<endl;
cout<<"ГДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДґ"<<endl;
cout<<"і	1	 і Create			 і"<<endl;
cout<<"і	2	 і Add				і"<<endl;
cout<<"і	3	 і Searh			 і"<<endl;
cout<<"і	4	 і List			  і"<<endl;
cout<<"і	5	 і Delete all		 і"<<endl;
cout<<"і	0	 і Exit			  і"<<endl;
cout<<"АДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДЩ"<<endl;
do{
gets(a);
c=atoi(a);
} while(c>5 || c<0);
return c;
}
 
Статус
Закрыто для дальнейших ответов.