提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
前言
一、隊列
1.1隊列的概念及結構
二、隊列的實現(xiàn)
2.1頭文件的實現(xiàn)—Queue.h
2.2源文件的實現(xiàn)—Queue.c
2.3源文件的測試—test.c
三、測試隊列實際數(shù)據(jù)的展示
3.1正常隊列的出入
3.2入隊列的同時存在出隊列
總結
前言
世上有兩種耀眼的光芒,一種是正在升起的太陽,一種是正在努力學習編程的你!一個愛學編程的人。各位看官,我衷心的希望這篇博客能對你們有所幫助,同時也希望各位看官能對我的文章給與點評,希望我們能夠攜手共同促進進步,在編程的道路上越走越遠!
提示:以下是本篇文章正文內容,下面案例可供參考
一、隊列
1.1隊列的概念及結構
隊列:只允許在一端進行插入數(shù)據(jù)操作,在另一端進行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進先出FIFO(First In First Out)
入隊列:進行插入操作的一端稱為隊尾
出隊列:進行刪除操作的一端稱為隊頭
二、隊列的實現(xiàn)
隊列(先進先出)有三種實現(xiàn)方案:數(shù)組、單向鏈表、雙向鏈表
數(shù)組:隊列是對尾入,對頭出,但是數(shù)組尾插還可以,但是頭刪還得挪動數(shù)據(jù),所以非常不方便的
單鏈表:單鏈表尾插入隊列方便,頭刪也方便
2.1頭文件的實現(xiàn)—Queue.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int QDataType;
typedef struct QueueNode
{
QDataType val;
struct QueueNode* next;
}QNode;
//尾入(*單向鏈表,我們要找尾,進行尾插,所以我們需要把頭節(jié)點和尾節(jié)點的指針傳進來,
//但是要進行頭刪,得頻繁改變第一個節(jié)點得地址,所以我們得用二級指針,這樣就更麻煩了)
//void QueuePush(QNode* phead,QNode* ptail, QDataType x);
頭出
//void QueuePop(QNode* phead);
typedef struct Queue
{
QNode* phead;
QNode* ptail;
int size;
}Queue;
//尾入(我們把第一個節(jié)點和尾節(jié)點放入一個結構體中,
//然后可以改變結構體成員,就可以實現(xiàn)第一個節(jié)點地址的頻繁的更換)
void QueuePush(Queue* pq, QDataType x);
//頭出
void QueuePop(Queue* pq);
//初始化
void QueueInit(Queue* pq);
//銷毀
void QueueDestroy(Queue* pq);
//取隊頭的數(shù)據(jù)
QDataType QueueFront(Queue* pq);
//取隊尾的數(shù)據(jù)
QDataType QueueBack(Queue* pq);
//獲取隊列中有效元素個數(shù)
int QueueSize(Queue* pq);
//檢測隊列是否為空,如果為空返回非零結果,如果非空返回0
bool QueueEmpty(Queue* pq);
2.2源文件的實現(xiàn)—Queue.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "queue.h"
//尾入(我們把第一個節(jié)點和尾節(jié)點放入一個結構體中,
//然后可以改變結構體成員,就可以實現(xiàn)第一個節(jié)點地址的頻繁的更換)
void QueuePush(Queue* pq, QDataType x)
{
assert(pq);
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)
{
perror("malloc fail");
return;
}
newnode->val = x;
newnode->next = NULL;
if (pq->ptail == NULL)
{
pq->phead = pq->ptail = newnode;
}
else
{
pq->ptail->next = newnode;
pq->ptail = newnode;
}
pq->size++;
}
//頭出
void QueuePop(Queue* pq)
{
assert(pq);
//如果只剩一個節(jié)點的時候,phead往后走,此時ptail就是野指針
assert(pq->phead);
QNode* del = pq->phead;
pq->phead = pq->phead->next;
free(del);
del = NULL;
if (pq->phead == NULL)
{
pq->ptail = NULL;
}
pq->size--;
}
//初始化
void QueueInit(Queue* pq)
{
assert(pq);
pq->phead = pq->ptail = NULL;
pq->size = 0;
}
//銷毀
void QueueDestroy(Queue* pq)
{
assert(pq);
QNode* cur = pq->phead;
while (cur)
{
QNode* next = cur->next;
free(cur);
cur = next;
}
pq->phead = pq->ptail = NULL;
}
//取隊頭的數(shù)據(jù)
QDataType QueueFront(Queue* pq)
{
assert(pq);
assert(pq->phead);
return pq->phead->val;
}
//取隊尾的數(shù)據(jù)
QDataType QueueBack(Queue* pq)
{
assert(pq);
assert(pq->ptail);
return pq->ptail->val;
}
//獲取隊列中有效元素個數(shù)
int QueueSize(Queue* pq)
{
assert(pq);
return pq->size;
}
//檢測隊列是否為空,如果為空返回非零結果,如果非空返回0
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->phead == NULL;
}
2.3源文件的測試—test.c
#include "queue.h"
int main()
{
Queue q;
QueueInit(&q);
QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePush(&q, 5);
while (!QueueEmpty(&q))
{
printf("%d ", QueueFront(&q));
QueuePop(&q);
}
QueueDestroy(&q);
return 0;
}
三、測試隊列實際數(shù)據(jù)的展示
1、出入隊列的方式:隊尾插入數(shù)據(jù),對頭刪除數(shù)據(jù)
2、出隊列和入隊列的關系:一對一的
3.1正常隊列的出入
3.2入隊列的同時存在出隊列
文章來源:http://www.zghlxwxcb.cn/news/detail-766073.html
總結
好了,本篇博客到這里就結束了,如果有更好的觀點,請及時留言,我會認真觀看并學習。
不積硅步,無以至千里;不積小流,無以成江海。文章來源地址http://www.zghlxwxcb.cn/news/detail-766073.html
到了這里,關于【數(shù)據(jù)結構—隊列的實現(xiàn)】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!