我如何以这种方式拆分此链接列表int

时间:2019-04-25 20:52:48

标签: c

我有一个链接列表 l 和一个数字 x 。该功能应该转到列表 l ,并且当列表节点的值较低时, x 将该值放入列表< strong> 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 个答案:

答案 0 :(得分:1)

这就是您编写的内容。 在if(x<l->value)的情况下,这意味着列表的值大于x,然后将其放入aux1,即mx。因此,大值以mx结尾,小值以Mx结尾。

为了更容易发现此类错误,我建议使用更长和更具表达力的名称,例如smallerValuesbiggerValues,而不是mxMx。另外,我看不到为什么要将指针mxMx复制到aux1aux2。您可以直接使用mxMx

此外,我猜您的代码无法编译。您使用if(x>=l->valor),但是LInt没有成员valor;)

此外,每个输出列表运行的元素数可能不会超过一个。您设置aux1=&((*aux1)->next);时未初始化next。因此,在执行该指令后,aux1仅指向“某处”。

编辑:的确,我被@David C. Rankin所说的typedef指针弄糊涂了:)

这是经过重构但完全未经测试的版本:

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;
  }
}

答案 1 :(得分:1)

您在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;
    }
}