Как я могу разделить этот связанный список Int таким образом - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть связанный список l и число x . Эта функция должна идти в список l и когда значение узла списка ниже, чем x , поместите это значение в список mx , в противном случае поместите значение в список Mx .


typedef struct lligada {
    int value;
    struct lligada *next;
} *LInt;


void splitQS (LInt l, int x, LInt *mx, LInt *Mx){
    LInt *aux1,*aux2;
    aux1=mx;
    aux2=Mx;
    while(l){
        if(x<l->value){
            (*aux1)=(LInt)malloc(sizeof(struct lligada));
            (*aux1)->value=l->value;
            aux1=&((*aux1)->next);
        }
         if(x>=l->valor){
            (*aux2)=(LInt)malloc(sizeof(struct lligada));
            (*aux2)->value=l->value;
            aux2=&((*aux2)->next);
        }
        l=l->next;
    }
}

Я проверил с этим выводом:

x= 2

Список l = [1,3] ;

и ожидаемый результат равен mx = [1] и Mx = [3]

Хотя, я получил это

mx = [3] и Mx = [1]

Я не могу понять, почему это происходит.

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Ваше условие внутри оператора if неверно, оно должно быть:

    if(x>l->value){
        (*aux1)=(LInt)malloc(sizeof(struct lligada));
        (*aux1)->value=l->value;
        aux1=&((*aux1)->next);
    }

Кроме того, вам не нужно писать второе, если вы можете использовать else вместо.

void splitQS (LInt l, int x, LInt *mx, LInt *Mx){
    LInt *aux1,*aux2;
    aux1=mx;
    aux2=Mx;
    while(l){
        if(x>l->value){
            (*aux1)=(LInt)malloc(sizeof(struct lligada));
            (*aux1)->value=l->value;
            aux1=&((*aux1)->next);
        }
        else{
            (*aux2)=(LInt)malloc(sizeof(struct lligada));
            (*aux2)->value=l->value;
            aux2=&((*aux2)->next);
        }
        l=l->next;
    }
}
1 голос
/ 26 апреля 2019

Это именно то, что вы запрограммировали. В случае if(x<l->value), что означает, что значение списка больше x, тогда вы устанавливаете его на aux1, что составляет mx. Следовательно, большие значения заканчиваются mx, а меньшие - Mx.

Чтобы упростить такие ошибки, я рекомендую использовать более длинные и выразительные имена, например, smallerValues и biggerValues вместо mx и Mx. Кроме того, я не вижу смысла, почему вы копируете указатели mx и Mx в aux1 и aux2. Вы можете просто использовать mx и Mx напрямую.

Кроме того, я думаю, ваш код не компилируется. Вы используете if(x>=l->valor), но LInt не имеет члена valor;)

Кроме того, это, вероятно, не будет выполняться для более чем одного элемента в каждом списке вывода. Вы устанавливаете aux1=&((*aux1)->next); без инициализации next. Следовательно, после этой инструкции aux1 просто указывает «куда-то».

Редактировать : Действительно, меня смутил указатель на определение типа, когда @David C. Rankin сказал:)

Вот переработанная, но полностью не проверенная версия:

typedef struct {
  int value;
  ListItem* next;
} ListItem;

void splitList(ListItem *inputList, int threshold, ListItem **smallerItems, ListItem **biggerItems) {
  while(inputList) {
    if(inputList->value < threshold) {
      *smallerItems = (ListItem*)malloc(sizeof(ListItem));
      (*smallerItems)->value = value;
      smallerItems = &((*smallerItems)->next);
    }
    else {
      *biggerItems = (ListItem*)malloc(sizeof(ListItem));
      (*biggerItems)->value = value;
      biggerItems = &((*biggerItems)->next);
    }
    inputList = inputList->next;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...