c語言——鏈表隊列的實現

c語言——鏈表隊列的實現

頭文件

#pragma once

#include<stdlib.h>

//節點類型定義
struct QueueNode
{
	struct QueueNode *next;
};

//隊列類型定義
struct LQueue
{
	struct QueueNode header; //頭結點
	int size;
	struct QueueNode *rear; //尾指針,始終指向鏈表的最後一個節點
};

typedef void* LinkQueue;


#ifdef __cplusplus
extern "C"{
#endif

	//初始化
	LinkQueue Init_LinkQueue();
	//入隊
	void Push_LinkQueue(LinkQueue queue, void *data);
	//出隊
	void Pop_LinkQueue(LinkQueue queue);
	//獲得隊頭元素
	void* Front_LinkQueue(LinkQueue queue);
	//獲得隊尾元素
	void* Back_LinkQueue(LinkQueue queue);
	//大小
	int Size_LinkQueue(LinkQueue queue);
	//銷燬隊列
	void Destroy_LinkQueue(LinkQueue queue);

#ifdef __cplusplus
}
#endif

操作文件

#include"LinkQueue.h"


//初始化
LinkQueue Init_LinkQueue()
{
	struct LQueue *queue = malloc(sizeof(struct LQueue));
	if (NULL == queue)
	{
		return NULL;
	}

	queue->header.next = NULL;
	queue->size = 0;
	queue->rear = &(queue->header);

	return queue;
}
//入隊
void Push_LinkQueue(LinkQueue queue, void *data)
{
	if (NULL == queue)
	{
		return;
	}

	if (NULL == data)
	{
		return;
	}


	struct LQueue *q = (struct LQueue *)queue;
	struct QueueNode *n = (struct QueueNode *)data;

	q->rear->next = n;
	n->next = NULL;
	//更新尾指針
	q->rear = n;

	q->size++;

}
//出隊
void Pop_LinkQueue(LinkQueue queue)
{
	if(NULL == queue)
	{
		return;
	}


	struct LQueue *q = (struct LQueue *)queue;
	
	if (q->size == 0)
	{
		return;
	}

	if (q->size == 1)
	{

		q->header.next = NULL;
		q->rear = &(q->header);//恢復尾指針
		q->size--;

		return;
	}

	struct QueueNode *pFirstNode = q->header.next;

	q->header.next = pFirstNode->next;

	q->size--;

}
//獲得隊頭元素
void* Front_LinkQueue(LinkQueue queue)
{
	if (NULL == queue)
	{
		return NULL;
	}

	struct LQueue *q = (struct LQueue *)queue;

	return q->header.next;
}
//獲得隊尾元素
void* Back_LinkQueue(LinkQueue queue)
{
	if (NULL == queue)
	{
		return NULL;
	}

	struct LQueue *q = (struct LQueue *)queue;

	return q->rear;
}
//大小
int Size_LinkQueue(LinkQueue queue)
{
	if (NULL == queue)
	{
		return -1;
	}

	struct LQueue *q = (struct LQueue *)queue;

	return q->size;
}
//銷燬隊列
void Destroy_LinkQueue(LinkQueue queue)
{
	if (NULL == queue)
	{
		return;
	}

	struct LQueue *q = (struct LQueue *)queue;
	q->header.next = NULL;
	q->rear = NULL;
	q->size = 0;

	free(queue);
	queue = NULL;
}

測試

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"LinkQueue.h"

struct Person
{
	struct QueueNode node;
	char name[64];
	int age;
};

void test()
{
	//初始化隊列
	LinkQueue queue = Init_LinkQueue();

	//創建數據
	struct Person p1 = { NULL, "aaa", 10 };
	struct Person p2 = { NULL, "bbb", 20 };
	struct Person p3 = { NULL, "ccc", 30 };
	struct Person p4 = { NULL, "ddd", 40 };
	struct Person p5 = { NULL, "eee", 50 };
	struct Person p6 = { NULL, "fff", 60 };

	//插入隊列
	Push_LinkQueue(queue, &p1);
	Push_LinkQueue(queue, &p2);
	Push_LinkQueue(queue, &p3);
	Push_LinkQueue(queue, &p4);
	Push_LinkQueue(queue, &p5);
	Push_LinkQueue(queue, &p6);


	struct Person *pBack = (struct Person *)Back_LinkQueue(queue);
	printf("隊尾元素:%s %d\n",pBack->name,pBack->age);

	while(Size_LinkQueue(queue) > 0)
	{
		//獲得隊頭元素
		struct Person *person = (struct Person *)Front_LinkQueue(queue);
		//打印隊頭元素
		printf("Name:%s Age:%d\n", person->name,person->age);
		//彈出隊頭元素
		Pop_LinkQueue(queue);
	}


	//銷燬隊列
	Destroy_LinkQueue(queue);

}

int main(){

	test();

	system("pause");
	return EXIT_SUCCESS;
}

運行

隊尾元素:fff 60
Name:aaa Age:10
Name:bbb Age:20
Name:ccc Age:30
Name:ddd Age:40
Name:eee Age:50
Name:fff Age:60
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章