链式队列

//main.c

#include "LinkQueue.h"
#include <stdio.h>
#include <stdlib.h>


void main()
{
	LinkQueue lq;
	ElementType e;
	InitQueue(&lq);

	printf("入栈\n");
	for(int i = 0; i <= 10; i++)
		EnQueue(&lq, i);

	printf("队列大小为%d\n", length(lq));

	printf("显示\n");
	Show(lq);

	if (GetTop(lq, &e))
		printf("队头元素为%d\n", e);

	printf("出栈\n");
	for(int j = 0; j < 9; j++)
		DeQueue(&lq);

	printf("队列大小为%d\n", length(lq));

	printf("显示\n");
	Show(lq);

	if( GetTop(lq, &e) )
		printf("队头元素为%d\n", e);

	printf("清除\n");
	Clear(&lq);

	printf("摧毁\n");
	Destroy(&lq);

	system("pause");
}


//LinkQueue.h

#ifndef _LINKQUEUE_H_
#define _LINKQUEUQ_H_

#include <stdbool.h>

typedef int ElementType;

typedef struct QueueNode
{
	ElementType data;
	struct QueueNode *next;
}QueueNode;

typedef struct LinkQueue
{
	QueueNode *first;
	int		   size;
	QueueNode *last;
}LinkQueue;

bool InitQueue(LinkQueue *lq);
bool EnQueue(LinkQueue *lq, ElementType e);
bool DeQueue(LinkQueue *lq);
void Show(LinkQueue lq);
bool GetTop(LinkQueue lq, ElementType *e);
int length(LinkQueue lq);
void Clear(LinkQueue *lq);
void Destroy(LinkQueue *lq);

#endif //_LINKQUEUE_H_



//LinkQueue.c
#include "LinkQueue.h"
#include <stdio.h>
#include <stdlib.h>

static QueueNode *CreateNode(ElementType e)
{
	QueueNode *p = (QueueNode *)malloc(sizeof(QueueNode));
	if( NULL != p )
	{
		p->next = NULL;
		p->data = e;
	}
	return p;
}

bool InitQueue(LinkQueue *lq)
{
	QueueNode *p = CreateNode(-1);
	if( NULL == p )
		return false;
	
	lq->first = lq->last = p;
	lq->size = 0;

	return true;
}

bool EnQueue(LinkQueue *lq, ElementType e)
{
	QueueNode *p = CreateNode(e);
	if( NULL == p )
		return false;

	lq->last->next = p;
	lq->last = p;
	lq->size++;

	return true;
}

bool DeQueue(LinkQueue *lq)
{
	if( lq->first == lq->last )
	{
		printf("队列为空\n");
		return false;
	}

	QueueNode *p = lq->first->next;
	lq->first->next = p->next;
	if( NULL == p->next )			//p为最后一个节点
	{
		lq->last = lq->first;		//令尾指针指向头结点
	}
	free(p);
	lq->size--;

	return true;
}

void Show(LinkQueue lq)
{
	QueueNode *p = lq.first->next;
	while(NULL != p)
	{
		printf("%d\n", p->data);
		p = p->next;
	}
}

bool GetTop(LinkQueue lq, ElementType *e)
{
	if( NULL == lq.first->next )
	{
		printf("队列为空\n");
		return false;
	}
	*e = lq.first->next->data;
	return true;
}

int length(LinkQueue lq)
{
	return lq.size;
}

void Clear(LinkQueue *lq)
{
	if( NULL == lq->first->next )
	{
		return ;
	}

	QueueNode *p = lq->first->next;
	while( NULL != p)
	{
		lq->first->next = p->next;
		free(p);
		p = lq->first->next;
	}
	lq->size = 0;
}

void Destroy(LinkQueue *lq)
{
	Clear(lq);
	free(lq->first);
	lq->first = lq->last = NULL;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值