队列是限制在两端操作进行插入操作与删除操作的线性表,允许进行插入操作的一端称为"队尾",允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。队列的特点是先进先出。
队列两种规定:
1、front指向队头元素的前一个位置,rear指向队尾元素所在位置;以下代码采用第一种规定。
2、front指向队头元素所在位置,rear指向队尾元素的下一个位置;
queue.h
/*===============================================
* 文件名称:queue.h
* 创 建 者:cxy
* 创建日期:2024年01月20日
* 描 述:
================================================*/
#ifndef _QUEUE_H
#define _QUEUE_H
#include <stdio.h>
#include <stdlib.h>
typedef struct node{ //节点
int data;
struct node *next;
}Node,*Pnode;
//规定1
typedef struct queue{ //队列指针
Pnode front; //头节点指针,指向队头元素的前一个位置
Pnode rear; //队尾指针,指向队尾元素所在位置
}Queue,*Pqueue;
int init(Pqueue *P);
int empty(Pqueue p);
int insert_queue(Pqueue p,int data);
int delete_queue(Pqueue p,int *data);
int sum(Pqueue p);
int clear_queue(Pqueue p);
#endif
queue.c
/*===============================================
* 文件名称:queue.c
* 创 建 者:cxy
* 创建日期:2024年01月20日
* 描 述:
================================================*/
#include "queue.h"
int init(Pqueue *P)
{
*P = malloc(sizeof(Queue)); //队列指针
if(NULL == *P)
{
perror("init err:*P");
return -1;
}
(*P)->front = malloc(sizeof(Node)); //头节点
if(NULL == (*P)->front)
{
perror("init err:(*P)->front");
return -1;
}
(*P)->rear = (*P)->front; //空队
(*P)->front->next = NULL;
return 0;
}
int empty(Pqueue p)
{
if(NULL == p)
{
perror("empty err:p");
return -1;
}
if(p->front->next == NULL)
return 1;
else
return 0;
}
int insert_queue(Pqueue p,int data)
{
if(NULL == p)
{
perror("insert err:p");
return -1;
}
Pnode new = malloc(sizeof(new));
if(NULL == new)
{
perror("insert err:new");
return -1;
}
new->data = data;
new->next = NULL; //入队:队尾
p->rear->next = new;
p->rear = new; //更新队尾
return 0;
}
int delete_queue(Pqueue p,int *data)
{
if(NULL == p)
{
perror("delete err:p");
return -1;
}
if(empty(p))
{
perror("delete err:empty");
return -1;
}
Pnode q = p->front->next;
*data = q->data;
p->front->next = q->next; //更新队头元素为q->next
free(q);
if(p->front->next == NULL) //空队
p->rear = p->front;
return 0;
}
int sum(Pqueue p)
{
if(NULL == p)
{
perror("sum err:p");
return -1;
}
Pnode q = p->front->next;
int sum = 1;
while(q->next)
{
q = q->next;
sum++;
}
return sum;
}
int clear_queue(Pqueue p)
{
if(NULL == p)
{
perror("clear err:p");
return -1;
}
Pnode q = NULL;
while(p->front->next)
{
q = p->front->next;
p->front->next = q->next;
free(q);
}
return 0;
}
main.c
/*===============================================
* 文件名称:main.c
* 创 建 者:cxy
* 创建日期:2024年01月20日
* 描 述:
================================================*/
#include "queue.h"
int main(int argc, char *argv[])
{
Pqueue p;
init(&p);
int data;
printf("----------empty,1为空----------\n");
data = empty(p);
printf("%d\n",data);
printf("----------insert_queue----------\n");
for(int i = 0;i < 5;i++)
{
printf("请输入入队数据:");
scanf("%d",&data);
insert_queue(p,data);
}
printf("----------empty,1为空----------\n");
data = empty(p);
printf("%d\n",data);
printf("----------sum----------\n");
data = sum(p);
printf("队列中共有:%d个数据\n",data);
printf("----------delete_queue----------\n");
for(int i = 0;i < 3;i++)
{
printf("出队数据为:");
delete_queue(p,&data);
printf("%d\n",data);
}
printf("----------empty,1为空----------\n");
data = empty(p);
printf("%d\n",data);
printf("----------clear_queue----------\n");
clear_queue(p);
printf("----------empty,1为空----------\n");
data = empty(p);
printf("%d\n",data);
return 0;
}
结果