【问题标题】:Enqueue/Dequeue two linked lists simultaneously in C在C中同时入队/出队两个链表
【发布时间】:2017-03-14 11:04:28
【问题描述】:

我有两个使用 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;
}

【问题讨论】:

  • 请发minimal reproducible example 并附上输入、实际输出和预期输出的示例。
  • 好吧,你得到了帮助。提供反馈是否对您有帮助是有礼貌的。

标签: c linked-list queue


【解决方案1】:

您的代码存在 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-&gt; 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));

【讨论】:

    【解决方案2】:

    问题似乎出在您的打印循环中。您让p 前进到列表末尾,然后让dequeue 检索列表中的下一个(第一个)项目。但是出队也会从列表中删除前面。在返回之后,for 循环现在也前进了p,其next 成员已经前进了。给定输入 a b c,我希望现在的输出是 a c。如果带上调试器,可以得到更多线索。

    【讨论】:

    • 感谢您的解释。你是对的,循环是问题所在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多