Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пожалуйста помогите с деревом 
:(
    Опции темы
tor1988
Дата 17.8.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 17.8.2006

Репутация: нет
Всего: нет



Помогите написать ДБ- дерево(нужное описание есть в к ниге Никлауса Вирта "Алгоритмы и структуры данных" стр 307) на си++,ПОЖАЛУЙСТА.Помогите испрамить ошибку в  моем коде или если не сложно выложите свой:
Пишите  на [email protected]

Заранее благодарен.


Код

#include <stdio.h>    
#include <iostream.h>    
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <cstdio>    

#define NULL 0

struct DB{
int v;
int h;
DB *l;
DB *r;
};
DB *pt,*root,*tree,*fuck,*derevo,*t;
int help=0,right=0,tab=0,perestanovka=0;



void print(DB *root,int tab)
{
    int t=0;
printf("-> %d\n",root->v);    
            
if (root->r!=NULL) {
    for(t=0;t<=tab;t++){printf("  ");}
    if(root->r->h==1) printf("hR");        //h-zna4it goRizonTal'na9 ssiLka
    if(root->r->h==0) printf("vR");        //v-verTikal'na9
    print(root->r,tab+1);
    }
if (root->l!=NULL) {
    for(t=0;t<=tab;t++){printf("  ");}
    printf("L");
    print(root->l,tab+1);
    }

}


void addroot(DB *root, int v){root->v=v;root->l=NULL;root->r=NULL;root->h=0;}        //sozdaem koren'

DB* add(DB *root, int v) {


    if (root->l==NULL&&root->r==NULL&&v<root->v){                  //v -smotri NikLays ViRt str.307(ALGORITMbl i STRYKTYRbl DAHHblX)
        root->r=(DB *)malloc((size_t)sizeof(DB));
        help=root->v;
        root->r->v=v;
        root->v=root->r->v;
        root->r->v=help;
        root->r->r=NULL;
        root->r->l=NULL;
        
    root->h=0;
    root->r->h=1;
        right=root->r->v;
    }
    if(root->r==NULL&&root->l==NULL&&v>root->v){                    //a
        root->r=(DB *)malloc((size_t)sizeof(DB));
        root->r->v=v;
        root->r->r=NULL;
        root->r->l=NULL;
        
        root->h=0;
    root->r->h=1;
         right=root->r->v;
        
    }

    if(root->r!=NULL&&root->l==NULL&&v>root->r->v) {                //b
        root->l=(DB *)malloc((size_t)sizeof(DB)); 
        help=root->v;
        root->v=right;
        root->l->v=help;
        root->r->v=v;

    root->l->l=NULL;
    root->l->r=NULL;
    root->r->l=NULL;
    root->r->r=NULL;
    
        root->h=1;
    root->r->h=0;
    root->l->h=0;
    }
    if(root->r!=NULL&&root->l==NULL&&v<root->v){                    //g     
        root->l=(DB *)malloc((size_t)sizeof(DB)); 
        root->l->v=v;
        root->r->v=right;
    

    root->l->l=NULL;
    root->l->r=NULL;
    root->r->l=NULL;
    root->r->r=NULL;
    
    root->h=1;
    root->l->h=0;
    root->r->h=0;
    }
    if(root->l==NULL&&v>root->v&&root->r!=NULL&&v<root->r->v){      // spoRnii' sly4ai'(navernoe vhodit v "b"ili"g") 
        root->l=(DB *)malloc((size_t)sizeof(DB)); 
        help=root->v;
        root->l->v=help;
        root->v=v;
        root->r->v=right;
    

    root->l->l=NULL;
    root->l->r=NULL;
    root->r->l=NULL;
    root->r->r=NULL;
    
    root->h=1;
    root->l->h=0;
    root->r->h=0;
    }

    if(root->r!=NULL&&root->l!=NULL&&root->v<v){                  //derevo yveli4ivaets9(Rastet)                   
        
        add(root->r, v);
    }
    if(root->l!=NULL&& root->r!=NULL&&root->v>v)                        
        add(root->l, v);
return root;
};

DB* rebild(DB *derevo,int v) {                                    //fynkci9 peresTroeni9 dereva


if(derevo->l!=NULL&&derevo->r!=NULL&&derevo->r->r!=NULL){

    if(derevo->l->h==1&&derevo->r->h!=1||derevo->r->h==1&&derevo->r->r->h==1||derevo->r->h==1&&derevo->l->h==1){
    
        perestanovka=1;                                            // proizoi'det perestanovka
        
        if (derevo->l->h==1&&derevo->r->h!=1){                    //v 
            
            fuck=derevo;
            tree=derevo->l->r;
            derevo=derevo->l;
            derevo->r=fuck;
            derevo->r->l=tree;
            
            derevo->r->h=1;
            derevo->h=0;
            
        }

    

        if(derevo->r->h==1&&derevo->r->r->h==1) {                //b
        
            fuck=derevo;    
            tree=derevo->r->l;
            derevo=derevo->r;
            derevo->l=fuck;
            derevo->l->r=tree;
    
            derevo->r->h=0;                                                                                                    
            derevo->l->h=0;
            derevo->h=1;
    
        }
        if(derevo->r->h==1&&derevo->l->h==1){                    //g     
 
            derevo->h=1;
            derevo->r->h=0;
        }
    }
    if(perestanovka==0){ if(v>derevo->v){                        //perestanovki ne BblLo =>prover9eM daL'she
        rebild(derevo->r,v);}                        //!!!!voznikaet problema s vozvrawaeMblM zna4enieM!!!!!
                            if(v<derevo->v){    
        rebild(derevo->l,v);}}
    
}
else return root;    
root=derevo;
v=0;
return root;
};


void main(){
int i,f=0;

root=(DB *)malloc((size_t)sizeof(DB));
printf("Vvedite element ili 0 for exit:\n");
cin>>i;
addroot(root,i);
print(root,0);
printf("\n");
  cin>>i;

  while(i!=0){

    add(root, i);
    if(f>=3){rebild(root,i);}
    print(root,0);
f=f++;
perestanovka=0;
    cin>>i;
}
if(i==0)exit(0);
}


Модератор: нужно пользоваться тегами code! 

Это сообщение отредактировал(а) Earnest - 17.8.2006, 16:57
PM MAIL   Вверх
Earnest
Дата 17.8.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 2
Всего: 183



Для домашних заданий, курсовых, существует "Центр Помощи"

Тема перенесена! 


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.