数据结构-链队列

供学习之用,参照他人理解学习

/*
队列先进先出,实际上创建了一个链表,由头指针,尾指针分别指向链表的头和尾,创建完成之后尾指针指向最后,头指针和尾指针操作同“一根”链(表)
1先进队列,也是出对列第一个
1 2 3 4 5 6 7 8 9 
2 3 4 5 6 7 8 9 
3 4 5 6 7 8 9 
4 5 6 7 8 9 
5 6 7 8 9 
6 7 8 9 
7 8 9
8 9 
9

*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define QElemType int
#define OVERFLOW -1

typedef struct QueueNode{
	QElemType data;
	struct QueueNode* pNext;
}QueueNode;

typedef struct LinkQueue{
	struct QueueNode* front;/*队列头指针*/
	struct QueueNode* rear;/*队列尾指针*/
}LinkQueue;

void Init_queue(LinkQueue* pQueue) // the first node is always NULL,recommend the next style
{
	pQueue->rear = pQueue->front = (QueueNode*)malloc(sizeof(QueueNode));
	if(pQueue->front == NULL)
	{
		printf("apply for memory failed!\n");
		exit(0);
	}
	pQueue->rear->pNext = NULL;
}

void InitQueue(LinkQueue* pQueue)
{
	pQueue->front = pQueue->rear = NULL;
}

void AddQueue(LinkQueue* pQueue,QElemType data)
{
	QueueNode* ptr = (QueueNode*)malloc(sizeof(QueueNode));	
	ptr->data = data;
	ptr->pNext = NULL;
	
	if(pQueue->front == NULL)
		pQueue->front = pQueue->rear = ptr;
	else
	{
		pQueue->rear->pNext = ptr;
		pQueue->rear = ptr;	
	}

}

void Dequeue(LinkQueue* pQueue)
{	
	if(pQueue->front == NULL)
	{
		printf("the queue is empty!\n");
		exit(0);
	}
	printf("dequeue data %d\n",pQueue->front->data);
	pQueue->front = pQueue->front->pNext;	
	
}

void DestroyQueue(LinkQueue* pQueue) 
{
	QueueNode* p = pQueue->front;
	while(!p)
	{
		pQueue->front = pQueue->rear;
		free(p);
		p = pQueue->front;
	}
	pQueue->rear = NULL;//free the last node
}

void ShowQueue(LinkQueue* pQueue)
{
	QueueNode* p = pQueue->front;
	while(p!= NULL)
	{
		printf("data %d \n",p->data);
		p = p->pNext;
	}
	printf("\n");
}

QElemType LengthQueue(LinkQueue* pQueue)
{
	int length = 0;
	QueueNode* p = pQueue->front;
	while(p != NULL)
	{
		length++;
		p = p->pNext;
	}
	return length;
}
int main()
{
	int i = 0;
	LinkQueue pQueue;
	InitQueue(&pQueue);
	for(i = 0; i < 10; i++)
		AddQueue(&pQueue,i);
	ShowQueue(&pQueue);   
	for(i = 0; i < 10; i++){
		Dequeue(&pQueue);
		printf("Now,the length is %d\n",LengthQueue(&pQueue));
		ShowQueue(&pQueue);
	}
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值