0

私はトイレを待っている人々を保持するキューを実装しようとしていますが、トイレは男性と女性の両方のためのものですが、男性がいるときは女性は入ることができず、女性がいるときは男性は入ることができません.入力。これは私の問題です。(それは私のクラスの1つのデモであり、ほとんど学術的ではありません)

トイレとキューに人を挿入することはできますが(女性が入ろうとしてトイレに男性がいる場合、彼女はキューに追加されます)、キューから人を取り出してトイレに挿入することはできませんエントリー資格があります。これが私のコードです。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

struct Node
{
    int Data;
    struct Node* next;
}*rear, *front;

void delQueue()
{
    struct Node *temp, *var=rear;
    if(var==rear)
    {
        rear = rear->next;
        free(var);
    }
    else
    printf("\nQueue Empty");
}

void push(int value)
{
    struct Node *temp;
    temp=(struct Node *)malloc(sizeof(struct Node));
    temp->Data=value;
    if (front == NULL)
    {
        front=temp;
        front->next=NULL;
        rear=front;
    }
    else
    {
        front->next=temp;
        front=temp;
        front->next=NULL;
    }
}

void display()
{ 
    struct Node *var=rear;
    if(var!=NULL)
    {
        printf("\nElements in queue are:  ");
        while(var!=NULL)
        {
            printf("\t%d",var->Data);
            var=var->next;
        }
    printf("\n");
    } 
    else
    printf("\nQueue is Empty\n");
}

int main() { 

int man_busy = 0;
int woman_busy = 0;
int input = 0;
int i = 0;

printf("\n(1) Man enters\n");
printf("(2) Woman enters\n");
printf("(3) Man leaves\n");
printf("(4) Woman leaves\n");


    printf("\nEmpty!\n");


    for(i=0; i<20; i++) {

        scanf("%d", &input);

        if(input == 1){
            if(woman_busy > 0){
                printf("Man Can't enter when women are present\n");
                printf("You will have to wait in the queue\n");
                push(input);
                display();
            }   
            else if(woman_busy == 0) {
                man_busy = man_busy + 1;    
                printf("Occupied By Man: %d\n", man_busy);
            }
        }
        else if(input == 2) {
            if(man_busy > 0){
                printf("Woman Can't enter when men are present\n");
                printf("You will have to wait in the queue\n");
                push(input);
                display();
            }   
            else if(man_busy == 0) {
                woman_busy = woman_busy + 1;    
                printf("Occupied By Woman: %d\n", woman_busy);
            }
        }
        else if(input == 3) {
            man_busy = man_busy - 1;
            if (man_busy == 0 && woman_busy == 0){
                printf("Empty!\n");
                delQueue();
                display();
            }
            else if (man_busy < 0) {
                printf("Invalid command!\n");
                man_busy = man_busy + 1;
            }           
            else {
                printf("Occupied By Man: %d\n", man_busy);
            }
        }
        else if(input == 4) {
            woman_busy = woman_busy - 1;
            if (man_busy == 0 && woman_busy == 0) {
                printf("Empty!\n");
                delQueue();
                display();
            }
            else if (woman_busy < 0) {
                printf("Invalid command!\n");
                    woman_busy = woman_busy + 1;
            }
            else {
                printf("Occupied By Woman: %d\n", woman_busy);
            }
        }
    }
        return 0;

}
4

2 に答える 2

1

ルーチンのデキューが必要です (スタックには push /pop 命名法が使用されるため、関数名は enqueue および dequeue をお勧めします)。

バスルームが空という条件にヒットした場合、キューが空でない場合は、最初の要素のタイプのすべての要素をデキューする必要があります (つまり、キューの最初にいるのが男性か女性かに基づいて、すべての男性またはすべての女性)。バスルームの中に入れます。バスルームが空になったら、これを繰り返します。

于 2013-05-04T06:13:03.207 に答える
0

キューから人を削除したい場合は、目的のノードを切り落とし、リストを接着し、必要に応じて「後」と「前」を再度設定する必要があります。これを行うには、前のノードを追跡する必要があります。

  • ケース#1:

1<-2<-3-<4 Rear:1 Front:4

3 を切り落としたいのですが、前のノードは 2 です。

1<-2<- |3| -<4 Rear:1 Front:4

そして、に接着previous->nextしますchopped_off->next

1<-2<-----4 Rear:1 Front:4

また、目的の要素が「後」または「前」で示されている場合は、何も接着する必要はありません。

  • ケース#2:

1<-2<-3-<4 Rear:1 Front:4

1つ切り落としたいのですが、先行ノードがありません!

|1| <-2<-3-<4 Rear:1 Front:4

リアのリセット

2<-3-<4 Rear:2 Front:4

バスルームは無限の人数を処理できますか? はいの場合、 rearが指す要素を常に切り捨てます。前のノードを保存する必要はありません。それは驚くほど簡単です。なぜなら、キューには常に男性または女性しかいないため、キュー全体をフラッシュする必要があり、バスルームが空になると、全員が単純に入ってくるからです.


  • ある種のメニュー選択を扱っている場合は、決してif-elseif-else を使用しないでください。選択肢に大きな選択肢がある場合、あなたは人を傷つけています。switch-caseステートメントについて学習します。これらは、このようなもののために設計されています。それはあなたの仕事をより簡単にします。
  • 変数の名前は小文字で始める必要があります。それが慣習であり、従わないと人々を混乱させる可能性があります。
  • 各操作の後にキュー全体を把握することをお勧めします。
  • デバッグの目的で、キュー内のさまざまな男性と女性を区別できるものを実装することをお勧めします。正しい人がキューから削除されているかどうかを確認したいと考えています。
  • #include <time.h>?
于 2013-05-04T06:34:24.063 に答える