Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Shedrinr
0 / 0 / 0
Регистрация: 25.02.2011
Сообщений: 14
#1

дерево - C++

30.08.2011, 16:20. Просмотров 556. Ответов 2
Метки нет (Все метки)

Сделал дерево, если его ветви создаются на стадии компиляции, то все работает нормально, но если их создает пользователь, то все ветви созданные пользователем принимают название последней созданной ветви.
Где бага?

сделал "ui": wasd - выбор ветви, n - добавить

tree.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include<stdio.h>
#include<windows.h>
#include"myvector.cpp"
 
#ifndef _TREE_
#define _TREE_
 
 
class ITEM{
public:
    int parent,childs_total,id;
    MyVectorInt child_ids;
    int* values;
    char* name;
    char* iname;
    char string_value[500];
    char type[10];
    ITEM(){
        int i;
        parent=0;
        childs_total=0;
        id=0;
        for(i=0;i<50;i++)child_ids[i]=0;
    }
};
 
class TREE{
public:
    int current,total,curCh; 
    ITEM item[1000];
    TREE(){
        curCh=0;
        current=0;
        total=1;
        item[0].name="Root";
        item[0].childs_total=0;
        item[0].id=0;
    }
    int add(char* name1,int* value1,char* name2="|same|"){
        item[total].id=total;
        item[total].name=name1;
        
        item[total].iname=name2;
        if(name2=="|same|")item[total].iname=name1;
        item[total].values=value1;
        item[total].parent=current;
        item[current].child_ids[item[current].childs_total]=total;
        item[current].childs_total++;
        total++;
        return total-1;
    }
    void up(){
        if(current)
        current=item[current].parent;
    }
    void down(int child_to){
        if(item[current].childs_total){
            if(child_to<0)child_to=item[current].childs_total-child_to;
            child_to=child_to%item[current].childs_total;
            if(child_to<item[current].childs_total)
            current=item[current].child_ids[child_to];
        }
    }
    int down(char* name){
        int i=0;
        for(i=0;i<item[current].childs_total;i++){
            if(item[item[current].child_ids[i]].iname==name){
                current=item[current].child_ids[i];
                return item[current].child_ids[i];
            }
        }
    }
    void right(){
        up();
        curCh++;
        down(curCh);
    }
    void left(){
        up();
        curCh--;
        down(curCh);
    }
    void select(int id){
        current=id;
    }
    void show(int from=0,int deep=0){
        int cur,i;
        cur=from;
        for(i=0;i<deep-1;i++)
                printf("     ");
        if(deep)printf("АДДД");
        if(cur==current)printf("<-");
        printf("%s[%d]",item[cur].name,cur);
        if(cur==current)printf("->");
        printf("\n");
        if(item[cur].childs_total){
            for(i=0;i<item[cur].childs_total;i++){
                show(item[cur].child_ids[i],deep+1);
            }
        }
        
    }
 
    void rename(char* newName){
        item[current].name=newName;
    }
 
    void reiname(char* newName){
        item[current].iname=newName;
    }
};
 
#endif
myvector.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include<stdio.h>
#include<new>
 
#ifndef _MyVec_
#define _MyVec_
 
 
typedef int DT;
class MyVectorInt{
public:
    DT* mass;
    int memEl,memBy,grow;
 
    MyVectorInt( int grow = 5 ) : grow( grow )
    {
        try{
        mass=new DT[grow];
        }catch(std::bad_alloc){
        printf("Can not create vector");
        }
        memEl=0;
        memBy=0;
    }
 
    ~MyVectorInt(){
        delete[] mass;
    }
 
    void resize(int size){
        int* mass2;
        int i=0,cpysize;
        if(size<memEl)cpysize=size;
        else cpysize=memEl;
        try{
            mass2=new DT[size];
            memcpy(mass2,mass,cpysize*sizeof(DT));
            delete[] mass;
            mass=mass2;
            memEl=size;
            
        }catch(std::bad_alloc){
        printf("Can not resize");
        }
    }
 
    DT& operator[](int i){
        if(i<memEl)return mass[i];
        else {
            resize(i+grow);
            return mass[i];
        }
        
    }
};
class ITEM;
typedef ITEM DT2;
class MyVectorItem{
public:
    DT* mass;
    int memEl,memBy,grow;
 
    MyVectorItem( int grow = 5 ) : grow( grow )
    {
        try{
        mass=new DT[grow];
        }catch(std::bad_alloc){
        printf("Can not create vector");
        }
        memEl=0;
        memBy=0;
    }
 
    ~MyVectorItem(){
        delete[] mass;
    }
 
    void resize(int size){
        int* mass2;
        int i=0,cpysize;
        if(size<memEl)cpysize=size;
        else cpysize=memEl;
        try{
            mass2=new DT[size];
            memcpy(mass2,mass,cpysize*sizeof(DT));
            delete[] mass;
            mass=mass2;
            memEl=size;
            
        }catch(std::bad_alloc){
        printf("Can not resize");
        }
    }
 
    DT& operator[](int i){
        if(i<memEl)return mass[i];
        else {
            resize(i+grow);
            return mass[i];
        }
        
    }
};
 
#endif
ui.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<stdio.h>
#include <conio.h>
#include<windows.h>
#include"tree.cpp"
#include <string.h>
 
 
 
 
 
 
 
void main(){
    printf("1");
    TREE tree;
    int i,curCh=0;
    int version=10;
    char io='0';
    char name[50];
 
    tree.select(tree.add("Me",0));
    tree.add("Mum",0);
    tree.select(tree.add("Dad",0));
    tree.add("grandmum(d)",0);
    tree.add("grandpa(d)",0);
    tree.up();
    tree.down("Mum");
    tree.add("grandmum(M)",0);
    tree.add("grandpa(M)",0);
 
    do{
        switch(io){
            case 'a':tree.up();break;
            case 'd':tree.down(curCh);break;
            case 'w':{
                        tree.right();
                        }break;
            case 's':{
                        tree.left();
                        }break;
            case 'n':{
                        printf("Name?\n");
                        scanf("%s",name);
                        tree.add(name,0);
                        }break;
        }
    system("cls");
    tree.show(0);
    io=getch();
    }while(io!=27);
 
    
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2011, 16:20     дерево
Посмотрите здесь:

Дерево - C++
Условие: Программа построения дерева, где узел(корень) - ФИО препода, а инф. поля (наверное левая\правая ветки) имеют записи:...

Дерево - C++
Добрый вечер)))) Вот сегодне &quot;изучали &quot;деревья&quot;)) Дали задание: &quot;Написать программу копирования вершин, связанных с правым...

АВЛ-дерево - C++
Из входной последовательности символов построить АВЛ-дерево без повторов. Найти в нем узел, относительно которого будет максимальная...

Сбалансированное дерево - C++
Ребят, может есть у кого код сбалансированного дерева с подробными комментариями, чтобы разобраться? выложите пож-та. спасайте..

Двоичное дерево - C++
Помогите пожалуйста построить двоичное дерево и найти в нём длину пути(количество ветвей от корня) до минимального элемента

Двоичное дерево - C++
Помогите найти ошибку, в консоль вообще ничего не выводится: #include&lt;iostream&gt; #include&lt;string&gt; #include&lt;fstream&gt; using...

Биномиальное дерево - C++
Есть код,которые реализует пирамидальное дерево- это двоичное дерево размером 2^N, в котором для каждого узла выполняется правило: Все...

Декартово дерево - C++
Уже долго мучаюсь над декартовым деревом. После очередной попытки создал вот такую структуру: struct treap{ int x, y,num;...

Алгебру в дерево - C++
Надо сделать программу, которая переводит алгебраическое выражение в виде строки в дерево. Подскажите пожалуйста, как это сделать? Может...

Получи дерево - C++
Задача такая: Дан связный неориентированный граф без петель и кратных ребер. Разрешается удалять из него ребра. Требуется получить дерево....

Показать дерево - C++
Нужно показать дерево, записанное вот в такую вот структуру данных: tree { tree *left,*right; int value; }; Дерево...

дерево процессов - C++
помогите написать дерево процессов, а то у меня более 2 потомков у родителя не получается.. надо 3, или лучше чтобы 1 родитель - потомок -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
30.08.2011, 17:31     дерево #2
Shedrinr, Потому что ты работаешь с указателями. Копировать через strcpy надо.
Shedrinr
0 / 0 / 0
Регистрация: 25.02.2011
Сообщений: 14
30.08.2011, 22:50  [ТС]     дерево #3
Ура! заработало. Спасибо.
Yandex
Объявления
30.08.2011, 22:50     дерево
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru