一、引言
感谢宝子们一键三连支持,火速更新中~~
上期讲了队列的顺序存储,本期讲链式存储,性质差不多,就不多解释,实现功能都一样,只是使用链式存储结构来实现,话不多说,直接上代码。
二、目的
- 掌握链队列的存储结构
- 掌握链队列的基本操作
- 掌握链队列的基本特性
三、环境与设备
操作系统:Windows 10
编译器:Visual Studio 2021
四、存储结构
typedef int DataType;
typedef struct node
{
DataType data;
struct node *next;
}LNode;
typedef struct
{
LNode *front,*rear;
}LinkQueue;
五、函数
2. void InitLinkQueue(LinkQueue *lq)//初始化队列
3. int Empty(LinkQueue *lq)//判空
4. int InQueue(LinkQueue *lq,DataType x)//入队列
5. DataType OutQueue(LinkQueue *lq)//出队列
6. DataType GetQueue(LinkQueue *lq)//读取队头元素
7. int Length(LinkQueue *lq)//求长度
8. void DisQueue(LinkQueue *lq)//显示队列元素
六、核心代码
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct node
{
DataType data;
struct node *next;
}LNode;
typedef struct
{
LNode *front,*rear;
}LinkQueue;
LinkQueue *Q;
void InitLinkQueue();//初始化队列
int Empty();//判空
int InQueue(LinkQueue *lq,DataType x);//入队列
DataType OutQueue();//出队列
DataType GetQueue();//读取队头元素
int Length(LinkQueue *lq);//求长度
void DisQueue(LinkQueue *lq);//显示队列元素
void menu();
void menu1();
int main()
{
Q=(LinkQueue*)malloc(sizeof(LinkQueue));
menu();
}
void InitLinkQueue()//初始化队列
{
Q->rear=Q->front=(LNode *)malloc(sizeof(LNode));
Q->front->next=NULL;
Q->front->data=0;
}
int Empty()//判空
{
if(Q->front->next==NULL) return 1;
else return 0;
}
int InQueue(DataType x)//入队列
{
LNode *p=(LNode*)malloc(sizeof(LNode));
p->next=NULL;
p->data=x;
Q->rear->next=p;
Q->rear=p;
Q->front->data++;
}
DataType OutQueue()//出队列
{
LNode *p=Q->front->next;
if(p==NULL)
{
printf("当前队列为空\n");
Q->rear=Q->front;
Q->front->data=0;
return 0;
}
else
{
printf("当前出队元素为:\n");
printf("%d\n",p->data);
Q->front->next=p->next;
Q->front->data--;
free(p);
}
}
DataType GetQueue()//读取队头元素
{
LNode *p=Q->front->next;
if(p==NULL)
{
printf("当前队列为空\n");
return 0;
}
printf("当前对头元素为:\n");
printf("%d\n",p->data);
}
int Length()//求长度
{
int count=0;
LNode *p=Q->front->next;
if(p==NULL)
{
printf("长度为0");
}
else
{
while(p!=NULL)
{
p=p->next;
count++;
}
printf("当前长度为:\n",count);
printf("\n");
}
}
void DisQueue()//显示队列元素
{
LNode *p=Q->front->next;
printf("当前队列元素为:\n");
while(p!=NULL)
{
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
}
void menu()
{
system("mode con cols=80 lines=45");
system("color F4");
printf("\t***************************************************************\n");
printf("\t* 链队列 *\n");
printf("\t***************************************************************\n");
printf("\t*\t\t 1.初始化队列 *\n");
printf("\t*\t\t 2.判空 *\n");
printf("\t*\t\t 3.入队列 *\n");
printf("\t*\t\t 4.出队列 *\n");
printf("\t*\t\t 5.读取队头元素 *\n");
printf("\t*\t\t 6.求长度 *\n");
printf("\t*\t\t 7.显示队列元素 *\n");
printf("\t***************************************************************\n");
printf("\t\t请选择功能\n");
int a;
scanf("%d",&a);
while(a)
{
switch(a)
{
case 1:InitLinkQueue();printf("初始化成功\n");break;
case 2:
{
if(Empty()) printf("当前队列为空\n");
else printf("当前队列不为空\n");
break;
}
case 3:
{
int x;
printf("请输入入队元素\n");
scanf("%d",&x);
InQueue(x);
printf("入队成功\n");
break;
}
case 4:OutQueue();break;
case 5:GetQueue();break;
case 6:
{
printf("队列长度为:%d\n",Q->front->data);
break;
}
case 7:DisQueue();break;
case 12:menu1();break;
default:printf("\t\t还在紧张创作中!!!敬请期待!!!\n");
}
printf("\t\t请选择功能\n");
printf("\t\t温馨提示输入12可查看菜单\n");
scanf("%d",&a);
system("cls");
}
}
void menu1()
{
system("mode con cols=80 lines=45");
system("color F4");
printf("\t***************************************************************\n");
printf("\t* 链队列 *\n");
printf("\t***************************************************************\n");
printf("\t*\t\t 1.初始化队列 *\n");
printf("\t*\t\t 2.判空 *\n");
printf("\t*\t\t 3.入队列 *\n");
printf("\t*\t\t 4.出队列 *\n");
printf("\t*\t\t 5.读取队头元素 *\n");
printf("\t*\t\t 6.求长度 *\n");
printf("\t*\t\t 7.显示队列元素 *\n");
printf("\t***************************************************************\n");
}
七、调试界面
八、总结
好好练习,天天向上。