1

あらゆる種類のメニューオプション(すべて実行されます)を備えたキューを実装するプログラムを作成する必要があります。「ポップ」機能に問題があります。

私のプログラムは、従業員のためのレストランの順番待ちリストです。顧客がレストランに電話をかけたり、レストランに来たりするたびに、彼らは順番待ちリストに入れられます。ポップする(着席する)唯一の方法は、顧客のステータスがレストランで待機している場合です。お客さんを電話からレストランで待つように変える部分を正しく書きました。

また、グループのサイズがテーブルのサイズよりも大きい場合は、次のノードに移動して、次のグループが着席する基準に適合しているかどうかを確認することになっています。

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

出力を表示するときに、キューの最初の人をスキップする必要がある場合、インスタンス内のノードは削除されません。ただし、最初の人が基準を満たしている場合は機能します。どうしてこれなの?

4

1 に答える 1

2

まず、あなたのポップでは、リストの途中にあるアイテムを削除できるようです。これは実行可能ですが、ポップされたノードの後のノードに設定されるように、ポップされたノードを指しいたものを覚えておく必要があります。これを行うにはいくつかの方法があります。

また、 empty() 条件はオフです。リストが空の場合、新しく追加されたノードメンバーを NULLheadに設定して仕事を正しく行っている場合、常に NULL になります。NULL とnextNodeの比較tailまたはチェックは必要ありません。tail

最後に、pop からデータがあればそれを返すことを検討したいかもしれません。また、何かが削除されたかどうかを示す関数の戻り値として true/false のブール条件を使用することを検討してください。それ以外の場合、データが正常に取得され、そのデータ何であったかをプログラムでどのように知ることができますか?

とにかく、一致するものを削除するという現在のマントラを使用するだけです:

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

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

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

    temp = *head;
    while (temp && (temp->groupSize > tableSize || temp->waitStatus == CALL))
    {
        prior = temp;
        temp = temp->nextNode;
    }

    if (temp)
    {
        // only way prior is set is if temp is NOT
        //  pointing to the first node, therefore *head
        //  is not changed.
        if (prior)
        {
            prior->nextNode = temp->nextNode;

            // if we made it to the tail ptr, then it needs
            //  to be moved back to the prior node
            if (*tail == temp)
                *tail = prior;
        }
        else
        {   // first node was removed. so move head to
            //  the next node (which may be NULL)
            *head = temp->nextNode;
        }

        // release the node
        free(temp);
    }
}
于 2013-02-28T03:23:56.840 に答える