C语言实现队列
原理:
- 通过单链表实现的队列,队列就是一个尾插头删的单链表,先实现一个链表 ,再实现一个队列包括队头指针和队尾指针
- 图
头文件
#ifndef Queue_h
#define Queue_h
#include <stdio.h>
typedef int QDataType; //数据类型
typedef struct ListNode //通过链表实现的
{
QDataType _data;
struct ListNode* _pNext;
}ListNode,*pListNode;
typedef struct Queue
{
pListNode _pHead; //头指针
pListNode _pTail; //尾指针
}Queue;
void QueueInit(Queue* q); //初始化
void QueuePush(Queue* q, QDataType d);//进队列(尾插)
void QueuePop(Queue* q); //出队列(头删)
int QueueSize(Queue* q); //求队列大小
int QueueEmpty(Queue* q); //队列判空
QDataType Front(Queue* q); //获取队头元素
QDataType Back(Queue* q); //获取队尾元素
#endif /* Queue_h */
源文件
#include "Queue.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
pListNode BuyNode(QDataType d)
{
pListNode new = malloc(sizeof(ListNode));
new->_data = d;
new->_pNext = NULL;
return new;
}
void QueueInit(Queue* q)
{
assert(q);
q->_pHead = BuyNode(0);
q->_pTail =q->_pHead;
}
void QueuePush(Queue* q, QDataType d)
{
assert(q);
q->_pTail->_pNext = BuyNode(d);
q->_pTail = q->_pTail->_pNext;
}
void QueuePop(Queue* q)
{
pListNode dNode = q->_pHead->_pNext;
if (dNode)
{
q->_pHead->_pNext = dNode->_pNext;
if (q->_pHead->_pNext == NULL) {
q->_pTail = q->_pHead;
}//如果只有一个元素,删完后ptail会悬空
free(dNode);
}
}
int QueueSize(Queue* q)
{
assert(q);
pListNode pre = q->_pHead->_pNext;
int count = 0;
while (pre)
{
count++;
pre = pre->_pNext;
}
return count;
}
int QueueEmpty(Queue* q)
{
return NULL == q->_pHead->_pNext;
}
QDataType Front(Queue* q)
{
return q->_pHead->_pNext->_data;
}
QDataType Back(Queue* q)
{
return q->_pTail->_data;
}