我有一个链接列表 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]
我不知道为什么会这样。
答案 0 :(得分:1)
这就是您编写的内容。
在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指针弄糊涂了:)
这是经过重构但完全未经测试的版本:
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;
}
}