天天看點

隊列的鍊式存儲

隊列的鍊式存儲
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
//節點結構體
struct node
{
	//隻維護指針域
	node* next;
};
//隊列結構體
struct queue
{
	//頭節點
	node pheader;
	//隊列的長度
	int size;
	//記錄連結清單尾部的指針
	node* ptail;
};
//隐藏queue結構體,不讓使用者改變結構體内部的屬性-----class類裡面的private私有屬性
typedef void* linkQueue;
//隊列的初始化
linkQueue init_queue()
{
	//把隊列的結構體開辟到堆區
	queue* myqueue = (queue*)malloc(sizeof(queue));
	if (myqueue == NULL)
	{
		return NULL;
	}
	//初始化操作
	myqueue->pheader.next = NULL;
	myqueue->ptail = &myqueue->pheader;
	myqueue->size = 0;
	return myqueue;
}
//入隊:從隊尾插入
void push_queue(linkQueue que, void* data)
{
	if (que == NULL)
		return;
	if (data == NULL)
		return;
	queue* myqueue = (queue*)que;
	//用一個新節點來接收使用者輸入資料的指針域接口
	node* newNode = (node*)data;
	//尾插
	myqueue->ptail->next = newNode;
	newNode->next = NULL;
	myqueue->ptail = newNode;
	//更新長度
	myqueue->size++;
}
//出隊:頭删
void pop_queue(linkQueue que)
{
	if (que == NULL)
	{
		return;
	}

	queue* myqueue = (queue*)que;

	if (myqueue->size == 0)
	{
		return;
	}


	//這裡有一個特殊情況是隻有一個有效節點時進行删除操作,尾節點的位置應該要改變,重新指回頭節點
	if (myqueue->size == 1)
	{
		myqueue->pheader.next = NULL;
		myqueue->ptail = &myqueue->pheader;
		myqueue->size--;
		return;
	}


	//儲存住第一個節點的位置
	node* firstNode = myqueue->pheader.next;
	myqueue->pheader.next = firstNode->next;
	//free操作不需要,因為不清楚使用者的資料開辟在堆區還是棧區
	//更新長度
	myqueue->size--;
}
//傳回隊列的大小
int size_queue(linkQueue que)
{
	if (que == NULL)
		return -1;
	queue* myqueue = (queue*)que;
	return myqueue->size;
}
//判斷隊列是否為空
bool empty_queue(linkQueue que)
{
	if (que == NULL)
		return true;
	queue* myqueue = (queue*)que;
	if (myqueue->size == 0)
		return true;
	return false;
}
//傳回隊頭的元素
linkQueue top_queue(linkQueue que)
{
	if (que == NULL)
		return NULL;
	queue* myqueue = (queue*)que;
	return myqueue->pheader.next;
}
//傳回隊尾的元素
linkQueue back_queue(linkQueue que)
{
	if (que == NULL)
		return NULL;
	queue* myqueue = (queue*)que;
	return myqueue->ptail;
}
//銷毀隊列
void destory_queue(linkQueue que)
{
	if (que == NULL)
		return;
	free(que);
	que = NULL;
}

//測試------------------------------------------------
struct person
{
	//指針域接口
	void* next;
	char name[32];
	int age;
};
void test()
{
	person p1 = { NULL, "大忽悠",19 };
	person p2 = { NULL,"like",18 };
	person p3 = { NULL, "小朋友",19 };
	//初始化隊列
	linkQueue myqueue = init_queue();
	printf("隊列的鍊式存儲:\n");
	//入隊
	push_queue(myqueue, &p1);
	push_queue(myqueue, &p2);
	push_queue(myqueue, &p3);
	//傳回隊列的大小
	printf("隊列的大小:%d\n", size_queue(myqueue));
	//周遊
	while (empty_queue(myqueue) == false)
	{
		//通路隊頭
		person* pFront = (person*)top_queue(myqueue);
		printf("對頭元素: %s\t%d\n", pFront->name, pFront->age);
		//通路隊尾
		person* pBack = (person*)back_queue(myqueue);
		printf("對尾元素: %s\t%d\n", pBack->name, pBack->age);
		//出隊
		pop_queue(myqueue);
	}
	//銷毀隊列
	destory_queue(myqueue);
	//傳回隊列的大小
	printf("隊列的大小:%d\n", size_queue(myqueue));
}
int main()
{
	test();
	return 0;
}           

複制

隊列的鍊式存儲

本文參與 騰訊雲自媒體分享計劃 ,歡迎熱愛寫作的你一起參與!

本文分享自作者個人站點/部落格

https://blog.csdn.net/m0_53157173?spm=1011.2124.3001.5343

複制

如有侵權,請聯系 [email protected] 删除。