写C语言,用链表表示队列,客户先来先服务,有四个服务窗口有取款、存款、还贷、挂失一共四个服务类型,取款服务时间为8、存款服务时间为12、还贷服务时间为15、挂失服务时间为10,一共四个服务类型,用序号表示服务类型,客户选择服务类型,文件读取客户排队序号、到达的时间、需要服务的类型,在营业时间内,计算客户在银行内逗留的平均时间和每个窗口办理的客户总数及办理的每种业务总数
时间: 2024-04-12 22:32:17 浏览: 58
所有基础数据结构和算法的纯C语言实现,如各自排序、链表、栈、队列、各种树....
下面是根据你的要求,使用链表表示队列的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; // 总等待时间
// 假设银行营业时间为60分钟
int businessTime = 60;
int serviceTime[4] = {8, 12, 15, 10}; // 每种业务的服务时间
while (!isEmpty(queue)) {
Customer customer = dequeue(queue);
customerCount++;
totalWaitingTime += (customer.arrivalTime - 1) * 5; // 每个客户等待时间为前面客户数量乘以5分钟
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` 包含了客户的排队序号、到达时间和需要服务的类型,每行一个客户记录,以空格分隔。
你可以根据实际需求修改代码中的数据结构和业务类型。
阅读全文