这篇文章主要为大家详细介绍了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;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程学习网。
沃梦达教程
本文标题为:C语言实现链队列基本操作


猜你喜欢
- C语言qsort()函数的使用方法详解 2023-04-26
- C语言详解float类型在内存中的存储方式 2023-03-27
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- ubuntu下C/C++获取剩余内存 2023-09-18
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- Qt计时器使用方法详解 2023-05-30
- C++ 数据结构超详细讲解顺序表 2023-03-25
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- Easyx实现扫雷游戏 2023-02-06