C语言实现链队列

LinkQueue.h

#pragma once

#define ElemType char
#define ERROR -1
#define OVERFLOW -2

typedef struct QueueNode{
	ElemType data;
	struct QueueNode* next;
} Node,*PNode;

typedef struct {
	PNode front;//队列头节点
	PNode rear;//队尾元素
}Queue;

//初始化队列
void InitQueue(Queue& Q);
//销毁队列
void DestroyQueue(Queue& Q);
//清空队列
void ClearQueue(Queue& Q);
//判断队列是否为空
bool QueueEmpty(Queue Q);
//获取队列长度
int QueueLength(Queue Q);
//获取队首元素
ElemType GetHead(Queue Q);
//入队
void EnQueue(Queue& Q, ElemType e);
//出队
void DeQueue(Queue& Q, ElemType& e);
//遍历队列
void QueueTraverse(Queue Q, void(*f)(ElemType e));

LinkQueue.cpp

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

//初始化队列
void InitQueue(Queue& Q) {
	//添加头节点
	Q.front = (Node*)malloc(sizeof(Node));
	Q.rear = Q.front;
}
//销毁队列
void DestroyQueue(Queue& Q) {
	ClearQueue(Q);
	free(Q.front);
	Q.front = Q.rear = NULL;
}
//清空队列
void ClearQueue(Queue& Q) {
	char e;
	while (!QueueEmpty(Q)) {
		DeQueue(Q, e);
	}
}
//判断队列是否为空
bool QueueEmpty(Queue Q) {
	return Q.rear == Q.front ? true:false;
}
//获取队列长度
int QueueLength(Queue Q) {
	PNode cur = Q.front;
	int len = 0;
	while (cur!=Q.rear)
	{
		len++;
		cur = cur->next;
	}
	return len;
}
//获取队首元素
ElemType GetHead(Queue Q) {
	if (QueueEmpty(Q)) {
		return NULL;
	}
	return Q.front->next->data;
}
//入队
void EnQueue(Queue& Q, ElemType e) {
	PNode NewNode = (Node*)malloc(sizeof(Node));
	if (!NewNode) exit(OVERFLOW);
	NewNode->data = e;
	NewNode->next = NULL;
	Q.rear->next = NewNode;
	Q.rear = NewNode;
}
//出队
void DeQueue(Queue& Q, ElemType& e) {
	if (QueueEmpty(Q)) exit(ERROR);
	PNode cur = Q.front->next;
	e = cur->data;
	Q.front->next = cur->next;
	if (Q.rear == cur) Q.rear = Q.front;//如果当前出队元素是最有一个元素,将队尾指针指向队首节点
	free(cur);
}
//遍历队列
void QueueTraverse(Queue Q, void(*f)(ElemType e)) {
	PNode cur = Q.front;
	while (cur != Q.rear)
	{
		f(cur->next->data);
		cur = cur->next;
	}
	printf("\nqueue length:%d\n",QueueLength(Q));
}

main.cpp(用于测试)

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

#define EN "en"
#define DE "de"
#define GET "get"
#define EXIT "exit"

void PrintQueue(ElemType e) {
	printf("%c\n",e);
}

int main() {
	char opt[5],e=NULL;
	Queue queue;
	InitQueue(queue);
	while (true)
	{
		gets_s(opt, 5);
		if (strcmp(opt, EN) == 0) {
			printf("wait for input:");
			EnQueue(queue, getchar());
			getchar();
		}
		else if (strcmp(opt, DE)==0) {
			DeQueue(queue,e);
			printf("DE:%c\n", e);
		}
		else if (strcmp(opt,GET)==0)
		{	
	
			printf("GET:%c\n", GetHead(queue));
		}
		else if (strcmp(opt, EXIT)==0) {
			DestroyQueue(queue);
			break;
		}
		else {
			printf("unkonw operation\n");
			continue;
		}
		printf("queue:\n");
		QueueTraverse(queue,PrintQueue);
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值