Linux高级环境编程实验报告3.docVIP

  • 33
  • 0
  • 约 6页
  • 2017-03-05 发布于重庆
  • 举报
Linux高级环境编程实验报告3

作 业 报 告 学生姓名: 学 号: 指导教师: 学生E-mail: 一、作业名称: 自定义消息队列 二、作业要求 自行设计一个消息队列(不能依赖已有库的队列),实现一般队列的操作:入列、出列以及队列判空,另外要保证线程安全,并且能够接收CLMessage类继承体系的消息;需要提供发送消息的通信类,以及循环消息的管理类,保证能够支持线程之间的通信。 三、设计与实现 根据要求分析,首先不能依赖已有库的队列,我们可以利用单链表来创建一个队列,对于消息的出队与入队操作,需要设定两个指针,头指针和尾指针,分别指向队头和队尾,根据队列的要求,队头处只能读(出队),队尾只能写(入队)。对于判空操作,设定队头指针等于队尾指针时为空。 代码清单3.1 自定义队列的实现 struct CLNode //链表节点 { T data; struct CLNode *next; }; template class T class CLMyQueue { private: struct CLNodeT *QueueHead;//队头指针 struct CLNodeT *QueueTail;//队尾指针 public: CLMyQueue(); ~CLMyQueue(); void Push(T data); //数据入队操作 T Pop(); //数据出队操作 bool IsEmpty();//不能从空队列读数据,因此需进行队列判空 }; template class T CLMyQueueT::CLMyQueue() //构造函数中对队列进行初始化操作,队头、队尾置空 { QueueHead = NULL; QueueTail = NULL; } template class T CLMyQueueT::~CLMyQueue() //析构函数清空队列中的所有数据 { while (QueueHead != NULL) //队头不为空,则清除队头,继续找队头的后继结点,删除所有的结点数据 { struct CLNodeT *t = QueueHead; QueueHead = QueueHead-next; delete t; } } template class T void CLMyQueueT::Push(T data)//数据入队操作 { if (IsEmpty())//如果队列为空,将数据入队,并且队头和队尾指针都指向该数据 { QueueHead = new struct CLNodeT; QueueHead-data = data; QueueTail = QueueHead; return; } //在队尾插入数据 struct CLNodeT *newNode = new struct CLNodeT; newNode-data = data; newNode-next = NULL; QueueTail-next = newNode; QueueTail = newNode; } template class T T CLMyQueueT::Pop() //数据出队操作 { if (IsEmpty())//不能从空队列中读数据,因此判定队列是否为空,空则返回空指针 { return NULL; } T data = QueueHead-data;//取出对头数据,并修改队头指针 struct CLNodeT *t = QueueHead; QueueHead = QueueHead-next; delete t; return data; } template class T bool CLMyQueueT::IsEmpty()//判断队列是否为空 { if (QueueHead == NULL) //当队头指针为空时,队列为空 { return true; } return false; } 代码清单3.1给出了自定义消息队列的实现。开始定义了单链表结点的结构。在自定义队列类CLMyQueue中给出了入队和出队的操作,分别是Push和Pop函数,当然,要注意一些细节,在出队时要判断队列是否为空,若为空则无法进

文档评论(0)

1亿VIP精品文档

相关文档