【数据结构---17】C语言实现一个链表队列

Queue.h

#pragma once

typedef int QDataType;

typedef struct QNode
{
	 struct QNode* _pNext;
	 QDataType _data;
}QNode;

typedef struct Queue
{
	 QNode* _front; // 指向队头元素 
	 QNode* _back; // 指向队尾元素 
}Queue;

void QueueInit(Queue* q);

void QueuePush(Queue* q, QDataType data);

void QueuePop(Queue* q);

QDataType QueueFront(Queue* q);

QDataType QueueBack(Queue* q);

int QueueSize(Queue* q);

int QueueEmpty(Queue* q);

void QueueDestroy(Queue* q);

void QueueTest();

Queue.c

#include "queue.h"
#include <stdio.h>
#include <malloc.h>
#include <assert.h>

QNode* BuyNode(QDataType data)
{
	 QNode* newnode = (QNode*)malloc(sizeof(QNode));
	 if (newnode == NULL)
	 {
		  assert(0);
	 }
	 newnode->_data = data;
	 newnode->_pNext = NULL;
	 return newnode;
}

初始化操作:

void QueueInit(Queue* q)
{
	 assert(q);
	 q->_front = q->_back = NULL;
}

入队:

void QueuePush(Queue* q, QDataType data)
{
	 assert(q);
	 QNode* node = BuyNode(data);
	 if (q->_front == NULL )
	 {
		  q->_front = q->_back = node;
	 }
	 else
	 {
		  q->_back->_pNext = node;
		  q->_back = node;
	 }
}

出队:

void QueuePop(Queue* q)
{
	 assert(q);
	 if (q->_front == NULL)
	 {
		  return;
	 }
	 QNode* newhead = q->_front;
	 //队列中只有一个元素
	 if (q->_front->_pNext == NULL)
	 {
		  q->_front = q->_back = NULL;
	 }
	 else
	 {
		  q->_front = newhead->_pNext;
		  free(newhead);
		  newhead = NULL;
	 }
}

获取队头元素:

QDataType QueueFront(Queue* q)
{
	 if (q->_front == NULL)
	 {
		  return -1;
	 }
	 return q->_front->_data;
}

获取队尾元素:

QDataType QueueBack(Queue* q)
{
	 if (q->_front == NULL)
	 {
		  return -1;
	 }
	 return q->_back->_data;
}

查看当前元素个数:

int QueueSize(Queue* q)
{
	 QNode* pCur = q->_front;
	 int count = 0;
	 while (pCur != NULL)
	 {
		  pCur = pCur->_pNext;
		  count++;
	 }
	 return count;
}

检测队列是否为空:

int QueueEmpty(Queue* q)
{
	 if (q->_front == NULL)
	 {
		  return -1;
	 }
	 return 1;
}

销毁队列:

void QueueDestroy(Queue* q)
{
	 assert(q);
	 if (q->_front == NULL)
	 {
		  return;
	 }
	 QNode* pCur = q->_front;
	 while (pCur != NULL)
	 {
		  q->_front= pCur->_pNext;
		  free(pCur);
		  pCur = NULL;
		  pCur = q->_front;
	 }
	 q->_front = q->_back = NULL;
}

测试队列的实现:

void QueueTest()
{
	 Queue s;
	 QueueInit(&s);
	 QueuePush(&s, 1);
	 QueuePush(&s, 2);
	 QueuePush(&s, 3);
	 QueuePush(&s, 4);
	 
	//出队列
	 QueuePop(&s);
	 QueuePop(&s);
	 QueuePop(&s);
	 
	//查看当前元素个数
	 printf("size=%d\n",QueueSize(&s));
}

主函数:

int main()
{
	 QueueTest();
	 return 0;
}

代码运行测试图:

【数据结构---17】C语言实现一个链表队列
【数据结构---17】C语言实现一个链表队列
【数据结构---17】C语言实现一个链表队列