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

C語言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的定義與實(shí)現(xiàn)

 更新時(shí)間:2022年07月04日 09:23:15   作者:MT_125  
隊(duì)列是一種特殊的線性表,特殊之處在于它只允許在表的前端(head)進(jìn)行刪除操作,而在表的后端(tail)進(jìn)行插入操作。本文將詳細(xì)講講C語言中隊(duì)列的定義與實(shí)現(xiàn),感興趣的可以了解一下

一、隊(duì)列的性質(zhì)

上次我們學(xué)習(xí)棧,了解到棧儲(chǔ)存釋放數(shù)據(jù)的方式是:先進(jìn)后出

而隊(duì)列與其相反,隊(duì)列是:先進(jìn)先出,后進(jìn)后出。

二、隊(duì)列的結(jié)構(gòu)

多個(gè)鏈表節(jié)點(diǎn) + 頭尾指針   (鏈表式隊(duì)列)

鏈表節(jié)點(diǎn)負(fù)責(zé)存儲(chǔ)數(shù)據(jù);頭節(jié)點(diǎn) 負(fù)責(zé)定位先進(jìn)的起始數(shù)據(jù),方便先出;

尾節(jié)點(diǎn)負(fù)責(zé)記錄尾部數(shù)據(jù),方便確定隊(duì)列當(dāng)前狀態(tài)。

三、代碼實(shí)現(xiàn)

頭文件

這里方便統(tǒng)一調(diào)用,將頭尾指針定義成一個(gè)結(jié)構(gòu)體 。 

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
 
typedef int Quetype;          //定義隊(duì)列的數(shù)據(jù)類型
 
typedef struct QueNode        //定義數(shù)據(jù)節(jié)點(diǎn)
{
    struct QueNode* Next;
    Quetype data;
}QueNode;
 
typedef struct Quetail        
{                         
    struct QueNode* head;     //定義頭尾指針
    struct QueNode* tail;
}Quetail;
 
void Que_Init(Quetail* pq);                //隊(duì)列的初始化
void Que_Destory(Quetail* pq);             //隊(duì)列的銷毀
void Que_push(Quetail* pq ,Quetype data);  //插入數(shù)據(jù)
void Que_pop(Quetail* pq);                 //刪除數(shù)據(jù)
bool Que_Empty(Quetail* pq);               //判斷隊(duì)列是否為空
int Que_size(Quetail* pq);                 //統(tǒng)計(jì)隊(duì)列長度
int Que_front(Quetail* pq);                //查找隊(duì)列的頭部數(shù)據(jù)

功能函數(shù)

1.隊(duì)列的初始化:

將頭尾指針置為NULL 方便后續(xù)使用。

void Que_Init(Quetail* pq)           //隊(duì)列的初始化
{
    assert(pq);
    pq->head = pq->tail = NULL;
}

2.插入數(shù)據(jù):

創(chuàng)建鏈表節(jié)點(diǎn) >> 導(dǎo)入數(shù)據(jù) >> 頭部指針指向頭節(jié)點(diǎn) >> 尾部指針指向尾節(jié)點(diǎn) 

//插入數(shù)據(jù)
void Que_push(Quetail* pq,Quetype data)
{ 
    assert(pq);
    QueNode* NewNode = (QueNode*)malloc(sizeof(QueNode));//創(chuàng)建節(jié)點(diǎn)
    if (NewNode == NULL)
    {
        printf("Que_push->malloc");
        exit(-1);
    }
    NewNode->Next = NULL;          
    NewNode->data = data;
    if (pq->head == NULL)         //判斷是否創(chuàng)建為頭節(jié)點(diǎn)
    {
        pq->head = NewNode;       //更新頭指針
    }
    else
    {
        pq->tail->Next = NewNode; //不為頭節(jié)點(diǎn),就正常鏈接在尾節(jié)點(diǎn)后
    }
    pq->tail = NewNode;           //更新尾指針
}

3.刪除數(shù)據(jù):

記錄頭節(jié)點(diǎn)的下一個(gè)位置 >> 判斷是否為最后的數(shù)據(jù) >> 更新頭指針

細(xì)節(jié)點(diǎn):如果隊(duì)列中還剩多個(gè)節(jié)點(diǎn)時(shí),刪除頭節(jié)點(diǎn)后,尾指針始終指向尾節(jié)點(diǎn),不需要改動(dòng);

但是如果只剩一個(gè)數(shù)據(jù)節(jié)點(diǎn)的話,刪除后需要將尾指針置空。

//刪除數(shù)據(jù)
void Que_pop(Quetail* pq)
{
    assert(pq);                       
    assert(!Que_Empty(pq));         //判斷隊(duì)列是否為空
    QueNode* Next = pq->head->Next; //記錄刪除數(shù)據(jù)的
 
    if (pq->head == pq->tail)       //判斷是否是最后的數(shù)據(jù)
    {
        free(pq->head);
        pq->tail = NULL;            //更新尾指針
    }
    else
    {
        free(pq->head);             
    }
    pq->head = Next;                //更新頭指針
}

4.判斷列表是否為空:

用bool 作為返回類型

//判斷隊(duì)列是否為空
bool Que_Empty(Quetail* pq)
{
    assert(pq);
    return pq->head == NULL;
}

5.查找隊(duì)列的頭部數(shù)據(jù):

判斷隊(duì)列是否為空 >> 返回頭部數(shù)據(jù)

//查找隊(duì)列的頭部數(shù)據(jù)
Quetype Que_front(Quetail* pq)
{
    assert(pq);
    assert(!Que_Empty(pq));    //判斷隊(duì)列是否為空
    return pq->head->data;     //返回頭部數(shù)據(jù)
}

6. 統(tǒng)計(jì)隊(duì)列的長度:

就是統(tǒng)計(jì)有多少個(gè)鏈表節(jié)點(diǎn)

int Que_size(Quetail* pq)
{
    assert(pq);
    int size;
    QueNode* pphead = pq->head;
    for (size = 0; pphead; pphead = pphead->Next, size++);
    return size;
}

7.隊(duì)列的銷毀:

依次刪除數(shù)據(jù) >> 將申請(qǐng)空間釋放

細(xì)節(jié)點(diǎn):這里可以進(jìn)行復(fù)用:判斷隊(duì)列是否為空 、 刪除數(shù)據(jù)

void Que_Destory(Quetail* pq)
{
    for (; !Que_Empty(pq); )  //判斷隊(duì)列是否為空
    {
        Que_pop(pq);          //刪除數(shù)據(jù)
    }
}

以上就是C語言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的定義與實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于C語言 隊(duì)列的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言詳解關(guān)鍵字sizeof與unsigned及signed的用法

    C語言詳解關(guān)鍵字sizeof與unsigned及signed的用法

    這篇文章主要為大家詳細(xì)介紹了C語言關(guān)鍵字sizeof&&unsigned&&signed,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • c++ 排查內(nèi)存泄漏的妙招

    c++ 排查內(nèi)存泄漏的妙招

    這篇文章主要介紹了c++ 如何用輔助類排查內(nèi)存泄漏,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-03-03
  • Opencv分水嶺算法學(xué)習(xí)

    Opencv分水嶺算法學(xué)習(xí)

    這篇文章主要為大家詳細(xì)介紹了Opencv分水嶺算法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++使用redis的實(shí)例詳解

    C++使用redis的實(shí)例詳解

    這篇文章主要介紹了C++使用redis的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C++下標(biāo)運(yùn)算符[]重載代碼示例

    C++下標(biāo)運(yùn)算符[]重載代碼示例

    這篇文章主要給大家介紹了關(guān)于C++下標(biāo)運(yùn)算符[]重載的相關(guān)資料,C++ 規(guī)定下標(biāo)運(yùn)算符[]必須以成員函數(shù)的形式進(jìn)行重載,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • C語言實(shí)現(xiàn)食堂就餐管理系統(tǒng)(帶鏈表)

    C語言實(shí)現(xiàn)食堂就餐管理系統(tǒng)(帶鏈表)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)食堂就餐管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Qt中線程常用通信方式介紹

    Qt中線程常用通信方式介紹

    Qt中,線程通信無處不在,最核心的特性信號(hào)槽就是一種線程間通信,這篇文章主要為大家介紹了幾種常用的方式,需要的小伙伴可以參考一下
    2025-01-01
  • 堆排序算法(選擇排序改進(jìn))

    堆排序算法(選擇排序改進(jìn))

    這篇文章主要介紹了堆排序算法(選擇排序改進(jìn)),有需要的朋友可以參考一下
    2014-01-01
  • C++中模板和STL介紹詳解

    C++中模板和STL介紹詳解

    今天小編就為大家分享一篇關(guān)于C++模板和STL的介紹,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2021-09-09
  • C語言中二維數(shù)組指針的簡要說明

    C語言中二維數(shù)組指針的簡要說明

    這篇文章主要介紹了C語言中二維數(shù)組指針的簡要說明,文章后也附送一個(gè)小練習(xí)題進(jìn)行鞏固,需要的朋友可以參考下
    2015-08-08

最新評(píng)論

四平市| 盐源县| 乐安县| 乌兰浩特市| 城口县| 报价| 临西县| 柳州市| 山丹县| 同德县| 五家渠市| 吉木乃县| 北票市| 中山市| 丰县| 澄江县| 永嘉县| 凉山| 磐安县| 台中县| 灵璧县| 嘉义市| 伊宁县| 拜泉县| 江阴市| 乌审旗| 石城县| 通河县| 临朐县| 余庆县| 台江县| 枣强县| 思南县| 白河县| 马关县| 兴安县| 栖霞市| 砀山县| 蒙自县| 龙口市| 宕昌县|