国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語言實現(xiàn)隊列--數(shù)據(jù)結(jié)構(gòu)

這篇具有很好參考價值的文章主要介紹了C語言實現(xiàn)隊列--數(shù)據(jù)結(jié)構(gòu)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

C語言實現(xiàn)隊列--數(shù)據(jù)結(jié)構(gòu)
C語言實現(xiàn)隊列--數(shù)據(jù)結(jié)構(gòu)

????????????????????????Take your time ! ????????????????????????
??個人主頁:??????大魔王??????
??所屬專欄:??魔王的修煉之路–數(shù)據(jù)結(jié)構(gòu)??
如果你覺得這篇文章對你有幫助,請在文章結(jié)尾處留下你的點贊??和關(guān)注??,支持一下博主。同時記得收藏?這篇文章,方便以后重新閱讀。


前言

隊列介紹:只允許在一端進行插入數(shù)據(jù)操作,在另一端進行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進后出FIFQ(First In First Out)入隊列:進行插入操作的一端稱為隊尾。出隊列:進行刪除操作的一端稱為隊頭。

C語言實現(xiàn)隊列--數(shù)據(jù)結(jié)構(gòu)

代碼實現(xiàn)

1、創(chuàng)建結(jié)構(gòu)體

對于隊列,需要創(chuàng)建兩個結(jié)構(gòu)體,第一個為結(jié)點的結(jié)構(gòu)體,第二個是記錄隊列頭、尾及元素個數(shù)的結(jié)構(gòu)體,因為隊列在入隊時相當于尾插,如果不記錄尾結(jié)點,需要一直遍歷,這樣效率低,所以在操作后直接記錄尾結(jié)點,記錄個數(shù)是因為方便其他函數(shù)操作,比如需要個數(shù)時,直接訪問這個成員就行了,不需要再遍歷一遍看看有幾個,對于隊列是否為空,也不需要判斷指針是否為空,直接判斷個數(shù)就行了。

代碼實現(xiàn):

#pragma once


#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

typedef int QDataType;

typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;//目的:要個數(shù)時,不需要遍歷一遍,直接就能知道有幾個。
}Queue;

2、初始化結(jié)構(gòu)體

剛開始時怎樣創(chuàng)建?是創(chuàng)建一個結(jié)構(gòu)體指針然后接收在函數(shù)里開辟一塊空間返回的結(jié)構(gòu)體指針還是直接創(chuàng)建一個結(jié)構(gòu)體,我們這里選擇直接創(chuàng)建一個結(jié)構(gòu)體,因為這個不像單鏈表一樣,如果單鏈表沒有元素,那么就是空,就沒有結(jié)點一說,這個直接就一定不是空,因為我們操作的不是結(jié)點的結(jié)構(gòu)體,而是記錄隊列的結(jié)構(gòu)體,所以它永遠不會是空,就不需要弄一個結(jié)構(gòu)體指針再接收之類的操作了。

void QInit(Queue* q)
{
	assert(q);
	q->head = q->tail = NULL;
	q->size = NULL;
}

3、銷毀

用完就需要銷毀,防止內(nèi)存泄漏。

void QDestroy(Queue* q)
{
	assert(q);
	while (q->head)
	{
		Queue* next = q->head->next;
		free(q->head);
		q->head = next;
	}
	q->tail = NULL;//防止野指針
	q->size = 0;
}

4、創(chuàng)建新結(jié)點

入隊列時需要創(chuàng)建新結(jié)點。

QNode* BuyNewnode(QDataType x)
{
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)//檢測是否開辟成功
	{
		perror("malloc error");
		assert(newnode);
	}
	newnode->data = x;
	newnode->next = NULL;
}

5、入隊列

就像最開始的那個圖一樣,入隊列相當于尾插。

//從后面進入,算是尾插。
void QPush(Queue* q, QDataType x)
{
	assert(q);
	QNode* newnode = BuyNewnode(x);
	if (q->head == NULL)//如果本來沒有元素,需要讓首尾指針都賦上這個結(jié)點;如果有元素,就管尾指針就行。
	{
		assert(q->head == q->tail);
		q->head = q->tail = newnode;
	}
	else
	{
		q->tail->next = newnode;
		q->tail = newnode;
	}
	q->size++;
}

6、出隊列

相當于頭刪。

//從前面出,算是頭刪。
void QPop(Queue* q)
{
	assert(q);
	assert(q->head && q->tail);//出隊列時隊列不能為空,如果不為空,那么首尾指針肯定都不為空。
	if (q->head->next == NULL)判斷是否只有一個結(jié)點,如果只有一個,尾指針也要指向空,不然就會變成野指針。
	{
		assert()q->head==q->tail);//如果只有一個結(jié)點,那么首尾結(jié)點肯定相等。
		free(q->head);
		q->head = q->tail = NULL;
	}
	else
	{
		QNode* newhead = q->head->next;
		free(q->head);
		q->head = newhead;
	}
	q->size--;
}

7、隊列成員個數(shù)

直接返回結(jié)構(gòu)體里的size就行。

int QSize(Queue* q)
{
	assert(q);
	//int size = 0;
	//QNode* cur = q->head;
	//while (cur)
	//{
	//	cur = cur->next;
	//	size++;
	//}
	//return size;
	return q->size;
}

8、隊列是否為空

直接判斷size就行。

bool QEmpty(Queue* q)
{
	assert(q);
	return q->size == 0;
}

9、隊列最前面的元素數(shù)據(jù)

需要判斷是否為空。如果為空就不能訪問,不然越界。

QDataType QFront(Queue* q)
{
	assert(q);
	assert(q->head);
	return q->head->data;
}

10、隊列最后面的元素數(shù)據(jù)

需要判斷隊列是否為空,如果為空就不能訪問,不然越界。

QDataType QBack(Queue* q)
{
	assert(q);
	assert(q->tail);
	return q->tail->data;
}

總代碼

Queue.h

Queue.h

#pragma once


#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

typedef int QDataType;

typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;//目的:要個數(shù)時,不需要遍歷一遍,直接就能知道有幾個。
}Queue;

void QInit(Queue* q);

void QDestroy(Queue* q);

void QPush(Queue* q,QDataType x);

void QPop(Queue* q);

int QSize(Queue* q);

bool QEmpty(Queue* q);

QDataType QFront(Queue* q);

QDataType QBack(Queue* q);

Queue.c

Queue.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "Queue.h"

void QInit(Queue* q)
{
	assert(q);
	q->head = q->tail = NULL;
	q->size = NULL;
}

void QDestroy(Queue* q)
{
	assert(q);
	while (q->head)
	{
		Queue* next = q->head->next;
		free(q->head);
		q->head = next;
	}
	q->tail = NULL;//防止野指針
	q->size = 0;
}

QNode* BuyNewnode(QDataType x)
{
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)//檢測是否開辟成功
	{
		perror("malloc error");
		assert(newnode);
	}
	newnode->data = x;
	newnode->next = NULL;
}

//從后面進入,算是尾插。
void QPush(Queue* q, QDataType x)
{
	assert(q);
	QNode* newnode = BuyNewnode(x);
	if (q->head == NULL)//如果本來沒有元素,需要讓首尾指針都賦上這個結(jié)點;如果有元素,就管尾指針就行。
	{
		assert(q->head == q->tail);
		q->head = q->tail = newnode;
	}
	else
	{
		q->tail->next = newnode;
		q->tail = newnode;
	}
	q->size++;
}

//從前面出,算是頭刪。
void QPop(Queue* q)
{
	assert(q);
	assert(q->head && q->tail);//出隊列時隊列不能為空,如果不為空,那么首尾指針肯定都不為空。
	if (q->head->next == NULL)//判斷是否只有一個結(jié)點,如果只有一個,尾指針也要指向空,不然就會變成野指針。
	{
		assert(q->head == q->tail);//如果只有一個結(jié)點,那么首尾結(jié)點肯定相等。
		free(q->head);
		q->head = q->tail = NULL;
	}
	else
	{
		QNode* newhead = q->head->next;
		free(q->head);
		q->head = newhead;
	}
	q->size--;
}

int QSize(Queue* q)
{
	assert(q);
	//int size = 0;
	//QNode* cur = q->head;
	//while (cur)
	//{
	//	cur = cur->next;
	//	size++;
	//}
	//return size;
	return q->size;
}

bool QEmpty(Queue* q)
{
	assert(q);
	return q->size == 0;
}

QDataType QFront(Queue* q)
{
	assert(q);
	assert(q->head);
	return q->head->data;
}

QDataType QBack(Queue* q)
{
	assert(q);
	assert(q->tail);
	return q->tail->data;
}

Test.c

//測試隊列
#define _CRT_SECURE_NO_WARNINGS 1

#include "Queue.h"


void print(Queue* q)
{
	while (!QEmpty(q))
	{
		printf("%d ", QFront(q));
		QPop(q);
	}
}

int main()
{
	Queue q;
	QInit(&q);
	QPush(&q, 0);
	QPush(&q, 1);
	QPush(&q, 2);
	QPush(&q, 3);
	QPush(&q, 4);
	QPush(&q, 5);
	QPop(&q);
	QPop(&q);


	print(&q);
	QDestroy(&q);
	return 0;
}

總結(jié)

結(jié)尾

  • 博主長期更新,博主的目標是不斷提升閱讀體驗和內(nèi)容質(zhì)量,如果你喜歡博主的文章,請點個贊或者關(guān)注博主支持一波,我會更加努力的為你呈現(xiàn)精彩的內(nèi)容。

??專欄推薦
??魔王的修煉之路–C語言
??魔王的修煉之路–數(shù)據(jù)結(jié)構(gòu)初階
??魔王的修煉之路–C++
??魔王的修煉之路–Linux
更新不易,希望得到友友的三連支持一波。收藏這篇文章,意味著你將永久擁有它,無論何時何地,都可以立即找到重新閱讀;關(guān)注博主,意味著無論何時何地,博主將永久和你一起學習進步,為你帶來有價值的內(nèi)容。

C語言實現(xiàn)隊列--數(shù)據(jù)結(jié)構(gòu)文章來源地址http://www.zghlxwxcb.cn/news/detail-451017.html

到了這里,關(guān)于C語言實現(xiàn)隊列--數(shù)據(jù)結(jié)構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)-隊列(C語言的簡單實現(xiàn))

    數(shù)據(jù)結(jié)構(gòu)-隊列(C語言的簡單實現(xiàn))

    隊列也是一種數(shù)據(jù)結(jié)構(gòu),隊列也可以用來存放數(shù)字 每次只能向隊列里將入一個數(shù)字,每次只能從隊列里獲得一個數(shù)字 在隊列中,允許插入的一段稱為入隊口,允許刪除的一段稱為出隊口 它的原則是先進先出(FIFO: first in first out),先進入隊列的數(shù)據(jù)先出去,后進入的后出去。

    2024年02月13日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)-隊列的實現(xiàn)(C語言版)

    數(shù)據(jù)結(jié)構(gòu)-隊列的實現(xiàn)(C語言版)

    前言 ? ? ? ? 隊列是一種特殊的線性表,它只允許在一端對數(shù)據(jù)進行插入操作,在另一端對數(shù)據(jù)進行刪除操作的特殊線性表,隊列具有先進先出的(FIFO)的?特性,進行插入操作的一端稱為隊尾,進行刪除操作的一端稱為隊頭。 ? ? ? ? 隊尾:元素在隊尾入隊。插入操作。

    2024年02月13日
    瀏覽(18)
  • 【數(shù)據(jù)結(jié)構(gòu)初階】六、線性表中的隊列(C語言 -- 鏈式結(jié)構(gòu)實現(xiàn)隊列)

    【數(shù)據(jù)結(jié)構(gòu)初階】六、線性表中的隊列(C語言 -- 鏈式結(jié)構(gòu)實現(xiàn)隊列)

    ========================================================================= 相關(guān)代碼gitee自取 : C語言學習日記: 加油努力 (gitee.com) ?========================================================================= 接上期 : 【數(shù)據(jù)結(jié)構(gòu)初階】五、線性表中的棧(C語言 -- 順序表實現(xiàn)棧)_高高的胖子的博客-CSDN博客 ?

    2024年02月08日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)初階(用C語言實現(xiàn)簡單數(shù)據(jù)結(jié)構(gòu))--棧和隊列

    數(shù)據(jù)結(jié)構(gòu)初階(用C語言實現(xiàn)簡單數(shù)據(jù)結(jié)構(gòu))--棧和隊列

    ??歡迎來到T_X_Parallel的博客??! ?????????博客主頁:T_X_Parallel ?????????專欄 : 數(shù)據(jù)結(jié)構(gòu)初階 ?????????歡迎關(guān)注:??點贊??收藏??留言 這小貓真好看 言歸正傳,通過上篇有關(guān)順序表和鏈表的博客,可以了解到線性表的一些大致特征,這篇博

    2024年02月08日
    瀏覽(25)
  • (詳解)數(shù)據(jù)結(jié)構(gòu)-----------棧與隊列 c語言實現(xiàn)

    (詳解)數(shù)據(jù)結(jié)構(gòu)-----------棧與隊列 c語言實現(xiàn)

    本章將會詳細講解以下知識點: 目錄 一:棧 ? ? ? ? 1:棧的定義,棧的特點 ? ? ? ? 2:用什么結(jié)構(gòu)來實現(xiàn)棧與原因的分析? ? ? ? ??3:? (超詳解)棧的常用接口并且附上測試用例 二:隊列 ? ? ? ? 1:隊列的定義,隊列的特點 ? ? ? ? 2:用什么結(jié)構(gòu)來實現(xiàn)隊列與原因的分析

    2024年02月11日
    瀏覽(23)
  • 入門數(shù)據(jù)結(jié)構(gòu),c語言實現(xiàn)循環(huán)隊列實現(xiàn)(詳細篇)。

    入門數(shù)據(jù)結(jié)構(gòu),c語言實現(xiàn)循環(huán)隊列實現(xiàn)(詳細篇)。

    目錄 一、前言 二、循環(huán)隊列的概念 三、實現(xiàn)循環(huán)隊列 1、頭文件與特殊函數(shù)介紹 2、循環(huán)隊列的結(jié)構(gòu)體 3、隊列的初始化 4、判斷隊列是否為空 5、隊列的進隊操作 6、隊列的出隊操作 7、返回隊頭 8、返回隊列長度 9、放回隊列容量大小 10、銷毀隊列 四、完成隊列(隊列完整代

    2024年02月06日
    瀏覽(18)
  • 【數(shù)據(jù)結(jié)構(gòu)】隊列基本操作的實現(xiàn)(C語言)

    【數(shù)據(jù)結(jié)構(gòu)】隊列基本操作的實現(xiàn)(C語言)

    ?? 作者簡介:一名在后端領(lǐng)域?qū)W習,并渴望能夠?qū)W有所成的追夢人。 ?? 個人主頁:蝸牛牛啊 ?? 系列專欄:??數(shù)據(jù)結(jié)構(gòu)、??C++ ?? 學習格言:博觀而約取,厚積而薄發(fā) ?? 歡迎進來的小伙伴,如果小伙伴們在學習的過程中,發(fā)現(xiàn)有需要糾正的地方,煩請指正,希望能夠與

    2024年02月16日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)入門(C語言版)棧和隊列之隊列的介紹及實現(xiàn)

    數(shù)據(jù)結(jié)構(gòu)入門(C語言版)棧和隊列之隊列的介紹及實現(xiàn)

    什么是隊列呢?我們先看下面的圖: 我們可以理解成高速公路上的隧道,根據(jù)這個圖的描述 我們把需入隊的元素看作一輛車,把隊列看作隧道,由此我們可以看出 隊列的特點是 只允許從一端進入,從另一端離開。 隊列就是只允許在一端進行插入數(shù)據(jù)操作,在另一端進行刪

    2023年04月15日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)】詳談隊列的順序存儲及C語言實現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】詳談隊列的順序存儲及C語言實現(xiàn)

    大家好,很高興又和大家見面啦!?。?在上一篇內(nèi)容中,我們在介紹完隊列的基本概念、重要術(shù)語以及基本操作后,又回顧了一下數(shù)據(jù)結(jié)構(gòu)的三要素——數(shù)據(jù)的邏輯結(jié)構(gòu)、數(shù)據(jù)的存儲結(jié)構(gòu)以及數(shù)據(jù)的運算。 隊列這種數(shù)據(jù)結(jié)構(gòu)我們已經(jīng)介紹了它的邏輯結(jié)構(gòu)以及數(shù)據(jù)運算的定義

    2024年01月21日
    瀏覽(25)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】 C語言實現(xiàn)單鏈表隊列詳解

    【算法與數(shù)據(jù)結(jié)構(gòu)】 C語言實現(xiàn)單鏈表隊列詳解

    前面我們學習了隊列的順序表的實現(xiàn),本節(jié)將用單鏈表實現(xiàn)隊列。 隊列也可以數(shù)組和鏈表的結(jié)構(gòu)實現(xiàn), 使用鏈表的結(jié)構(gòu)實現(xiàn)更優(yōu)一些,因為如果使用數(shù)組的結(jié)構(gòu),出隊列在數(shù)組頭上出數(shù)據(jù),效率會比較低 。下面我們先復習一下隊列的基本概念: 隊列:只允許在一端進行插入

    2024年04月11日
    瀏覽(94)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包