C语言实现链队列基本操作

 更新时间:2021年09月23日 16:19:00   作者:似曾不相识  
这篇文章主要为大家详细介绍了C语言实现链队列基本操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

队列的链式存储结构实现,相比于循环队列实现要复杂一些,但是没有队满的限制。

头文件声明

#include <stdio.h>
#include <stdlib.h>

/**
 * 队列的链式存储实现
 * [带头结点的单链表]
 * [-类似于链栈,队列的链式存储实现也不会出现队满的情况]
 */
//数据类型
typedef int ElemType;

//定义节点
typedef struct SqQueueNode
{
 ElemType data;//数据域
 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);

函数实现

#include "SqQueueLink.h"


//初始化队列
void InitQueueLink(SqQueueLink* q){
 //创建头结点
 SqQueueNode* pNode=(SqQueueNode*)malloc(sizeof(SqQueueNode));
 pNode->next=NULL;//指针域置空[数据域不存储任何内容]
 //初始化队列-[使队头指针和队尾指针指向头结点]
 q->front=pNode;
 q->rear=pNode;
}

//判断队空
int EmptyQueueLink(SqQueueLink q){
 return q.front==q.rear;
}

//入队操作
void EnQueueLink(SqQueueLink *q,ElemType e){
 //创建新的数据元素节点
 SqQueueNode* newNode=(SqQueueNode*)malloc(sizeof(SqQueueNode));
 newNode->data=e;//指定数据域
 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;//获取首节点
 *e=p->data;
 //使队头指针指向下一节点
 q.front->next=p->next;
 //如果原队列中只有一个节点,要将队尾指针和队头指针均指向同一节点-置空
 if (q.rear==p)
  q.rear=q.front;
 //释放原首节点
 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;
}

函数测试

#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;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • QT实现FTP上传文件

    QT实现FTP上传文件

    这篇文章主要为大家详细介绍了QT实现FTP上传文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 使用map实现单词转换的实例分析

    使用map实现单词转换的实例分析

    本篇文章是对使用map实现单词转换的代码实例进行了纤细的分析介绍,需要的朋友参考下
    2013-05-05
  • 探讨:C++实现链式二叉树(用非递归方式先序,中序,后序遍历二叉树)

    探讨:C++实现链式二叉树(用非递归方式先序,中序,后序遍历二叉树)

    本篇文章是对用C++实现链式二叉树(用非递归方式先序,中序,后序遍历二叉树)的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++/JAVA/C#子类调用父类函数情况总结

    C++/JAVA/C#子类调用父类函数情况总结

    今天小编就为大家分享一篇关于C++/JAVA/C#子类调用父类函数情况总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 详解C++语言中的加法运算符与赋值运算符的用法

    详解C++语言中的加法运算符与赋值运算符的用法

    这篇文章主要介绍了C++语言中的加法运算符与赋值运算符的用法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • C语言新手初阶教程之三子棋实现

    C语言新手初阶教程之三子棋实现

    相信大家在小时候都用纸和笔与小伙伴们玩过一个经典的游戏之井字棋,即三子棋,下面这篇文章主要给大家介绍了关于C语言新手初阶教程之三子棋实现的相关资料,需要的朋友可以参考下
    2022-01-01
  • C语言百行代码绘制圣诞水晶球

    C语言百行代码绘制圣诞水晶球

    今天就是圣诞节了,本文将再教大家一个圣诞项目——圣诞水晶球,今天这个呢代码不多,但难度会有点。感兴趣的小伙伴可以跟随小编一起学习学习
    2021-12-12
  • C语言之没有main函数的helloworld示例

    C语言之没有main函数的helloworld示例

    这篇文章主要介绍了C语言之没有main函数的helloworld示例,本文分解了带main函数的helloworld示例,从而分析出不需要main函数的helloworld示例,需要的朋友可以参考下
    2015-03-03
  • C++模拟实现vector示例代码图文讲解

    C++模拟实现vector示例代码图文讲解

    这篇文章主要介绍了C++容器Vector的模拟实现,Vector是一个能够存放任意类型的动态数组,有点类似数组,是一个连续地址空间,下文更多详细内容的介绍,需要的小伙伴可以参考一下
    2023-02-02
  • C++实现将数组中的值反转

    C++实现将数组中的值反转

    这里给大家分享的事一则C++实现将数组中的值反转的代码,取材自《C++程序设计》(梁勇著第三版367页),有需要的小伙伴可以参考下
    2016-05-05

最新评论