队列的入队,出队等操作

队列的特点:先进先出。这种规则在我们生活中屡见不鲜。比如:中午吃饭时的窗口前排队,火车过隧道,各种业务办理排队等等。如果谁插队,大家就会向他(她)投向愤怒,鄙视的目光。甚至可能展开一场弥漫火药的战争。所以还是不要插队,否则后果很严重。

这就意味着队列只能在队尾增加数据,只能在队头删除数据。

由于队列的特点,如果用顺序表来实现时间复杂度会变成O(n),所以我采用链表的方式来实现队列。时间复杂度O(1)

代码如下:

//队列特点:先进先出

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

//队列的数据别名
#define DataType int

//定义队列类型
typedef struct Queue
{
	DataType data;
	struct Queue* next;
}Queue;

//1.创建结点
Queue* CreateQueueNode(DataType data);

//2.初始化
void InitQueue(Queue* Quptr);

//3.出队列
void DelQueueNode(Queue* Quptr);

//4.入队列
void AddQueueNode(Queue* Quptr, DataType data);

//5.销毁队列
void DestoryQueueNode(Queue* Quptr);

//6.打印队列
void PrintQueue(Queue* Quptr);
#include"Queue.h"

//1.创建结点
Queue* CreateQueueNode(DataType data)
{
	Queue* ptr = (Queue*)malloc(sizeof(Queue));
	ptr->data = data;
	ptr->next = NULL;
	return ptr;
}

//2.初始化
void InitQueue(Queue* Quptr)
{
	assert(Quptr);
	Quptr->data = 0;
	Quptr->next = NULL;
}

//3.出队列
void DelQueueNode(Queue* Quptr)
{
	assert(Quptr);
	if (Quptr->next == NULL)
	{
		return;
	}
	Queue* ptr = Quptr->next;
	Quptr->next = ptr->next;
	free(ptr);
	ptr = NULL;
}

//4.入队列
void AddQueueNode(Queue* Quptr, DataType data)
{
	assert(Quptr);
	Queue* pos = CreateQueueNode(data);
	Queue* ptr = Quptr->next;
	if (ptr != NULL)
	{
		while (ptr->next != NULL)
		{
			ptr = ptr->next;
		}
		ptr->next = pos;
	}
	else
	{
		Quptr->next = pos;
	}
}

//5.销毁队列
void DestoryQueueNode(Queue* Quptr)
{
	assert(Quptr);
	while (Quptr->next != NULL)
	{
		DelQueueNode(Quptr);
	}
}

//6.打印队列
void PrintQueue(Queue* Quptr)
{
	assert(Quptr);
	Queue* ptr = Quptr->next;
	if (ptr == NULL)
	{
		printf("空链表\n");
	}
	else
	{
		while (ptr != NULL)
		{
			printf("<-- %d ", ptr->data);
			ptr = ptr->next;
		}
		printf("\n");
	}
}
#include"Queue.h"

void Test()
{
	Queue* QPtr = (Queue*)malloc(sizeof(Queue));
	InitQueue(QPtr);

	//入队列
	AddQueueNode(QPtr, 5);
	PrintQueue(QPtr);
	AddQueueNode(QPtr, 6);
	PrintQueue(QPtr);
	AddQueueNode(QPtr, 7);
	PrintQueue(QPtr);
	AddQueueNode(QPtr, 8);
	PrintQueue(QPtr);
	AddQueueNode(QPtr, 9);
	PrintQueue(QPtr);

	//出队列
	DelQueueNode(QPtr);
	PrintQueue(QPtr);
	DelQueueNode(QPtr);
	PrintQueue(QPtr);

	//销毁队列
	DestoryQueueNode(QPtr);
	PrintQueue(QPtr);
}

int main()
{
	Test();
	system("pause");
	return 0;
}

结果显示:

<-- 5
<-- 5 <-- 6
<-- 5 <-- 6 <-- 7
<-- 5 <-- 6 <-- 7 <-- 8
<-- 5 <-- 6 <-- 7 <-- 8 <-- 9
<-- 6 <-- 7 <-- 8 <-- 9
<-- 7 <-- 8 <-- 9
空链表
请按任意键继续. . .
 

在实现队列中我采用的是头结点的方式操作队列,头指针当然也可以。           

                                                                                                                                                   珍&源码