C语言之顺序表的循环队列
程序员文章站
2022-06-06 20:58:23
...
/**
队列是尾进头出的一种数据结构
这里的front和rear指向的都是待插入的位置,
**/
#include <stdio.h>
#include <stdlib.h>
#define QueueSize_UartLen 4 //表示循环队列存储数组的长度
//重命名循环队列的数据类型
//是结构体类型
typedef struct
{
int front;//指向开头
int rear;//指向结尾
int counter;//表示目前队列的元素个数
int uart_data[QueueSize_UartLen];//存储数据使用的数组
}CIRQueue_UART;
void InitQuenue(CIRQueue_UART *queue);//初始化循环队列
int InQueue(CIRQueue_UART *queue, int data);
int OutQueue(CIRQueue_UART *queue, int *p_data);
int QueueFull(CIRQueue_UART *queue);
int QueueEmpty(CIRQueue_UART *queue);
int main()
{
CIRQueue_UART CIRQueue;
CIRQueue_UART *queue = &CIRQueue;
InitQuenue(queue);
int num = 10;
int data;
while(num--){
if(!InQueue(queue, 1)){
printf("该队列已满\n");
}
OutQueue(queue, &data);
printf("data = %d\n", data);
if(!InQueue(queue, 10)){
printf("该队列已满\n");
}
OutQueue(queue, &data);
printf("data = %d\n", data);
if(!InQueue(queue, 100)){
printf("该队列已满\n");
}
}
return 0;
}
void InitQuenue(CIRQueue_UART *queue)
{
queue->front = 0;
queue->rear = 0;
queue->counter = 0;
for(int i = 0; i < QueueSize_UartLen; i++)
queue->uart_data[i] = 0;
}
int InQueue(CIRQueue_UART *queue, int data)
{
if(QueueFull(queue)){
printf("插入失败\n");
return 0;
}else{
queue->uart_data[queue->rear] = data;
queue->counter++;
queue->rear = (queue->rear + 1)%QueueSize_UartLen;//因为是循环队列
return 1;
}
}
int OutQueue(CIRQueue_UART *queue, int *p_data)
{
if(QueueEmpty(queue)){
printf("当前队列为空\n");
return 0;
}else{
*p_data = queue->uart_data[queue->front];
printf("front = %d ",queue->front);
queue->counter--;
queue->front = (queue->front + 1)%QueueSize_UartLen;
return 1;
}
}
int QueueFull(CIRQueue_UART *queue)
{
return queue->counter == QueueSize_UartLen;
}
int QueueEmpty(CIRQueue_UART *queue)
{
return queue->counter == 0;
}
总结其关键在于
在编写程序的时候一定要记得创建队列对象
不能还没创建队列,就直接用指针初始化 这时根本没有内存,指向谁 ?
再写这类型程序的时候不能一拿到指针就用 一定要看他指向的内存存不存在