写C语言,用链表表示队列,客户先来先服务,有四个服务窗口有取款、存款、还贷、挂失一共四个服务类型,每个业务服务时间不同,用序号表示服务类型,客户选择服务类型,文件读取客户排队序号、到达的时间、需要服务的类型,在营业时间内,计算客户在银行内逗留的平均时间和每个窗口办理的客户总数及办理的每种业务总数
时间: 2024-04-12 19:32:13 浏览: 69
下面是用链表表示队列的C语言代码,实现了客户先来先服务的功能。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义客户结构体
typedef struct {
int number; // 排队序号
int arrivalTime; // 到达时间
int serviceType; // 服务类型
} Customer;
// 定义队列节点结构体
typedef struct Node {
Customer customer;
struct Node* next;
} Node;
// 定义队列结构体
typedef struct {
Node* front; // 队头指针
Node* rear; // 队尾指针
} Queue;
// 初始化队列
void initQueue(Queue* queue) {
queue->front = queue->rear = NULL;
}
// 入队操作
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* tempNode = queue->front;
Customer customer = tempNode->customer;
if (queue->front == queue->rear) {
queue->front = queue->rear = NULL;
} else {
queue->front = queue->front->next;
}
free(tempNode);
return customer;
}
// 判断队列是否为空
int isEmpty(Queue* queue) {
return queue->front == NULL;
}
// 计算客户在银行内逗留的平均时间和每个窗口办理的客户总数及办理的每种业务总数
void calculateStats(Queue* queue) {
int windowCount[4] = {0}; // 每个窗口办理的客户总数
int serviceCount[4] = {0}; // 每种业务总数
int customerCount = 0; // 客户总数
int totalWaitingTime = 0; // 总等待时间
while (!isEmpty(queue)) {
Customer customer = dequeue(queue);
customerCount++;
totalWaitingTime += customer.arrivalTime;
windowCount[customer.serviceType - 1]++;
serviceCount[customer.serviceType - 1]++;
}
float avgWaitingTime = (float)totalWaitingTime / customerCount;
printf("平均等待时间:%f\n", avgWaitingTime);
for (int i = 0; i < 4; i++) {
printf("窗口%d办理的客户总数:%d\n", i + 1, windowCount[i]);
}
for (int i = 0; i < 4; i++) {
printf("办理业务%d的客户总数:%d\n", i + 1, serviceCount[i]);
}
}
int main() {
FILE* file = fopen("customers.txt", "r");
if (file == NULL) {
printf("Failed to open file.\n");
exit(1);
}
Queue queue;
initQueue(&queue);
int number, arrivalTime, serviceType;
while (fscanf(file, "%d %d %d", &number, &arrivalTime, &serviceType) == 3) {
Customer customer;
customer.number = number;
customer.arrivalTime = arrivalTime;
customer.serviceType = serviceType;
enqueue(&queue, customer);
}
fclose(file);
calculateStats(&queue);
return 0;
}
```
请注意,上述代码假定文件 `customers.txt` 包含了客户的排队序号、到达时间和需要服务的类型,每行一个客户记录,以空格分隔。
你可以根据实际需求修改代码中的数据结构和业务类型。
阅读全文