队列:具有一定操作约束的线性表。(只能在一段插入,在另一端删除)
1、Queue CreatQueue(int MaxSize); //生成长度为MaxSize的空队列;
2、int IsFullQ(Queue Q,int MaxSize); //判断队列Q是否已满;
3、void AddQ(Queue Q,ElementType item); //将数据元素item插入到队列Q中;
4、int IsEmptyQ(Queue Q); //判断队列Q是否为空;
5、ElementType DeleteQ(Queue Q); //将队头数据元素从队列中删除并返回。
队列的顺序存储实现:队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录队列尾元素位置的变量rear组成。
#define MaxSize <存储数据元素的最大个数>
struct QNode{
ElementType Data[MaxSize];
int rear;
int front;
};
typedef struct QNode* Queue;
队列又分为直队列和顺环队列。
注意:顺环队列通常只使用(n-1)个数据空间。
队列的链式存储实现:队列的链式存储结构也可以用一个单链表实现。插入和删除操作分别在链表的两头进行。(插入rear后移,删除front后移,由链表只能联系后序节点的特点可知,front指向链表头,rear指向链表尾)
struct Node{
ElementType Data;
struct Node* Next;
};
struct QNode{
struct Node* rear;
struct Node* front;
};
typedef struct QNode* Queue;
Queue PtrQ;
不带头节点的链式队列出队操作的一个示例:
ElementType Delete(Queue PtrQ){
struct Node* FrontCell;
ElementType FrontElem;
if(PtrQ->front==NULL){
printf("队列空");
return ERROR;
}
FrontCell=PtrQ->front;
if(PtrQ->front==PtrQ->rear){ //若队列只有一个元素
PtrQ->front=PtrQ->rear=NULL; //删除后队列置为空
}
else{
PtrQ->front=PtrQ->front->Next;
}
FrontElem=FrontCell->Data;
free(FrontCell); //释放被删除节点空间
return FrontElem;
}