在C中同时入队/出列两个链表

时间:2016-11-01 10:06:21

标签: c linked-list queue

我有两个链接列表,我使用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;
}

2 个答案:

答案 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));
  1. 您正在使用指针p来运行列表,但此指针未在循环内使用。必须用此指针inputFront替换语句中的p。这将允许它遍历循环的每个元素。

  2. dequeue函数中,您正在移动指针inputFront(现在为p)。因此,如果你在循环中执行p = p-> next,它将完成两次。这必须删除。

  3. 固定代码

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