Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

дерево - C++

30.08.2011, 16:20. Просмотров 600. Ответов 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);
 
    
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2011, 16:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос дерево (C++):

Бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой - C++
Дано бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой.

Дано дерево. Распечатать дерево по уровням - C++
Дано дерево. Распечатать дерево по уровням.

Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру - C++
Помогите, не могу понять!( Нужно исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру. вот...

Напишите программу, которая бы читала дерево в формате (а) и затем печатала бы это дерево в формате (б). - C++
Представление дерева: а) Д (Б (А, Ф (В,)), Е (,З (Ж, И))) б) Д Б А Ф ...

Дерево дерево, странное дерево - C++
Нужна помощь в построении дерева. Задание таково: Вершина дерева содержит N целых значений и два указателя на потомков. Запись значений...

Дерево, бинарное дерево - C++
Читаю про дерево и не до конца понимаю, а точнее понимаю, но вопрос в том, правильно ли я понимаю, надеюсь вы мне подскажите. Вот есть...

2
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.08.2011, 17:31 #2
Shedrinr, Потому что ты работаешь с указателями. Копировать через strcpy надо.
1
Shedrinr
0 / 0 / 0
Регистрация: 25.02.2011
Сообщений: 14
30.08.2011, 22:50  [ТС] #3
Ура! заработало. Спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2011, 22:50
Привет! Вот еще темы с ответами:

Дерево - C++
Здравствуйте!Никак не могу разобраться с двумя заданиями. http://prntscr.com/9924ty - задание 1 http://prntscr.com/9924ys и вот к...

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

дерево - C++
// derevo_lr2.cpp : Defines the entry point for the console application. #include &quot;stdafx.h&quot; #include &quot;iostream&quot; using namespace std;...

Дерево - C++
Нужно НЕ рекурсивно распечатать двоичное дерево по слоям, собственно как это сделать?


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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