循环队列的操作
特点是 队空的条件:tail = = Head
队满的条件:tail +1 = head
常用的: 入队 / 出队
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <error.h>
#include "seqqueue.h"
SeqQueue *CreateSeqQueue(int len) //创建
{
SeqQueue * sq = malloc(sizeof(SeqQueue));
if(NULL == sq)
{
perror("CreateSeqQueue");
return NULL;
}
sq->array = malloc(sizeof(DATATYPE)*len);
if(NULL == sq->array)
{
perror("CreateSeqQueue");
return NULL;
}
sq->head = 0;
sq->tail = 0 ;
sq->tlen = len;
return sq;
}
int EnterSeqQueue(SeqQueue *queue, DATATYPE *data) //入队
{
if(IsFullSeqQueue(queue))
{
fprintf(stderr,"EnterSeqQueue error\n");
return 1;
}
memcpy(&queue->array[queue->tail],data,sizeof(DATATYPE));
queue->tail = (queue->tail+1)%queue->tlen;
return 0;
}
int IsEmptySeqQueue(SeqQueue *queue) //判断是否为空队
{
return queue->head == queue->tail;
}
int IsFullSeqQueue(SeqQueue *queue) //判断是否为满队
{
return queue->head == (queue->tail+1) %queue->tlen;
}
int QuitSeqQueue(SeqQueue *queue) //出队
{
if(IsEmptySeqQueue(queue))
{
fprintf(stderr,"QuitSeqQueue error\n");
return 1;
}
queue->head= (queue->head +1)%queue->tlen;
return 0;
}
DATATYPE *GetHeadSeqQueue(SeqQueue *queue) //获得队头的数据
{
if(IsEmptySeqQueue(queue))
{
return NULL;
}
return &queue->array[queue->head];
}
int DestroySeqQueue(SeqQueue *queue) //销毁队列
{
free(queue->array);
free(queue);
return 0;
}
==================================
链式队列的操作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <error.h>
#include <errno.h>
#include "linkqueue.h"
LinkQueue *CreateLinkQueue() //创建
{
LinkQueue* lq =(LinkQueue*)malloc(sizeof(LinkQueue));
if(NULL == lq)
{
perror("CreateLinkQueue malloc");
return NULL;
}
lq->head =NULL;
lq->tail =NULL;
lq->clen = 0 ;
return lq;
}
int EnterLinkQueue(LinkQueue *queue, DATATYPE *data) //入队
{
QueueNode*newnode = (QueueNode*)malloc(sizeof(QueueNode));
if(NULL == newnode)
{
perror("EnterLinkQueue malloc");
return 1;
}
memcpy(&newnode->data,data,sizeof(DATATYPE));
newnode->next = NULL;
if(IsEmptyLinkQueue(queue))
{
queue->head = newnode;
queue->tail = newnode;
}
else
{
queue->tail->next = newnode;
queue->tail = newnode;
}
queue->clen++;
return 0;
}
int IsEmptyLinkQueue(LinkQueue *queue) //判断是否为空队
{
return 0 == queue->clen;
}
int QuitLinkQueue(LinkQueue *queue) //出队
{
if(IsEmptyLinkQueue(queue))
{
return 1;
}
QueueNode* tmp = queue->head;
queue->head = queue->head->next;
if(NULL ==queue->head)
{
queue->tail = NULL;
}
free(tmp);
queue->clen--;
return 0;
}
DATATYPE *GetHeadLinkQueue(LinkQueue *queue) //获得队头元素
{
if(IsEmptyLinkQueue(queue))
{
return NULL;
}
return &queue->head->data;
}
int GetSizeLinkQueue(LinkQueue *queue) //获得链式队列的大小
{
return queue->clen;
}
int DestroyLinkQueue(LinkQueue *queue) //销毁链式队列
{
int i =0 ;
int len = GetSizeLinkQueue(queue);
for(i=0;i<len;i++)
{
QuitLinkQueue(queue);
}
free(queue);
return 0;
}