#include<stdio.h>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
//链式队列的结点结构体
typedef struct node {
int id;//打印任务标识号
char* text;//要打印的内容
struct node* next;//指向下一个结点的指针
}Task;//结点结构体Task
//链式队列的头指针、尾指针结构体定义
typedef struct {
Task* front;//头指针
Task* rear;//尾指针
}Queue;//链式队列的结构体
//初始化 打印队列
void InitaskManager(Queue* taskmanager) {
taskmanager->front = taskmanager->rear = NULL;
}
//入队列 把新的打印任务加到队尾
void AppendPrintTask(Queue* taskmanager, int tid, char* text) {
Task* p;
p = (Task*)malloc(sizeof(Task));
p->text = (char*)malloc(strlen(text) * sizeof(Task) + 1);
strcpy(p->text, text);//打印内容赋值
p->id = tid;//打印标识赋值
p->next = NULL;
//队列原来非空时,队尾增加新结点
if (taskmanager->rear != NULL)
taskmanager->rear->next = p;
taskmanager->rear = p;//调整尾指针
//队列原来非空时修改队头指针
if (taskmanager->front == NULL)
taskmanager->front = p;
}
//出队列 取出队列中的第一个任务进行打印,并把该任务从队头删除
int PrintFirstTask(Queue* taskmanager) {
Task* p = taskmanager->front;//指向队头结点
if (p == NULL) return 0;//若队列为空出错
else {
printf("Task id: %d\n", p->id);
printf("Task context:%s\n", p->text);
}
taskmanager->front = taskmanager->front->next;//产生新的队头结点
//若队列已经清空,置队尾指针指向空指针
if (taskmanager->front == NULL)
taskmanager->rear == NULL;
free(p->text);
free(p);
return 1;
}
//输出 输出显示当前队列中的所有打印任务
void PrintAllTask(Queue* taskmanager) {
Task* p = taskmanager->front;
while (p!=NULL) {
printf("Task id: %d\n", p->id);
printf("Task context:%s\n", p->text);
p = p->next;
}
}
//清空 清空打印队列
void ClearPrintTask(Queue* taskmanager) {
if (taskmanager->front == NULL)
return;
Task* p, * p1;
p = taskmanager->front->next;
while (p!=NULL){
p1 = p;
p = p->next;
free(p1->text);
free(p1);
}
}
//测试程序
void main(void) {
char ch = "0";
int tid = 0;
char* text = "打印内容";
Queue Q;
InitaskManager(&Q);//初始化
while (ch != 'q') {
printf("1 添加打印任务 ");
printf("2 打印一个任务 ");
printf("3 输出打印任务 ");
printf("4 清空打印任务 ");
printf("E 退出打印系统\n");
printf("请输入操作序号: ");
ch = getchar();
getchar();
switch (ch) {
case '1':
tid += 1;
AppendPrintTask(&Q, tid, text);//添加打印任务
break;
case '2':
PrintFirstTask(&Q);//完成队头打印任务并删除队头结点
break;
case '3':
PrintAllTask(&Q);//输出显示当前队列所有打印任务
break;
case'4':
ClearPrintTask(&Q);//清空打印列表
break;
case'E':return;
}
}
}
队列的应用——打印机模拟自写
最新推荐文章于 2024-04-22 09:44:35 发布