2013-05-03 4 views
0

Я пытаюсь реализовать очередь, в которой будут стоять люди, ожидающие очереди в ванной, но дело в том, что ванная для мужчин и женщин, но когда мужчины присутствуют, женщины не могут войти и когда женщины присутствуют, мужчины не могут войти. Это моя проблема. (Его демо для одного из моих классов его не оценили едва ли не академическим)Реализация простой очереди с помощью связанного списка

Я могу вставлять людей в ванную комнату и в очередь (когда женщины пытаются войти, а в ванной она добавляется, очередь), но я не могу взять людей из очереди и вставить затем в ванную, когда они имеют право на вход. Вот мой код.

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

} 
+0

Неужели мужчины прыгают впереди женщин, ожидающих в очереди, если мужчина уже находится в ванной, а v.v.? –

+0

да мужчины прыгают по линии и входят, если в ванной уже есть мужчины, и она работает в обоих направлениях. – user2133160

ответ

1

Вам нужен рутинный DEQUEUE (рекомендую имена функций епдиеие и Dequeue как тяни/поп номенклатуру используется для стека).

Когда вы нажмете пустое состояние ванной комнаты, и если очередь не пуста, вам необходимо удалить все элементы типа первого элемента (т.е. всех мужчин или всех женщин, исходя из того, был ли он первым или единственным мужчиной или женщиной в очереди) и положить их в ванную. Повторите это, когда когда-либо ванная комната пуста.

+0

pop() и push() отлично подходят для очередей –

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

ванной может обрабатывать бесконечное число людей? Если да, вы всегда будете отрубать элемент, на который указывает сзади. и нет необходимости сохранять предыдущий узел. Это было бы удивительно легко, потому что вам нужно было бы очистить всю очередь, потому что в каждый момент в очереди есть только мужчины или женщины, а когда ванная пуста, все они просто будут ходить.


  • Если Вы имеете дело с какой-то выбор меню никогда не использовать если-ElseIf-нибудь. Если есть большой выбор вариантов, вы причиняете людям боль. Узнать о switch-case заявления. Они предназначены для таких вещей. Это упростит вашу работу.
  • Вы должны начать имена своих переменных в нижнем регистре. Это соглашение, и это может смутить людей, если вы не будете следовать ему.
  • Было бы неплохо иметь представление о всей очереди после каждой операции.
  • Было бы неплохо реализовать что-то, что могло бы отличить разных мужчин и женщин в очереди для целей отладки. Вы хотите проверить, удалены ли правильные люди из очереди.
  • #include <time.h>?
Смежные вопросы