链表实现队列(c语言)


看这篇文章之前可以先了解一下 链表的知识

概念篇

在这里插入图片描述

示意图

入队时在队尾指针指向的结点后面插入结点
出队时释放对头指针指向的结点
上面的操作满足先进先出的特征可以用来实现列。
在这里插入图片描述

代码篇

1.队列的创建

把一些属性封装起来表示队列
typedef struct node
{
	int data;
	struct node*next;
}node;
typedef struct queue
{
	node* rear;	//队尾指针
	node* front;//队首指针
	size_t size;
}queue;

1. 队列的创建

void queue_create(queue*q)
{
	q->rear=q->front=NULL;
	//队列没有元素,队首指针和队尾指针为空
	q->size=0;
}

2.队列的销毁

和链表的销毁类似。
void queue_destory(queue*q)
{
	while(q->front)
    {
        node*a=q->front;
        q->front=q->front->next;
        free(a);
    }
    q->rear=NULL;
    q->size=0;
}

3.入队

入队就是在队尾插入元素
void queue_push(queue*q,int value) 
{
	node*a=(node*)malloc(sizeof(node));
	a->data=value;
	a->next=NULL;
	if(q->rear==NULL)
        q->front=q->rear=a;
    /*如果队列为空,队首指针和队尾指针都指向
    新生成的结点表明队列里只有一个结点*/
    else
    {
        q->rear->next=a;
        q->rear=a;
        //否则在队尾插入结点
    }
    q->size++;
}

4.出队

如果出队后元素个数为0,队列为空,队尾指针要为空。
int queue_pop(queue*q)
{
	if(q->front==NULL)
	{
		printf("q is emepty!");
        exit(1);
	}
	//队头指针为空说明队列为空
	int value=q->front->data;
	node*a=q->front;
	q->front=q->front->next;
	/*更新队首指针,如果队列原本只剩一个元素,
		队首指针将会为空。
	*/
	free(a);
	q->size--;
	if(q->size==0)
		q->rear=NULL;
	//如果队列为空,队尾指针为空
	return value;
}

5.返回队首元素

int queue_front(queue*q)
{
	if(q->front==NULL)
    {
        printf("q is emepty!");
        exit(1);
    }
	return q->front->data;
}

6.元素个数

int queue_size(queue*q)
{
    return q->size;
}

7.完整代码

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	int data;
	struct node*next;
}node;
typedef struct queue
{
	node* rear;	//队尾指针
	node* front;//队首指针
	size_t size;
}queue;
void queue_create(queue*q)
{
	q->rear=q->front=NULL;
	//队列没有元素,队首指针和队尾指针为空
	q->size=0;
}
void queue_destory(queue*q)
{
	while(q->front)
    {
        node*a=q->front;
        q->front=q->front->next;
        free(a);
    }
    q->rear=NULL;
    q->size=0;
}
void queue_push(queue*q,int value)
{
	node*a=(node*)malloc(sizeof(node));
	a->data=value;
	a->next=NULL;
	if(q->rear==NULL)
	 //如果队列为空,队首指针和队尾指针都指向
    //新生成的结点表明队列里只有一个结点
        q->front=q->rear=a;
    else
    {
        q->rear->next=a;
        q->rear=a;
        //否则在队尾插入结点
    }
    q->size++;
}
int queue_pop(queue*q)
{
	if(q->front==NULL)
	{
		printf("q is emepty!");
        exit(1);
	}
	int value=q->front->data;
	node*a=q->front;
	q->front=q->front->next;
	/*更新队首指针,如果队列原本只剩一个元素,
		队首指针将会为空。
	*/
	free(a);
	q->size--;
	if(q->size==0)
		q->rear=NULL;
	//如果队列为空,队尾指针为空
	return value;
}
int queue_front(queue*q)
{
	if(q->front==NULL)
    {
        printf("q is emepty!");
        exit(1);
    }
	return q->front->data;
}
int queue_size(queue*q)
{
    return q->size;
}
int main()
{
    queue q;
    queue_create(&q);
    queue_push(&q,10);
    queue_push(&q,20);
    queue_push(&q,30);
    printf("q size is:%d\n",queue_size(&q));
    printf("q pop is:%d\n",queue_pop(&q));
    printf("q front is:%d\n",queue_front(&q));
    printf("q size is:%d\n",queue_size(&q));
    queue_destory(&q);
    return 0;
}

运行结果

在这里插入图片描述
非常感谢您能有耐心的阅读完这篇文章!!
如果你对链表感兴趣,想必链表实现栈这篇文章会给你带来收获。
如果对队列感兴趣可以看一下顺序表实现队列

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值