C語言實現(xiàn)鏈隊列基本操作
更新時間:2021年09月23日 16:19:00 作者:似曾不相識
這篇文章主要為大家詳細介紹了C語言實現(xiàn)鏈隊列基本操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
隊列的鏈式存儲結(jié)構(gòu)實現(xiàn),相比于循環(huán)隊列實現(xiàn)要復雜一些,但是沒有隊滿的限制。
頭文件聲明
#include <stdio.h>
#include <stdlib.h>
/**
* 隊列的鏈式存儲實現(xiàn)
* [帶頭結(jié)點的單鏈表]
* [-類似于鏈棧,隊列的鏈式存儲實現(xiàn)也不會出現(xiàn)隊滿的情況]
*/
//數(shù)據(jù)類型
typedef int ElemType;
//定義節(jié)點
typedef struct SqQueueNode
{
ElemType data;//數(shù)據(jù)域
struct SqQueueNode* next; //指針域
}SqQueueNode;
//定義隊列
typedef struct SqQueueLink{
SqQueueNode* front;//隊頭指針
SqQueueNode* rear;//隊尾指針
}SqQueueLink;
//初始化隊列
void InitQueueLink(SqQueueLink* q);
//判斷隊空
int EmptyQueueLink(SqQueueLink q);
//入隊操作
void EnQueueLink(SqQueueLink *q,ElemType e);
//出隊操作
void DeQueueLink(SqQueueLink q,ElemType *e);
//獲取隊列長度
int LengthQueueLink(SqQueueLink q);
//打印隊列
void printSqQueueLink(SqQueueLink q);
//獲取隊頭元素
void GetHeadLink(SqQueueLink q,ElemType* e);
函數(shù)實現(xiàn)
#include "SqQueueLink.h"
//初始化隊列
void InitQueueLink(SqQueueLink* q){
//創(chuàng)建頭結(jié)點
SqQueueNode* pNode=(SqQueueNode*)malloc(sizeof(SqQueueNode));
pNode->next=NULL;//指針域置空[數(shù)據(jù)域不存儲任何內(nèi)容]
//初始化隊列-[使隊頭指針和隊尾指針指向頭結(jié)點]
q->front=pNode;
q->rear=pNode;
}
//判斷隊空
int EmptyQueueLink(SqQueueLink q){
return q.front==q.rear;
}
//入隊操作
void EnQueueLink(SqQueueLink *q,ElemType e){
//創(chuàng)建新的數(shù)據(jù)元素節(jié)點
SqQueueNode* newNode=(SqQueueNode*)malloc(sizeof(SqQueueNode));
newNode->data=e;//指定數(shù)據(jù)域
newNode->next=NULL;//指針域置空
//入隊操作[從隊尾入隊]
q->rear->next=newNode;
q->rear=newNode;
}
//出隊操作
void DeQueueLink(SqQueueLink q,ElemType *e){
//[從隊頭出隊]
SqQueueNode* p=NULL;
//是否隊空
if (q.front==q.rear)
return;
p=q.front->next;//獲取首節(jié)點
*e=p->data;
//使隊頭指針指向下一節(jié)點
q.front->next=p->next;
//如果原隊列中只有一個節(jié)點,要將隊尾指針和隊頭指針均指向同一節(jié)點-置空
if (q.rear==p)
q.rear=q.front;
//釋放原首節(jié)點
free(p);
}
//獲取隊列長度
int LengthQueueLink(SqQueueLink q){
//輔助指針
SqQueueNode* pNode=q.front->next;
int count=0;
//獲取隊列長度
while (pNode!=q.rear)
{
count++;
pNode=pNode->next;
}
return count;
}
//打印隊列
void printSqQueueLink(SqQueueLink q){
//輔助指針
SqQueueNode* p=q.front->next;
while (p!=q.rear)
{
printf("%4d",p->data);
p=p->next;
}
printf("\n");
}
//獲取隊頭元素
void GetHeadLink(SqQueueLink q,ElemType* e){
//判斷隊列是否為空
if (q.front==q.rear)
return;
//獲取隊頭元素的值
*e=q.front->next->data;
}
函數(shù)測試
#include "SqQueueLink.h"
int main(int argc,char** argv){
//聲明隊列
SqQueueLink sqLink;
int i;
ElemType data;
//初始化隊列
InitQueueLink(&sqLink);
//判斷隊列是否為空
printf("is Empty?%d\n",EmptyQueueLink(sqLink));
//入隊操作
for (i=0;i<=20;i++)
{
EnQueueLink(&sqLink,i+1);
}
//判斷隊列是否為空
printf("is Empty?%d,len=%d\n",EmptyQueueLink(sqLink),LengthQueueLink(sqLink));
//打印隊列
printSqQueueLink(sqLink);
//出隊列操作
DeQueueLink(sqLink,&data);
//判斷隊列是否為空
printf("is Empty?%d,len=%d\n",EmptyQueueLink(sqLink),LengthQueueLink(sqLink));
//打印隊列
printSqQueueLink(sqLink);
//獲取隊頭元素的值
GetHeadLink(sqLink,&data);
printf("the first node value is %d\n",data);
return 0;
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
探討:C++實現(xiàn)鏈式二叉樹(用非遞歸方式先序,中序,后序遍歷二叉樹)
本篇文章是對用C++實現(xiàn)鏈式二叉樹(用非遞歸方式先序,中序,后序遍歷二叉樹)的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05
C++/JAVA/C#子類調(diào)用父類函數(shù)情況總結(jié)
今天小編就為大家分享一篇關于C++/JAVA/C#子類調(diào)用父類函數(shù)情況總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
C語言之沒有main函數(shù)的helloworld示例
這篇文章主要介紹了C語言之沒有main函數(shù)的helloworld示例,本文分解了帶main函數(shù)的helloworld示例,從而分析出不需要main函數(shù)的helloworld示例,需要的朋友可以參考下2015-03-03
C++實現(xiàn)將數(shù)組中的值反轉(zhuǎn)
這里給大家分享的事一則C++實現(xiàn)將數(shù)組中的值反轉(zhuǎn)的代碼,取材自《C++程序設計》(梁勇著第三版367頁),有需要的小伙伴可以參考下2016-05-05

