为什么我的循环仅适用于前几次迭代?

时间:2014-06-04 02:37:00

标签: c loops data-structures linked-list queue

我正在编写一个代码,模拟超市的结账行。我为这个问题使用动态分配(队列)。 当前时间将从0到120分钟(这也是我的循环的120次迭代) 每个客户将随机输入该行(下一个人将在1到4分钟的随机整数间隔后输入)。客户也将以随机时间方式(1-4分钟后)由店员提供服务。 执行如下:

----客户编号1到达

- 当前时间为0

- 当前时间是1

----客户编号1离开

- 当前时间是2

----客户编号2到达

- 当前时间是3

----客户编号3到达

----客户编号2离开

等等。

函数入队帮助我将下一个客户添加到该行。 函数出列帮助我删除所服务的客户。 这是First In First Out队列。 第一个进入的人将是第一个离开这条线的人。

我的问题是:我的程序适用于大约60或70个循环。在这些循环之后,我只看到人们进入线路,我不再看到有人离开线路。 我该如何解决这个循环? 我的代码是:

 struct customer{
int number;  //show the order of the customer waiting on the line
struct customer *nextPtr; //point to the next customer
 };
 typedef struct customer Customer;
 typedef Customer *CustomerPtr;
int main (void)
{
  srand(time(NULL));
  CustomerPtr startPtr=NULL;
  int timework=0;
  int timein=0;
  int timeout=0;
  int customerio=1;// show the order of the customer entering the line
  printf("\tCustomer number %d arrived\n", customerio);
  enqueue(&startPtr, customerio);
  timein+=rand()%4+1; //schedule the time the next customer will enter the line
  timeout+=rand()%4+1; //schedule the time the next customer will leave the line

while (timework<=120){ // the clerk will serve customers for 120 minutes
    printf("Current time is %d\n", timework);
    if (timework==timeout){ //if the current time matches the time scheduled
        if (startPtr!=NULL){
            printf("\tCustomer number %d left\n", startPtr->number);
            dequeue(&startPtr); //remove a customer from queue
            timeout+=rand()%4+1;
        }
    }
    if (timework==timein){  //if the current time matches the time scheduled
        customerio+=1;
        printf("\tCustomer number %d arrived\n", customerio);
        enqueue(&startPtr, customerio);  //add a customer to queue
        timein+=rand()%4+1;
    }

    timework++; //time elapses to the next minute
}
return 0;
}

1 个答案:

答案 0 :(得分:0)

如果您遇到空队列(statePtr == NULL),那么您不会更新超时,因此它总是少于时间工作。通过移动

更新您的代码
timeout+=rand()%4+1;

在检查statePtr的条件之外。

或者,将条件检查更改为timework >= timeout,但这可能不太明显/有效。

其他解决方案是可能的 - 这是正确的取决于模拟的性质。