最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言結構及隊列實現(xiàn)示例詳解

 更新時間:2023年12月22日 08:48:08   作者:Hhh_灝  
這篇文章主要為大家介紹了C語言實現(xiàn)隊列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

1.隊列的概念及結構

隊列:

只允許一端插入數(shù)據(jù),另一端刪除數(shù)據(jù)的特殊線性表

先進先出FIFO(First In First Out)

入隊列:

進行插入操作的一端稱為隊尾

出隊列:

進行刪除操作的一端稱為隊頭

2. 隊列的實現(xiàn)

隊列也可以數(shù)組和鏈表的結構實現(xiàn),使用鏈表的結構實現(xiàn)更優(yōu)一些,因為如果使用數(shù)組的結構,出隊列在數(shù)組頭上出數(shù)據(jù),效率會比較低。

DFS---深度優(yōu)先遍歷 -- 遞歸/棧實現(xiàn)非遞歸

BFS---廣度優(yōu)先遍歷 -- 隊列

// 鏈式結構:表示隊列
#pragma once
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
typedef int QDatatype;
typedef struct QueueNode
{
    QDatatype data;
    struct QueueNode* next;
}QNode;
typedef struct Queue
{
    QNode* phead;
    QNode* ptail;
    int size;
}Queue;
//初始化隊列
void QueueInit(Queue* pq);
//隊尾入隊列
void QueuePush(Queue* pq , QDatatype x);
//隊頭出隊列
void QueuePop(Queue* pq);
//獲取隊頭元素
QDatatype QueueFront(Queue* pq);
//獲取隊尾元素
QDatatype QueueBack(Queue* pq);
//隊列大小
int QueueSize(Queue* pq);
//判斷隊列是否為空
bool QueueEmpty(Queue* pq);
//銷毀隊列
void QueueDestory(Queue* pq);
#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
//初始化隊列
void QueueInit(Queue* pq)
{
    assert(pq);
    pq->phead = NULL;
    pq->ptail = NULL;
    pq->size = 0;
}
//銷毀隊列
void QueueDestory(Queue* pq)
{
    QNode* cur = pq->phead ;
    while (cur)
    {
        /*QNode* tmp = cur;
        cur = cur->next;
        free(tmp);*/
        QNode* next = cur->next;
        free(cur);
        cur = next;
    }
    pq->phead = pq->ptail = NULL;
    pq->size = 0;
}
//隊尾入隊列
void QueuePush(Queue* pq, QDatatype x)
{
    assert(pq);
    QNode* newnode = (QNode*)malloc(sizeof(QNode));
    if (newnode == NULL)
    {
        perror("malloc");
        return;
    }
    newnode->data = x;
    newnode->next = NULL;
    if (pq->phead == NULL)//isEmpty
    {
        assert(pq->ptail==NULL);
        pq->phead = newnode;
        pq->ptail = newnode;
    }
    else
    {
        pq->ptail->next = newnode;
        pq->ptail = newnode;
    }
    pq->size++;
}
//判斷隊列是否為空
bool QueueEmpty(Queue* pq)
{
    assert(pq);
    return pq->size == 0;
    //return pq->phead == NULL && pq->ptail == NULL;
}
//隊頭出隊列
void QueuePop(Queue* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));//assert(pq->phead != NULL);
    //1、一個節(jié)點
    //2、多個節(jié)點
    if (pq->phead->next == NULL)//一個節(jié)點要注意ptail別弄成野指針
    {
        free(pq->phead);
        pq->phead = pq->ptail = NULL;
    }
    else
    {
        Queue* next = pq->phead->next;
        free(pq->phead);
        pq->phead = next;
    }
    pq->size--;
}
//獲取隊頭元素
QDatatype QueueFront(Queue* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));
    return pq->phead->data;
}
//獲取隊尾元素
QDatatype QueueBack(Queue* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));
    return pq->ptail->data;
}
//隊列大小
int QueueSize(Queue* pq)
{
    assert(pq);
    return pq->size;
}
//測試
#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
void TestQueue()
{
    Queue q;
    QueueInit(&q);
    QueuePush(&q, 1);
    QueuePush(&q, 2);
    QueuePush(&q, 3);
    QueuePush(&q, 4);
    //QueuePop(&q);
    //QueuePop(&q);
    //QueuePop(&q);
    //while (!QueueEmpty(&q))
    //{
    //    printf("%d ", QueueFront(&q));
    //    
    //    QueuePop(&q);
    //}
    printf("\n"); 
    //printf("%d ", QueueFront(&q));
    //printf("%d ", QueueSize(&q));
    //QueuePop(&q);
    printf("%d ", QueueBack(&q));
    printf("%d ", QueueBack(&q));
    printf("%d ", QueueBack(&q));
    QueueDestory(&q);
}
int main()
{
    TestQueue();
    return 0;
}

以上就是C語言結構及隊列實現(xiàn)示例詳解的詳細內(nèi)容,更多關于C語言結構隊列的資料請關注腳本之家其它相關文章!

相關文章

  • C/C++內(nèi)存管理之new與delete的使用及原理解析

    C/C++內(nèi)存管理之new與delete的使用及原理解析

    這篇文章主要介紹了C/C++內(nèi)存管理之new與delete的使用及原理解析,本文通過實例代碼圖文相結合給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • C++實例講解引用的使用

    C++實例講解引用的使用

    引用是C++一個很重要的特性,顧名思義是某一個變量或?qū)ο蟮膭e名,對引用的操作與對其所綁定的變量或?qū)ο蟮牟僮魍耆葍r,這篇文章主要給大家總結介紹了C++中引用的相關知識點,需要的朋友可以參考下
    2022-05-05
  • C/C++實現(xiàn)對STORM運行信息查看及控制的方法

    C/C++實現(xiàn)對STORM運行信息查看及控制的方法

    這篇文章主要介紹了C/C++實現(xiàn)對STORM運行信息查看及控制的方法,需要的朋友可以參考下
    2014-07-07
  • C語言中#pragma的用法及使用解讀

    C語言中#pragma的用法及使用解讀

    這篇文章主要介紹了C語言中#pragma的用法及使用解讀,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-10-10
  • C++中detach的作用、使用場景及注意事項

    C++中detach的作用、使用場景及注意事項

    關于C++中的detach,它主要涉及多線程編程中的線程管理,理解detach的作用、使用場景以及注意事項,對于寫出高效、安全的多線程程序至關重要,下面給大家介紹C++中detach的相關知識,感興趣的朋友一起看看吧
    2025-07-07
  • 詳解C++ new-handler機制

    詳解C++ new-handler機制

    這篇文章主要介紹了C++ new-handler機制的相關資料,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2020-11-11
  • C++可以函數(shù)重載而C不可以的原因分析

    C++可以函數(shù)重載而C不可以的原因分析

    函數(shù)重載是指在同一個作用域內(nèi),可以定義多個函數(shù),它們具有相同的名稱但是參數(shù)列表不同,為什么C++可以函數(shù)重載而C不可以,接下來就有小編來給大家介紹一下C++可以函數(shù)重載而C不可以的原因,需要的朋友可以參考下
    2023-12-12
  • C語言數(shù)據(jù)結構創(chuàng)建及遍歷十字鏈表

    C語言數(shù)據(jù)結構創(chuàng)建及遍歷十字鏈表

    這篇文章主要介紹了C語言數(shù)據(jù)結構十字鏈表的創(chuàng)建及遍歷,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-10-10
  • QT5?Thread線程的具體實現(xiàn)

    QT5?Thread線程的具體實現(xiàn)

    本文主要介紹了QT5?Thread線程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C語言技巧提升之回調(diào)函數(shù)的掌握

    C語言技巧提升之回調(diào)函數(shù)的掌握

    這篇文章主要為大家詳細介紹一下C語言中回調(diào)函數(shù)的用法教程,文中的示例代碼講解詳細,對我們學習C語言有一定幫助,需要的可以參考一下
    2022-12-12

最新評論

深州市| 利辛县| 龙南县| 鄄城县| 溧阳市| 陇西县| 通许县| 鸡泽县| 英山县| 巨鹿县| 崇阳县| 莫力| 如皋市| 晴隆县| 凌海市| 东莞市| 印江| 肃北| 永春县| 景泰县| 清水河县| 海口市| 吴堡县| 平乡县| 台安县| 荆州市| 方城县| 和平县| 廉江市| 奉节县| 昌都县| 山阴县| 通州区| 澎湖县| 台南市| 白水县| 石嘴山市| 衡阳县| 石首市| 界首市| 韶山市|