链式队列的实现

#include <stdio.h>
#include <stdlib.h>
typedef int QElemType;
typedef int Status;
typedef struct QNode{
	QElemType data;
	struct QNode*next;
}QNode,*QueuePtr;
typedef struct{
	QueuePtr front;  //队头指针,始终指向头结点
	QueuePtr rear; //队尾指针,指向最后一个结点
	int num;
}LinkQueue;
Status InitQueue(LinkQueue *s){
	QueuePtr umi=(QueuePtr)malloc(sizeof(QNode));
	s->front = s->rear = umi;
	s->front->next = NULL;//将头指针置空
	s->num = 0;
	return 1;
}
Status ClearQueue(LinkQueue *umi){		//将队列清空
	if (umi->front == umi->rear){
		printf("Empty!\n");
		return 0;
	}
	QueuePtr p;
	p = umi->front->next;
	while (umi->front != umi->rear){
		umi->front = p->next;
		free(p);
		p = umi->front;
	}
	umi->front = 0;
	return 1;
}
Status QueueEmpty(LinkQueue *umi){	    //若队列为空返回1否则返回0
	int yuki = 0;
	if (!QueueLength(umi)){
		yuki = 1;
}
	return yuki;
}
Status QueueLength(LinkQueue *umi){		//返回队列的长度
	return umi->num;
}
Status GetHead(LinkQueue *umi){			//返回队头元素
	return umi->front->next->data;
}
Status EnQueue(LinkQueue *umi,QElemType e){			//插入元素e为队尾元素
	QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
	s->data = e;
	s->next = NULL;
	umi->rear->next = s;
	umi->rear = s;
	umi->num++;
	return 1;
}
Status DeQueue(LinkQueue *umi,QElemType *e){			//删除队头元素,并用e返回其值
	if (umi->front == umi->rear){
		printf("Empty!\n");
		return 0;
	}
	QueuePtr p;
	p = umi->front->next;
	*e = p->data;
	umi->front->next = p->next;
	if (umi->rear == p) //若删去了最后一个元素,队尾指针指向头结点
		umi->rear = umi->front;
	free(p);
	umi->num--;
	return 1;
}
Status QueueTraverse(LinkQueue *umi){		//从队头到队尾进行访问
	if (QueueEmpty(umi)){
		printf("Empty!\n");
		return 0;
	}
	QueuePtr p=umi->front->next;
	while (p){
		printf("%d\n", p->data);
		p = p->next;
	}
	return 1;
}
int main(){
	LinkQueue L;
	int a;
	InitQueue(&L);
	EnQueue(&L, 1);
	DeQueue(&L, &a);
	QueueTraverse(&L);
	/*if (QueueEmpty(&L)){
		printf("Empty!");
	}
	else printf("Several");*/
}

在写出队列的代码实现后,我回忆起了与链表的相似性,正如老师所说,学会了链表之后,对于其余链式数据结构就有了更清楚的认识,写起来也更简单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值