Связанный список ... не меняется - PullRequest
0 голосов
/ 02 апреля 2011

Это очень простая функция для построения бинарного дерева.

Я использую Build_tree(first_TR, A); И это печатает "добавлено первым, добавлено первым, добавлено первым, добавлено первым, добавлено первым, добавлено первым, добавлено первым, добавлено первым, добавлено первым, добавлено первым, ".

Это значит first_TR == 0. Зачем? Я тоже пробовал Build_tree(&first_TR, A); Не работает: (

typedef struct SElementBST {
    struct SElementBST  *left, *right; /* wskaźnik na kolejny element listy */
    unsigned slowo[DlugoscSlow+1]; /* przechowywana wartość */
}   TBST;

TBST *first_TR = 0; 

void Build_tree(TBST *first, unsigned char array[IloscSlow][DlugoscSlow+1])
{

    int i,k,m;
    TBST *tmp, *parent;

    for(i=0;i<IloscSlow;i++)
    {

        if(!first_TR)   
        {
            first = (TBST*) malloc(sizeof(TBST));
            first -> left = 0;
            first -> right = 0;
            printf("added as first, ");
            for(k=0;k<DlugoscSlow+1;k++)
                    first -> slowo[k] = array[i][k];
        } 
        else
        {
            tmp = first;

            while(tmp != 0)
            {
                k = 0;
                parent = tmp;

                while ((tmp->slowo[k] == array[i][k]) && (k<DlugoscSlow-1))
                               k++;

                if(tmp->slowo[k] < array[i][k]) tmp = tmp -> right;
                else tmp = tmp -> left;

            }

            tmp = (TBST*) malloc(sizeof(TBST));
            tmp -> left = 0;
            tmp -> right = 0;

            for(m=0;m<DlugoscSlow+1;m++)
                tmp-> slowo[m] = array[i][m];

            if(parent->slowo[k] < array[i][k]) parent -> right = tmp;
            else parent -> left = tmp;
        }
    }
}

1 Ответ

3 голосов
/ 02 апреля 2011

Если у вас есть это:

void something(type *p) {
  p = somethingelse;
}

int main() {
  type *a = ...;
  something(a);
}

Назначение в функции something не изменит значение a в вызывающем абоненте (main здесь).Указатель передается значением , что означает, что копия значения указателя передана функции something.

Если вы хотите изменить то, на что указывает a ввызывающая сторона, вам нужно передать указатель на указатель.

void something(type **p) {
 *p = somethingelse;
}

int main() {
 type *a;
 something(&a);
}

Вы не меняете first_TR где-либо в этом коде.Таким образом, он все время сохраняет нулевое значение.

Либо вам не нужен first_TR, и ваш код должен выглядеть примерно так:

if(!first)  
{
 first = malloc(sizeof(TBST));
 ...
}

Или вам это нужно, и вы можете сделать

if(!first_TR)  
{
 first = malloc(sizeof(TBST));
 ...
 first_TR = first;
}

(Вам не нужно приводить результат malloc в C.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...