我有两个链接列表,我使用inputFront,inputRear,outputFront& outputRear。当我将数据从输入排入输出时,我的问题出现了。 Printf仅打印输入中的第一项。例如:我的输入是" a b c",它只会返回" a"。我很感激帮助。感谢。
struct linked_list{
char *operand;
struct linked_list *next;
};
void enqueue(struct linked_list** queueFront, struct linked_list** queueRear,
char* token);
char* dequeue(struct linked_list** queueFront, struct linked_list** queueRear);
int main(int argc, char *argv[]){
struct linked_list *inputFront = NULL, *inputRear = NULL;
struct linked_list *outputFront = NULL, *outputRear = NULL;
for (int i = 1; i < argc; i++)
enqueue(&inputFront, &inputRear, argv[i]);
for (struct linked_list *p = inputFront; p != NULL; p = p->next)
enqueue(&outputFront, &outputRear, dequeue(&inputFront, &inputRear));
for (struct linked_list *p = outputFront; p != NULL; p = p->next)
printf("%s \n", dequeue(&outputFront, &outputRear));
}
void enqueue(struct linked_list** queueFront, struct linked_list** queueRear,
char* token){
struct linked_list* newNode = (struct linked_list*) malloc(
sizeof(struct linked_list));
newNode->operand = token;
newNode->next = NULL;
if (*queueRear == NULL && *queueFront == NULL){
*queueFront = *queueRear = newNode;
return;
}
(*queueRear)->next = newNode;
*queueRear = newNode;
}
char* dequeue(struct linked_list** queueFront, struct linked_list** queueRear){
if (*queueFront != NULL){
struct linked_list *remv = *queueFront;
char *remOperand = (*queueFront)->operand;
*queueFront = remv->next;
if (remv == (*queueRear))
*queueRear = NULL;
free(remv);
return remOperand;
}
else
return NULL;
}
答案 0 :(得分:0)
问题似乎出现在你的打印循环中。您让p
前进到列表的末尾,然后让dequeue
检索列表中的下一个(第一个)项。但是,出列也会从列表中删除前面的。在返回之后,for循环现在也提前p
,其next
成员已经提升了jus。给定输入a b c,我希望输出现在是c。如果您使用调试器,则可以获得更多线索。
答案 1 :(得分:0)
您的代码有2个问题。见。
for (struct linked_list *p = inputFront; p != NULL; p = p->next)
enqueue(&outputFront, &outputRear, dequeue(&inputFront, &inputRear));
您正在使用指针p
来运行列表,但此指针未在循环内使用。必须用此指针inputFront
替换语句中的p
。这将允许它遍历循环的每个元素。
在dequeue
函数中,您正在移动指针inputFront
(现在为p
)。因此,如果你在循环中执行p = p-> next
,它将完成两次。这必须删除。
固定代码
for (struct linked_list *p = inputFront; p != NULL; )
enqueue(&outputFront, &outputRear, dequeue(&p, &inputRear));
for (struct linked_list *p = outputFront; p != NULL; )
printf("%s \n", dequeue(&p, &outputRear));