队列的概念
一种特殊的线性结构! 只允许在一端进行插入数据的操作,在另一端进行删除数据的操作!
有先进先出的特性!
另外,其储存结构分为顺序的和链性的即分为顺序队列和链式队列
顺序队列有大量的缺陷,比如:要搬移大量元素,溢出或者假溢出!!
链式队列:一个特殊的单链表(具有头结点)
为了解决问题引入了循环队列
这里!!!!
只有链式队列的结构体以及一些基础操作!!
关于其他的结构,会在今后的时间里依次发出!!
关于链式队列
首先,给出队列的结构体
其中包含了 队头和队尾两个链表结构
typedef int DataType;
typedef struct ListNode //这里是链表结点的结构体
{
struct ListNode* _pNext;
DataType data;
}ListNode, *PListNode;
typedef struct Queue
{
PListNode _pHead; //队头
PListNode _pTail; //队尾
}Queue,*PQueue;
基本操作
//申请新结点
PListNode BuyNewNode(DataType data)
{
PListNode pNewNode = (PListNode)malloc(sizeof(ListNode));
pNewNode->_pNext = NULL;
pNewNode->data = data;
return pNewNode;
}
//初始化队列
void QueueInit(PQueue p)
{
assert(p);
PListNode pNewNode = BuyNewNode(0); //为队列申请一个头结点,不存放数据
p->_pHead = p->_pTail = pNewNode; //队头队尾均指向该结点
}
//入队列------>相当于链表尾插
void QueuePush(PQueue p, DataType data)
{
if (p == NULL) //参数检测
{
assert(0);
return;
}
PListNode pNewNode = BuyNewNode(data); //申请一个新结点
p->_pTail->_pNext = pNewNode; //尾插
p->_pTail = pNewNode; //更新队尾指针的指向
}
//出队列----->相当于头删
void Queuepop(PQueue p)
{
if (p == NULL) //参数检测
{
assert(0);
return;
}
PListNode pDelNode = NULL;
pDelNode = p->_pHead->_pNext; //将待删结点保存
p->_pHead->_pNext = pDelNode->_pNext; //更新队头指针指向
free(pDelNode); //释放待删除结点空间并且赋空
pDelNode = NULL;
}
//获取队列中元素个数
int QueueSize(Queue p)
{
PListNode pCur = NULL; //创建遍历指针
int count = 0; //创建计数器
pCur = p._pHead->_pNext;
while (pCur) //遍历整个队列
{
++count;
pCur = pCur->_pNext;
}
return count;
}
//判断队列是否为空
int QueueEmpty(Queue p)
{
return p._pHead == p._pTail ? 1 : 0;
}
//获取对头元素
DataType QueueFront(Queue p)
{
if (QueueEmpty(p)) //判空
{
printf("队列已空!!\n");
return 0;
}
return p._pHead->_pNext->data;
}
//获取队尾元素
DataType QueueTail(Queue p)
{
if (QueueEmpty(p))
{
printf("队列已空!!!\n");
return 0;
}
return p._pTail->data;
}
函数测试结果!!!!
最后!!!
1、我会在今后的时间里,将队列的一些内容补全!!
2、大家可以关注一下我这个小菜鸟!!
3、谢谢你们的观看!!