文章目录
⭐️写在前面的话⭐️
📒博客主页: 程序员好冰
🎉欢迎 【点赞👍 关注🔎 收藏⭐️ 留言📝】
📌本文由 程序员好冰 原创,CSDN 首发!
📆入站时间: 🌴2022 年 07 月 13 日🌴
✉️ 是非不入松风耳,花落花开只读书。
💭推荐书籍:📚《Java编程思想》,📚《Java 核心技术卷》
💬参考在线编程网站:🌐牛客网🌐力扣
🍭 作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!🍭
队列的链式存储结构
0、自定义声明
需要定义两个结构体
一个表示单个结点的结构,数据和下一个结点的地址
另一个表示整个队列,队头和队尾结点
#include <stdio.h>
#include <stdlib.h>
//链队的实现
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode;
typedef struct LinkQueue
{
LNode *front;//front是头结点,不存放元素
LNode *rear;
}LinkQueue;
1、初始化链队
初始链队,队头和队尾均指向头结点
并置 L->front->next=NULL;
Status InitQueue(LinkQueue *L)
{
L->front=(LNode*)malloc(sizeof(LNode));
L->rear=L->front;
if(!L->front){
printf("初始化失败.\n");
return ERROR;
}
L->front->next=NULL;
printf("初始化队列成功.\n");
return OK;
}
2、判断队列是否为空
front和rear指向同一个位置,又因为front不存放元素,说明队列为空
Status QueueEmpty(LinkQueue L)
{
if(L.front==L.rear){
printf("队列为空.\n");
return OK;
}
printf("队列不为空.\n");
return ERROR;
}
3、队列的长度
从队头遍历到队尾
Status QueueLength(LinkQueue L)
{
int i=0;
LNode *p;
p=L.front;
while(L.rear!=p){
i++;
p=p->next;
}
printf("队列的长度为%d.\n",i);
return OK;
}
4、清空队列
清空队列可以分为两步:
将遍历队列中的每个元素,并释放
将队头和队尾结点初始化
Status ClearQueue(LinkQueue *L)
{
LNode *temp;
while(!L->front->next){
temp=L->front->next;
L->front->next=temp->next;
free(temp);
}
L->rear=L->front;
L->front->next=NULL;
printf("队列清空成功.\n");
return OK;
}
5、入队
从队尾插入元素
Status EnQueue(LinkQueue *L,ElemType e)
{
LNode *s=(LNode*)malloc(sizeof(LNode));
if(!s){
printf("初始化结点失败.\n");
return ERROR;
}
s->data=e;
L->rear->next=s;
s->next=NULL;
L->rear=s;
printf("元素%d入队成功.\n",e);
return OK;
}
7、销毁队列
先清空,再释放。
Status DestroyQueue(LinkQueue *L)
{
ClearQueue(L);
free(L);
return OK;
}
8、获取队头元素
Status GetHead(LinkQueue L)
{
if(QueueEmpty(L)){
return ERROR;
}
printf("队头元素为:%d.\n",L.front->next->data);
return OK;
}
9、出队
从队头删除元素
ElemType DeQueue(LinkQueue *L)
{
if(QueueEmpty(*L)){
return ERROR;
}
printf("队头元素%d出队成功.\n",L->front->next->data);
LNode *p;
p=L->front->next;
L->front->next=p->next;
//处理最后一个元素出队的情况
if(L->rear==p){
L->rear=L->front;
}
free(p);
return OK;
}
10、打印队列中所有元素
//队列先进先出,先打印队头元素
Status PrintfQueue(LinkQueue L)
{
if(QueueEmpty(L)){
return ERROR;
}
printf("队列为:");
LNode *p;
p=L.front->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
return OK;
}
主函数
int main()
{
LinkQueue L;
int input;
int value;
printf("请继续操作...\n");
while(1){
printf("\n==========================\n");
printf("1、初始化循环队列.\n");
printf("2、销毁队列.\n");
printf("3、清空队列.\n");
printf("4、判断队列是否为空.\n");
printf("5、获得队头元素.\n");
printf("6、插入队尾元素.\n");
printf("7、删除队头元素.\n");
printf("8、返回队列中元素个数.\n");
printf("9、打印队列中所有元素.\n");
printf("\n==========================\n");
printf("请输入对应操作的序号:");
scanf("%d",&input);
switch(input){
case 1:
InitQueue(&L);
break;
case 2:
DestroyQueue(&L);
break;
case 3:
ClearQueue(&L);
break;
case 4:
QueueEmpty(L);
break;
case 5:
GetHead(L);
break;
break;
case 6:
printf("请输入需要入队的元素:");
scanf("%d",&value);
EnQueue(&L,value);
break;
case 7:
DeQueue(&L);
break;
case 8:
QueueLength(L);
break;
case 9:
PrintfQueue(L);
break;
default:
printf("输入的序号有误,请重新输入.\n");
break;
}
}
return 0;
}
程序源码
运行效果
#include <stdio.h>
#include <stdlib.h>
//链队的实现
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode;
typedef struct LinkQueue
{
LNode *front;//front是头结点,不存放元素
LNode *rear;
}LinkQueue;
//函数声明
Status InitQueue(LinkQueue *L)
{
L->front=(LNode*)malloc(sizeof(LNode));
L->rear=L->front;
if(!L->front){
printf("初始化失败.\n");
return ERROR;
}
L->front->next=NULL;
printf("初始化队列成功.\n");
return OK;
}
Status QueueEmpty(LinkQueue L)
{
if(L.front==L.rear){
printf("队列为空.\n");
return OK;
}
printf("队列不为空.\n");
return ERROR;
}
Status QueueLength(LinkQueue L)
{
int i=0;
LNode *p;
p=L.front;
while(L.rear!=p){
i++;
p=p->next;
}
printf("队列的长度为%d.\n",i);
return OK;
}
Status ClearQueue(LinkQueue *L)
{
LNode *temp;
while(!L->front->next){
temp=L->front->next;
L->front->next=temp->next;
free(temp);
}
L->rear=L->front;
L->front->next=NULL;
printf("队列清空成功.\n");
return OK;
}
Status EnQueue(LinkQueue *L,ElemType e)
{
LNode *s=(LNode*)malloc(sizeof(LNode));
if(!s){
printf("初始化结点失败.\n");
return ERROR;
}
s->data=e;
L->rear->next=s;
s->next=NULL;
L->rear=s;
printf("元素%d入队成功.\n",e);
return OK;
}
Status DestroyQueue(LinkQueue *L)
{
ClearQueue(L);
free(L);
return OK;
}
Status GetHead(LinkQueue L)
{
if(QueueEmpty(L)){
return ERROR;
}
printf("队头元素为:%d.\n",L.front->next->data);
return OK;
}
ElemType DeQueue(LinkQueue *L)
{
if(QueueEmpty(*L)){
return ERROR;
}
printf("队头元素%d出队成功.\n",L->front->next->data);
LNode *p;
p=L->front->next;
L->front->next=p->next;
//处理最后一个元素出队的情况
if(L->rear==p){
L->rear=L->front;
}
free(p);
return OK;
}
//队列先进先出,先打印队头元素
Status PrintfQueue(LinkQueue L)
{
if(QueueEmpty(L)){
return ERROR;
}
printf("队列为:");
LNode *p;
p=L.front->next;
while(p){
printf("%d ",p->data);
p=p->next;
}
return OK;
}
int main()
{
LinkQueue L;
int input;
int value;
printf("请继续操作...\n");
while(1){
printf("\n==========================\n");
printf("1、初始化循环队列.\n");
printf("2、销毁队列.\n");
printf("3、清空队列.\n");
printf("4、判断队列是否为空.\n");
printf("5、获得队头元素.\n");
printf("6、插入队尾元素.\n");
printf("7、删除队头元素.\n");
printf("8、返回队列中元素个数.\n");
printf("9、打印队列中所有元素.\n");
printf("\n==========================\n");
printf("请输入对应操作的序号:");
scanf("%d",&input);
switch(input){
case 1:
InitQueue(&L);
break;
case 2:
DestroyQueue(&L);
break;
case 3:
ClearQueue(&L);
break;
case 4:
QueueEmpty(L);
break;
case 5:
GetHead(L);
break;
break;
case 6:
printf("请输入需要入队的元素:");
scanf("%d",&value);
EnQueue(&L,value);
break;
case 7:
DeQueue(&L);
break;
case 8:
QueueLength(L);
break;
case 9:
PrintfQueue(L);
break;
default:
printf("输入的序号有误,请重新输入.\n");
break;
}
}
return 0;
}
🚀先看后赞,养成习惯!🚀
🚀 先看后赞,养成习惯!🚀
🎈觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!🎈