链队列

//链队列  
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct QNode 
{
	int data;
	struct QNode *next;
}QNode,*QueuePtr;

typedef struct LinkQueue
{
	QueuePtr front, rear;
}LinkQueue;

bool InitQueue(LinkQueue *q); //队列的初始化
void QueueEmpty(LinkQueue q); //判断队列是否为空
int QueueLength(LinkQueue q); //求队列长度
bool EnQueue(LinkQueue *q,int e);//插入元素e 为q的新的队尾元素
bool QueueTraverse(LinkQueue *q); //输出队列元素
bool GetHead(LinkQueue q,int *e); //输出队头元素
bool DeQueue(LinkQueue *q,int *e); //删除队头元素,并将队头元素赋给e
bool ClearQueue(LinkQueue *q); //清空队列
bool DestoryQueue(LinkQueue *q); //销毁队列

int main()
{
	int d, length;
	int val; //删除的队头元素
	int h; //队头元素
	LinkQueue q;
	InitQueue(&q);
	if(InitQueue(&q))
		printf("成功地构造了一个空队列!\n");
	QueueEmpty(q); //判断队列是否为空
	length = QueueLength(q);
	printf("队列的长度为%d\n",length);
	EnQueue(&q,-5);  //插入队头元素
	EnQueue(&q,5);  
	EnQueue(&q,10);

	length = QueueLength(q); //队列元素的长度
	printf("队列的长度为%d\n",length);
	QueueEmpty(q); //判断队列是否为空

	printf("队列元素依次为: ");
	QueueTraverse(&q); //输出队列各个元素
	
	GetHead(q,&h); //得到队头元素
	printf("队头元素h = %d\n",h);
	
	DeQueue(&q,&d);
	printf("删除的队头元素d = %d\n",d);

	GetHead(q,&h);
	printf("队头元素h = %d\n",h);

	ClearQueue(&q);
	printf("清空队列后:q.front = %d q.rear = %d q.front->next = %d\n",q.front,q.rear,q.front->next);
	DestoryQueue(&q);
	printf("销毁队列后 q.front = %d q.rear = %d\n",q.front,q.rear);
	return 0;
}

bool InitQueue(LinkQueue *q)//队列的初始化
{
	q->front = (QueuePtr)malloc(sizeof(QNode));
	if(q->front == NULL)
	{
		printf("内存分配失败 程序终止");
		exit(-1);
	}
	q->rear = q->front;
	q->front->next = NULL;
	return true;
}

void QueueEmpty(LinkQueue q)//判断队列是否为空
{
	if(q.front == q.rear)
		printf("队列为空!\n");
	else
		printf("队列不为空!\n");
}

int QueueLength(LinkQueue q)//求队列长度
{
	int i = 0;
	QueuePtr p;
	p = q.front;
	while(q.rear != p)
	{
		i++;
		p = p->next;
	}
	return i;
}

bool EnQueue(LinkQueue *q,int e)//插入元素e 为q的新的队尾元素
{
	QueuePtr p;
	p = (QueuePtr)malloc(sizeof(QNode));
	if(p == NULL)
	{
		printf("内存分配失败,程序终止!\n");
		exit(-1);
	}
	p->data = e;
	p->next= NULL;
	q->rear->next = p;
	q->rear = p;
	return true;
}

bool QueueTraverse(LinkQueue *q) //输出队列元素
{
	QueuePtr p;
	p = q->front->next;
	while(p != NULL)
	{
		printf("%d  ",p->data);
		p = p->next;
	}
	printf("\n");
	return true;
}

bool GetHead(LinkQueue q,int *e) //输出队头元素
{
	QueuePtr p;
	if(q.front == q.rear)
		return false;
	p = q.front->next;
	*e = p->data;
	return true;
}

bool DeQueue(LinkQueue *q,int *e) //删除队头元素,并将队头元素赋给e
{
	QueuePtr p;
	if(q->front == q->rear)
		return false;
	p = q->front->next;
	*e = p->data;
	q->front->next = p->next;
	
	if(q->rear == p)		 //一般情况下 删除队列头元素时仅需修改头结点中的指针 
		q->rear = q->front; //但当队列中最后一个元素被删除后 队列尾指针也丢失了,依次需要对队尾指针重新赋值(指向头结点)
	
	free(p);		
	return true;
}

bool ClearQueue(LinkQueue *q) //清空队列
{
	QueuePtr m, n;
	q->rear = q->front;
	m = q->front->next;
	q->front->next = NULL;
	while(m != NULL)
	{
		n = m;
		m = m->next;
		free(n);
	}
	return true;
}

bool DestoryQueue(LinkQueue *q) //销毁队列
{  //销毁时,无论空否,均可销毁
	while(q->front)
	{
		q->rear = q->front->next;
		free(q->front);
		q->front = q->rear;
	}
	return true;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值