数据结构-------队列基本操作

队列的概念

一种特殊的线性结构! 只允许在一端进行插入数据的操作,在另一端进行删除数据的操作!
先进先出的特性!
另外,其储存结构分为顺序的和链性的即分为顺序队列和链式队列

顺序队列有大量的缺陷,比如:要搬移大量元素,溢出或者假溢出!!
链式队列:一个特殊的单链表(具有头结点)

为了解决问题引入了循环队列

这里!!!!
只有链式队列的结构体以及一些基础操作!!
关于其他的结构,会在今后的时间里依次发出!!

关于链式队列

首先,给出队列的结构体
其中包含了 队头队尾两个链表结构

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张图片

最后!!!

1、我会在今后的时间里,将队列的一些内容补全!!
2、大家可以关注一下我这个小菜鸟!!
3、谢谢你们的观看!!
数据结构-------队列基本操作_第2张图片

你可能感兴趣的:(学习笔记)