链式队列基本操作的实现

直接上代码:

linkqueue.h

#pragma once

typedef char LinkQueueType;

typedef struct LinkQueueNode{
	LinkQueueType data;
	struct LinkQueueNode* next;
}LinkQueueNode;

typedef struct LinkQueue{
	LinkQueueNode* head;
	LinkQueueNode* tail;
}LinkQueue;
//初始化
void LinkQueueInit(LinkQueue* q);
//销毁
void LinkQueueDestroy(LinkQueue* q);
//入队列
void LinkQueuePush(LinkQueue* q,LinkQueueType value);
//出队列
void LinkQueuePop(LinkQueue* q);
//取队首元素
int LinkQueueFront(LinkQueue* q,LinkQueueType* value);

linkqueue.c

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

LinkQueueNode* CreateNode(LinkQueueType value){
	LinkQueueNode* new_node = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
	if(new_node == NULL){
		//申请内存失败
		printf("error\n");
		exit(-1);
	}
	new_node->data = value;
	new_node->next = NULL;
	return new_node;
}

void LinkQueueInit(LinkQueue* q){
	if(q == NULL){
		//非法输入
		return;
	}
	q->head = NULL;
	q->tail = NULL;
	return;
}

void LinkQueueDestroy(LinkQueue* q){
	if(q == NULL){
		return;
	}
	//循环释放链表结点
	LinkQueueNode* cur = q->head->next;
	while(cur!=NULL){
		LinkQueueNode* to_delete = cur;
		free(to_delete);
		cur = cur->next;
	}
	return;
}

void LinkQueuePush(LinkQueue* q,LinkQueueType value){
	if(q == NULL){
		return;
	}
	LinkQueueNode* new_node = CreateNode(value);
	if(q->head == NULL){
		//空队列
		q->head = q->tail = new_node;
	}
	//将新结点插入到尾指针之后,并更新尾指针
	q->tail->next = new_node;
	q->tail = new_node;
	q->tail->next = NULL;
	return;
}

void LinkQueuePop(LinkQueue* q){
	if(q == NULL){
		return;
	}
	if(q->head == NULL){
		//空队列
		return;
	}
	LinkQueueNode* cur = q->head;
	q->head = cur->next;
	free(cur);
	cur = NULL;
	return;
}

int LinkQueueFront(LinkQueue* q,LinkQueueType* value){
	if(q == NULL || value == NULL){
		return 0;
	}
	if(q->head == NULL){
		return 0;
	}
	*value = q->head->data;
	return 1;
}

test.c

#include <stdio.h>
#define TEST_HEADER printf("\n===================================%s=================================\n",__FUNCTION__)

void LinkQueuePrintChar(LinkQueue* q,const char* msg){
	printf("[%s]\n",msg);
	LinkQueueNode* cur = q->head;
	for(;cur!=NULL;cur=cur->next){
		printf("[%c] ",cur->data);
	}
	printf("\n");
}
void TestLinkQueue(){
	TEST_HEADER;
	LinkQueue queue;
	LinkQueueInit(&queue);
	LinkQueuePush(&queue,'a');
	LinkQueuePush(&queue,'b');
	LinkQueuePush(&queue,'c');
	LinkQueuePush(&queue,'d');

	LinkQueuePrintChar(&queue,"入队列四个元素");

	LinkQueueType value;
	int ret = LinkQueueFront(&queue,&value);
	printf("ret expected 1,actual %d\n",ret);
	printf("value expected a,actual %c\n",value);

	LinkQueuePop(&queue);
	LinkQueuePop(&queue);
	LinkQueuePrintChar(&queue,"出队列两个元素");
	LinkQueuePop(&queue);
	LinkQueuePop(&queue);
	LinkQueuePrintChar(&queue,"再出队列两个元素");
	LinkQueuePop(&queue);
	LinkQueuePrintChar(&queue,"尝试对空队列出队列");

}

int main(){
	TestLinkQueue();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值