队列是先入先出的数据结构,队列的实现一般是通过链表来实现,从链表尾节点入数据,链表头结点出数据,以下是链表的基本功能
typedef int QDataType;
typedef struct QListNode
{
struct QListNode* next;
QDataType data;
} QNode;//先入先出,用链表实现,
typedef struct Queue
{
QNode* head;
QNode* tail;
int size;
} Queue;
//初始化
void QueueInit(Queue* pq);
//销毁
void QueueDestroy(Queue* pq);
//入队列
void QueuePush(Queue* pq, QDataType x);
//出队列
void QueuePop(Queue* pq);
//返回队顶元素
QDataType QueueFront(Queue* pq);
//返回队尾元素
QDataType QueueBack(Queue* pq);
//判空
bool QueueEmpty(Queue* pq);
//返回队列数据个数
int QueueSize(Queue* pq);
需要注意的是,队列的实现只需要尾插和头删的实现,所以在这里可以额外设置一个尾节点,只进行尾插而不用尾删是非常方便的
QueueInit:
void QueueInit(Queue* pq)
{
assert(pq);
pq->head = NULL;
pq->tail = NULL;
pq->size = 0;
}
QueueDestroy:
void QueueDestroy(Queue* pq)
{
assert(pq);
QNode* pcur = pq->head;
while (pcur)
{
QNode* next = pcur->next;
free(pcur);
pcur = next;
}
pq->head = pq->tail = NULL;
pq->size = 0;
}
QueuePush:
void QueuePush(Queue* pq, QDataType x)
{
assert(pq);
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)
{
perror("malloc fail");
return;
}
newnode->next = NULL;
newnode->data = x;
//if (pq->head == pq->tail == NULL)不能这样写,前面判空后会为0,而0等于NULL会报错
if(pq->head==NULL)
{
pq->head = pq->tail = newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = newnode;
}
pq->size++;
}
QueuePop:
void QueuePop(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
if (pq->head->next==NULL)
{
free(pq->head);
pq->head = pq->tail = NULL;
}
else
{
QNode* next = pq->head->next;
free(pq->head);
pq->head = next;
}
pq->size--;
}
Queue:Front:
QDataType QueueFront(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
//assert(pq->head);
return pq->head->data;
}
QueueBack:
QDataType QueueBack(Queue* pq)
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->tail->data;
}
QueueSize:
int QueueSize(Queue* pq)
{
return pq->size;
}
QueueEmpty:
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->size == 0;
}