标签:
队列的定义
只允许在队尾追加新的元素,在队首移除元素。是FIFO模型。队列的操作比链表少了许多,所以我们可以基于链表来构建一个队列。
队列的图示
代码
/*********** file:LinkQueue.h date:2016/3/28 ***********/ #ifndef _LINKQUEUE_H_ #define _LINKQUEUE_H_ #include<stdlib.h> typedef int DataType; //定义存储的目标数据类型 typedef struct node{ //定义每一个节点类型 DataType data; struct node*next; }Node; typedef struct{ //定义队列 Node* front; Node* tail; }LinkQueue; void InitQueue(LinkQueue*queue); void EnQueue(LinkQueue* queue,DataType newData); int DeQueue(LinkQueue* queue,DataType*de); int QueueLength(const LinkQueue* queue); int QueueIsEmpty(const LinkQueue*queue); #endif
/************ file:LinkQueue.cpp date:2016/3/28 *************/ #include"LinkQueue.h" //初始化队列,头指针和为指针都是空 void InitQueue(LinkQueue*queue) { queue->front = NULL; queue->tail = NULL; } //入队,再链表尾部追加一个元素 。 //要特别注意第一个元素入队的情况 void EnQueue(LinkQueue* queue,DataType newData) { Node*p_new; p_new = (Node*)malloc(sizeof(Node)); if(p_new==NULL) exit(-1); p_new ->data = newData; p_new->next = NULL; if(QueueIsEmpty(queue)) //第一个元素入队的情况 { queue->front = queue->tail = p_new; } else{ //第2,3,4....个元素入队情况 queue->tail->next = p_new; //链接 queue->tail = p_new; //重置尾节点 } } //出队,删除链表的第一个元素 //要特别注意最后一个元素被删除的情况 int DeQueue(LinkQueue* queue,DataType*de) { Node*t = queue->front; //获取队头节点的地址为t if(QueueIsEmpty(queue)) //队列空了,不能再出队 return 0; queue->front = t->next; //队列的头节点地址后移 if(queue->front==NULL) queue->tail = NULL; //如果队头指针为空,说明此时队空了。 if(de!=NULL) //存回被删除的元素 *de = t->data; free(t); return 1; } //队列的长度 int QueueLength(const LinkQueue* queue) { int count=0; Node*p = queue->front; while(p!=NULL) { p = p->next; count++; } return count; } //队列是否为空 int QueueIsEmpty(const LinkQueue*queue) { if(queue->front == NULL && queue->tail == NULL) return 1; return 0; }
标签:
原文地址:http://www.cnblogs.com/lulipro/p/5328560.html