C语言实现队列(链表)

C语言实现队列

 

原理:

  • 通过单链表实现的队列,队列就是一个尾插头删的单链表,先实现一个链表 ,再实现一个队列包括队头指针队尾指针
  • C语言实现队列(链表)_第1张图片

头文件

#ifndef Queue_h
#define Queue_h

#include 

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 
#include 
#include 

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;
}

你可能感兴趣的:(数据结构)