#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] 删除。