看这篇文章之前可以先了解一下 链表的知识
概念篇
示意图
入队时在队尾指针指向的结点后面插入结点
出队时释放对头指针指向的结点
上面的操作满足先进先出的特征可以用来实现列。
代码篇
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;
}
运行结果
非常感谢您能有耐心的阅读完这篇文章!!
如果你对链表感兴趣,想必链表实现栈这篇文章会给你带来收获。
如果对队列感兴趣可以看一下顺序表实现队列。