我在pop函数(队列)C中做错了什么

时间:2013-02-28 03:11:10

标签: c linked-list queue

我必须编写一个程序来实现具有各种菜单选项的队列(这些都已完成)。我的“pop”功能出了问题。

我的计划是员工的餐厅等候名单。每当顾客打电话或进入餐厅时,他们都会被列入等候名单。弹出(坐下)的唯一方法是,如果客户的状态是在餐厅等待。我已经正确地写了将客户从打电话转到餐厅等候的部分。

此外,如果组大小大于表格大小,我应该转到下一个节点并检查下一个组是否符合要坐下的条件。

enum status(WAIT,CALL);

typedef struct restaurant
{
//stuff
}list;

//I call pop in the main as follows:

pop(&head, &tail);   

void pop(list** head, list** tail)
{
    list* temp = *head;
    int tableSize;

    if(*head == *tail && *tail == NULL)
    {
        printf("The queue is empty... exitting program... \n");
        exit(EXIT_FAILURE);
    }

    printf("What is the table size? ");
    scanf(" %d", &tableSize);

    if(temp->groupSize > tableSize || temp->waitStatus == CALL)
        while(temp->groupSize > tableSize || temp->waitStatus == CALL)
            temp = temp->nextNode;

    else
        *head = (*head)->nextNode;

    if(*tail == temp)
        *tail = (*tail)->nextNode;

    free(temp);
}

当我显示输出时,如果必须跳过队列中的第一个人,则不会删除实例中的节点。但是,当第一个人符合标准时,它确实有效。这是为什么?

1 个答案:

答案 0 :(得分:2)

首先,你的pop似乎允许删除列表中间的项目。虽然这是可行的,但它需要您记住将指向弹出的节点的内容,以确保在弹出节点后将其设置为的节点。有很多方法可以做到这一点。

此外,您的empty()条件已关闭。如果列表为空,如果您正在将新添加的节点head成员设置为NULL,那么nextNode将始终为NULL。 tail的比较是不需要的。

最后,也许你可能想要考虑从pop中返回 data (如果有的话)和布尔条件为true / false作为函数返回结果以指示是否取消了某些内容。否则,您的程序如何成功检索数据,以及

的数据是什么?

无论如何,只使用你当前的咒语来删除匹配的东西:

tail