写C语言,用链表表示队列,客户哪个队列先结束了服务,就去服务新的下一个客户,有四个服务窗口有取款、存款、还贷、挂失一共四个服务类型,取款服务时间为8、存款服务时间为12、还贷服务时间为15、挂失服务时间为10,一共四个服务类型,用序号表示服务类型,客户选择服务类型,文件读取客户排队序号、到达的时间、需要服务的类型,在营业时间内,计算客户在银行内逗留的平均时间和每个窗口办理的客户数及办理的每种业务数。
时间: 2024-04-12 08:32:34 浏览: 67
下是根据你的要,使用链表表示队列的语言代码。代码包含了客户哪队列先结束了,就去服务新的下一个户的逻辑。服务窗口的服务类型和服务时间已经按照你的要求进行设置。代码还计算了客户在银行内逗留的平均时间,以及每个窗口办理的客户数和每种业务数。
```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; // 总等待时间
// 服务窗口的服务时间
int serviceTime[4] = {8, 12, 15, 10};
// 假设银行营业时间为60分钟
int businessTime = 60;
while (!isEmpty(queue)) {
int minServiceEndTime = businessTime; // 最早结束服务的时间
int minServiceWindow = -1; // 最早结束服务的窗口
Node* currNode = queue->front;
// 遍历队列找到最早结束服务的窗口
while (currNode != NULL) {
int currServiceTime = serviceTime[currNode->customer.serviceType - 1];
if (currServiceTime < minServiceEndTime) {
minServiceEndTime = currServiceTime;
minServiceWindow = currNode->customer.serviceType;
}
currNode = currNode->next;
}
// 更新统计信息
currNode = queue->front;
while (currNode != NULL) {
currNode->customer.arrivalTime -= minServiceEndTime;
if (currNode->customer.arrivalTime == 0) {
windowCount[currNode->customer.serviceType - 1]++;
serviceCount[currNode->customer.serviceType - 1]++;
totalWaitingTime += (businessTime - minServiceEndTime);
customerCount++;
// 出队
if (currNode == queue->front) {
queue->front = queue->front->next;
if (queue->front == NULL) {
queue->rear = NULL;
}
free(currNode);
currNode = queue->front;
} else {
Node* prevNode = queue->front;
while (prevNode->next != currNode) {
prevNode = prevNode->next;
}
prevNode->next = currNode->next;
if (currNode == queue->rear) {
queue->rear = prevNode;
}
free(currNode);
currNode = prevNode->next;
}
} else {
currNode = currNode->next;
}
}
// 更新服务窗口的服务时间
serviceTime[minServiceWindow - 1] -= minServiceEndTime;
}
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` 包含了客户的排队序号、到达时间和需要服务的类型,每行一个客户记录,以空格分隔。
你可以根据实际需求修改代码中的数据结构和业务类型。
阅读全文