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

дерево - C++

Восстановить пароль Регистрация
 
Shedrinr
0 / 0 / 0
Регистрация: 25.02.2011
Сообщений: 14
30.08.2011, 16:20     дерево #1
Сделал дерево, если его ветви создаются на стадии компиляции, то все работает нормально, но если их создает пользователь, то все ветви созданные пользователем принимают название последней созданной ветви.
Где бага?

сделал "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++ Дерево
C++ Дерево
C++ Дерево
C++ Дерево, бинарное дерево
C++ Дерево
N-дерево C++
C++ Дерево дерево, странное дерево

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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     дерево
Ответ Создать тему
Опции темы

Текущее время: 21:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru