C语言之队列

文章介绍了如何使用C语言创建一个循环队列,包括队列的数据结构定义、队列的创建函数Queue_Create以及出队操作函数Queue_Out。队列在满时采取“先进先出”策略,覆盖最久的数据。出队操作考虑了head和tail可能的位置关系,确保正确移除元素。
摘要由CSDN通过智能技术生成
  1. 队列:

/**********队列**********/
/*本例子中需要注意的是,指针的访问;head指向的地址,*head可以理解为指向的具体数值*/
/*指针的内容还是需要去多多的理解和使用,指针head=&a,那么head是指向a的地址,*head就是代表了a,也就是代表了a代表的值*/ 
#include <stdio.h>
#include <stdlib.h>

#define length 3

typedef struct Line{                                 //队列的数据结构 
    int buffer[length];                                 //缓冲队列 
    int *head,*tail,*end;                                 //head指向队头,tail指向队尾 
    //head= tail=&buffer[0];
}Queue; 

Queue *Queue_Create(void)                              //队列的创建函数 
{
    int n,data;
    Queue *queue=(Queue *)malloc(sizeof(Queue));
    queue->head=queue->tail=queue->buffer;             //取队列中缓冲数组的头地址 
    queue->end=&queue->buffer[length-1];               //取队列中缓冲数组的尾地址 
    printf("请输入需要创建的队列的大小:\n");
    scanf("%d",&n);
    printf("请输入%d个数值;\n",n);
    while(n)
    {
        scanf("%d",&data);
        if(queue->tail<=queue->end) //判断缓冲数组的尾指针是否已经指向数组的尾地址,如果不是就直接插入数据;否则要改变tail指向buffer的头地址 
        {
            *queue->tail=data;
            queue->tail++; 
        } 
        else{                        //这里的创建的循环队列,在队列满了的情况下会采取“先进先出”,会逐渐覆盖进入队列中最久时间的数据 
            printf("队列已满\n");
            queue->tail=queue->buffer;
            *queue->tail=data;
            printf("%d\n",*queue->tail);
            queue->tail++;
            queue->head++; 
        }
        n--;
     }
     return queue;
}

/*这里的出队列函数,在上面的创建队列函数中,tail是指向队列的下一个该插入数据的地址,但是在存在tail的指向地址一开始就和head重合的情况;
经过分析发现,tail有两种情况,在head的左边和右边,左边时对应的是,插入的数据超过了缓冲队列的大小;在右边时对应的是,插入的数据没有超过
缓冲队列的大小;*/
void Queue_Out(Queue *queue)                      //出队操作函数 
{
    int data;
    if(queue->tail<=queue->head)
    {
        printf("%d  ",*queue->head);
        queue->head++;                             //为了避免head和tail重合的情况,当tail<=head时,先打印*head,并且head++ 
        //printf("%d\n",*queue->tail);
        while(queue->head!=queue->tail)             //tail指向队列的下一个该插入数据的地址,此时这个地址是没有数据的 
        { 
            if(queue->head<=queue->end)
            {
                data=*queue->head;
                printf("%d  ",data);
                queue->head++;
             }
             else{
                 queue->head=queue->buffer;    
                 //data=*queue->head;
                //printf("%d  ",data);
                //queue->head++;
             }
        }
    }
    else{                                        
        while(queue->head!=queue->tail)
        {
            printf("%d  ",*queue->head);
            queue->head++;
        }
    }
    printf("\n");
 } 

/*void Queue_Insert(Queue *queue)
{
    
    
}*/

int main()
{
    Queue *line;
    line=Queue_Create();
    Queue_Out(line);
    return 0;
}                                                       
  1. 运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值