Работа с деревьями
От: Аноним  
Дата: 18.02.04 14:45
Оценка:
Пробую работать с деревьями, но что-то не получается.
Вот, есть таблица с символами и кодами (послед-ть 0 и 1).
Почему после процедуры CreateVertex root указывает по последний добавленный лист дерева.

Помогите.
typedef struct sTable{
  char alpha;
  char code[10];
};

sTable table[2];

typedef struct vertex{
  int data;
  char alpha;
  vertex *left;
  vertex *right;
};

vertex *root = NULL;

int AddCode(vertex *&p, char* s){
  for (int j=0; j<strlen(s);j++)
    switch (s[j]){
     case '0':
    {
      p=p->left;
      if (p==NULL){
        p = (vertex*)malloc(sizeof(vertex));
        p->left = NULL;
        p->right = NULL;
      }
      p->data = 0;
      p->alpha = s[j];
      break;
    }
     case '1':
    {
      p=p->right;
      if (p==NULL){
        p = (vertex*)malloc(sizeof(vertex));
        p->left = NULL;
        p->right = NULL;
      }
      p->data = 1;
      p->alpha = s[j];
    }
      }
return 0;
}

int CreateVertex(int n){
  root = (vertex*)malloc(sizeof(vertex));
  root->left = NULL;
  root->right = NULL;
  for (int i=0; i<n; i++) AddCode(root,table[i].code);
return 0;
};
Re: Работа с деревьями
От: Vamp Россия  
Дата: 18.02.04 15:49
Оценка:
А>Почему после процедуры CreateVertex root указывает по последний добавленный лист дерева.
Потому, что передается по ссылке.
Да здравствует мыло душистое и веревка пушистая.
Re: Работа с деревьями
От: LaptevVV Россия  
Дата: 18.02.04 15:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пробую работать с деревьями, но что-то не получается.

А>Вот, есть таблица с символами и кодами (послед-ть 0 и 1).
А>Почему после процедуры CreateVertex root указывает по последний добавленный лист дерева.

А>Помогите.

А>
А>typedef struct sTable{
А>  char alpha;
А>  char code[10];
А>};

А>sTable table[2];

А>typedef struct vertex{
А>  int data;
А>  char alpha;
А>  vertex *left;
А>  vertex *right;
А>};

А>vertex *root = NULL;

А>int AddCode(vertex *&p, char* s){
А>  for (int j=0; j<strlen(s);j++)
А>    switch (s[j]){
А>     case '0':
А>    {
А>      p=p->left;
А>      if (p==NULL){
А>        p = (vertex*)malloc(sizeof(vertex));
        p->>left = NULL;
        p->>right = NULL;
А>      }
      p->>data = 0;
      p->>alpha = s[j];
А>      break;
А>    }
А>     case '1':
А>    {
А>      p=p->right;
А>      if (p==NULL){
А>        p = (vertex*)malloc(sizeof(vertex));
        p->>left = NULL;
        p->>right = NULL;
А>      }
      p->>data = 1;
      p->>alpha = s[j];
А>    }
А>      }
А>return 0;
А>}

А>int CreateVertex(int n){
А>  root = (vertex*)malloc(sizeof(vertex));
  root->>left = NULL;
  root->>right = NULL;
А>  for (int i=0; i<n; i++) AddCode(root,table[i].code);
А>return 0;
А>};
А>

А что это mallocи в тексте мелькают? Перепиши на new-delete. Или жеткая потребность именно в С?
Да и в функцию оформи кусок

            p=p->left;
        if (p==NULL){
        p = (vertex*)malloc(sizeof(vertex));
        p->>left = NULL;
        p->>right = NULL;
            }
      p->>data = 0;
      p->>alpha = s[j];

Увидишь — самому проще станет разбираться.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Работа с деревьями
От: Аноним  
Дата: 18.02.04 16:00
Оценка:
Здравствуйте, Vamp, Вы писали:

А>>Почему после процедуры CreateVertex root указывает по последний добавленный лист дерева.

V>Потому, что передается по ссылке.

А как по другому?
Re[3]: Работа с деревьями
От: Vamp Россия  
Дата: 18.02.04 16:06
Оценка:
А>А как по другому?
Передавать по-значению.

int AddCode(vertex* p, char* s)
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Работа с деревьями
От: Аноним  
Дата: 18.02.04 16:09
Оценка:
Здравствуйте, Vamp, Вы писали:

А>>А как по другому?

V>Передавать по-значению.

V>
V>int AddCode(vertex* p, char* s)
V>


Пробовал, в root ничего не записывается.

Как быть?
Re[5]: Работа с деревьями
От: Vamp Россия  
Дата: 18.02.04 16:17
Оценка:
А>Пробовал, в root ничего не записывается.
Так ты определись, что тебе надо. А то тебе и записывается плохо, и не записывается нехорошо.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: Работа с деревьями
От: Аноним  
Дата: 18.02.04 16:41
Оценка:
Здравствуйте, Vamp, Вы писали:

А>>Пробовал, в root ничего не записывается.

V>Так ты определись, что тебе надо. А то тебе и записывается плохо, и не записывается нехорошо.

Дак дело в том, что при использовании ссылки root после завершения процедуры имеет адрес последнего добавленного листа, а не используя ссылку дерево вообще в root не запивается.
Re[7]: Работа с деревьями
От: Аноним  
Дата: 18.02.04 17:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Vamp, Вы писали:


А>>>Пробовал, в root ничего не записывается.

V>>Так ты определись, что тебе надо. А то тебе и записывается плохо, и не записывается нехорошо.

А>Дак дело в том, что при использовании ссылки root после завершения процедуры имеет адрес последнего добавленного листа, а не используя ссылку дерево вообще в root не запивается.



Ну дак как же?
Re: Работа с деревьями
От: mraleh Россия  
Дата: 18.02.04 18:07
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Пробую работать с деревьями, но что-то не получается.

А>Вот, есть таблица с символами и кодами (послед-ть 0 и 1).
А>Почему после процедуры CreateVertex root указывает по последний добавленный лист дерева.
Сильно не вникал, но это сразу бросается в глаза:
  case '0':
    {      p=p->>left; 
          if (p==NULL)
            {    p = (vertex*)malloc(sizeof(vertex)); 
                    p->>left = NULL;
                    p->>right = NULL;
          }
...

В выделенных строках ты постоянно записываешь адрес листа, не сохраняя при этом предыдущий адрес.
То есть при первом вызове " AddCode(root,table[i].code); " у тебя root перепишеться новым адресом, а
этот " root = (vertex*)malloc(sizeof(vertex)); " утекет
Надо что-нибудь вроде этого:
  case '0':
    {    vertex *p2 = p->left;
        if(p2==NULL)
        {    p2 = (vertex*)malloc(sizeof(vertex));
            p2->left = NULL;
            p2->right = NULL;
            p->left = p2;
      }
...
... << RSDN@Home 1.1.0 stable >>
Re[8]: Работа с деревьями
От: Vamp Россия  
Дата: 19.02.04 07:33
Оценка:
А>>Дак дело в том, что при использовании ссылки root после завершения процедуры имеет адрес последнего добавленного листа, а не используя ссылку дерево вообще в root не запивается.
Да у тебя вообще никакого дерева не будет. У тебя будет список с таким алгоритмом. Ты опиши, чего надо то.
Кстати, твой свитч лучше перепиать так:

if (s[j]=='0')
   p=p->left;
else if (s[j]=='1') 
   p=p->right;
else 
   return;
if (p==NULL){
p = (vertex*)malloc(sizeof(vertex));
p->left = NULL;
p->right = NULL;
p->data = '0'-s[j]; //kindo not portable
p->alpha = s[j];
Да здравствует мыло душистое и веревка пушистая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.