C语言,用链表表示队列,有新窗口先去新窗口服务,客户哪个队列先结束了服务,就去服务新的下一个客户,有四个服务窗口有取款、存款、还贷、挂失一共四个服务类型,每个窗口都可以办理这四种业务,取款服务时间为8、存款服务时间为12、还贷服务时间为15、挂失服务时间为10,一共四个服务类型,用序号表示服务类型,客户选择服务类型,文件读取客户排队序号、到达的时间、服务的类型,在营业时间段,逗留时间等于客户到达时间加服务时间,计算客户在银行内逗留的平均时间,统计每个窗口办理的每种业务数的数量和客户数量
时间: 2024-04-19 21:26:14 浏览: 55
C语言数据结构链表队列的实现
您好!根据您的需求,我可以帮助您设计一个用链表表示队列的程序来模拟银行的服务过程。以下是我提供的一个简单的解决方案:
首先,我们可以定义一个结构体来表示客户的信息:
```c
typedef struct {
int sequence; // 排队序号
int arrival_time; // 到达时间
int service_type; // 服务类型
int service_time; // 服务时间
int stay_time; // 逗留时间
} Customer;
```
接下来,我们可以定义一个链表节点来表示队列中的每个客户:
```c
typedef struct Node {
Customer customer;
struct Node* next;
} Node;
```
然后,我们可以定义一个队列结构体,其中包括队列的头指针和尾指针:
```c
typedef struct {
Node* front;
Node* rear;
} Queue;
```
接下来,我们可以定义一个函数来初始化队列:
```c
void initQueue(Queue* queue) {
queue->front = queue->rear = NULL;
}
```
然后,我们可以定义一些函数来操作队列,比如入队和出队操作:
```c
void enqueue(Queue* queue, Customer customer) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->customer = customer;
newNode->next = NULL;
if (queue->rear == NULL) {
queue->front = queue->rear = newNode;
} else {
queue->rear->next = newNode;
queue->rear = newNode;
}
}
Customer dequeue(Queue* queue) {
if (queue->front == NULL) {
printf("Queue is empty.\n");
exit(1);
}
Node* temp = queue->front;
Customer customer = temp->customer;
queue->front = queue->front->next;
if (queue->front == NULL) {
queue->rear = NULL;
}
free(temp);
return customer;
}
int isEmpty(Queue* queue) {
return queue->front == NULL;
}
```
接下来,我们可以定义一个函数来模拟银行的服务过程:
```c
void simulateBankService() {
Queue queues[4]; // 四个服务类型的队列
int service_times[4] = {8, 12, 15, 10}; // 四种服务类型的服务时间
int total_stay_time = 0; // 总逗留时间
int total_customers = 0; // 总客户数量
int service_counts[4] = {0}; // 每种服务类型的数量
// 初始化队列
for (int i = 0; i < 4; i++) {
initQueue(&queues[i]);
}
// 从文件读取客户信息并加入队列
FILE* file = fopen("customer.txt", "r");
if (file == NULL) {
printf("Failed to open file.\n");
exit(1);
}
int sequence, arrival_time, service_type;
while (fscanf(file, "%d %d %d", &sequence, &arrival_time, &service_type) != EOF) {
Customer customer;
customer.sequence = sequence;
customer.arrival_time = arrival_time;
customer.service_type = service_type;
customer.service_time = service_times[service_type - 1];
customer.stay_time = 0;
enqueue(&queues[service_type - 1], customer);
}
fclose(file);
// 模拟银行服务过程
int current_time = 0;
while (!isEmpty(&queues[0]) || !isEmpty(&queues[1]) || !isEmpty(&queues[2]) || !isEmpty(&queues[3])) {
for (int i = 0; i < 4; i++) {
if (!isEmpty(&queues[i])) {
Customer customer = dequeue(&queues[i]);
if (customer.arrival_time > current_time) {
current_time = customer.arrival_time;
}
customer.stay_time = current_time - customer.arrival_time;
total_stay_time += customer.stay_time;
total_customers++;
service_counts[i]++;
current_time += customer.service_time;
}
}
}
// 计算平均逗留时间
double average_stay_time = (double)total_stay_time / total_customers;
// 输出结果
printf("Average stay time: %.2f\n", average_stay_time);
printf("Service counts:\n");
printf("取款:%d\n", service_counts[0]);
printf("存款:%d\n", service_counts[1]);
printf("还贷:%d\n", service_counts[2]);
printf("挂失:%d\n", service_counts[3]);
}
```
最后,我们可以在主函数中调用 `simulateBankService` 函数来运行模拟:
```c
int main() {
simulateBankService();
return 0;
}
```
请注意,上述代码只是一个简单的示例,可能还需要根据您的具体需求进行修改和完善。希望以上代码能够帮助到您!如果您有任何问题,请随时提问。
阅读全文