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

Тема в разделе "C/C++/C#", создана пользователем newslayer, 30 май 2012.

Статус темы:
Закрыта.
  1. newslayer

    newslayer New Member

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


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

    Код (Text):
    #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;
    }
     
Загрузка...
Похожие Темы - Бинарное Дерево
  1. Maestresa
    Ответов:
    2
    Просмотров:
    1.667
  2. European
    Ответов:
    0
    Просмотров:
    2.069
  3. Hanja
    Ответов:
    0
    Просмотров:
    1.034
  4. MrSpoon
    Ответов:
    0
    Просмотров:
    1.055
  5. KalinaK
    Ответов:
    1
    Просмотров:
    1.689
Статус темы:
Закрыта.

Поделиться этой страницей