C语言数据结构——队列

  数据结构的一些讲解,供学习者参考,也顺带作为复习
  栈是一种先进后出的数据结构,在实际问题上,还有另外一种先进先出的数据结构:即插入在表一端进行,删除在表的另一端进行,我们将这种数据结构称为队列或简称“队”,把允许插入的一端叫队尾(rear),把允许删除的那一端叫队头(front)。如图所示是一个有5个元素的队列。入队顺序依次为a1、a2、a3、a4、a5。出队顺序也依然是a1、a2、a3、a4、a5。
队列示意图
  
  队列上的基本运算有:

  (1)队列初始化 *Init_LQueue();
  (2)入队操作In_LQueue(LQueue *q,int x);
  (3)出队操作Out_LQueue(LQueue *q,int *x);
  (4)取队头元素操作Read_LQueue(LQueue *q,int *x);
  (5)判空队操作Empty_LQueue(LQueue *q);

  (1)队列初始化 *Init_LQueue();

LQueue *Init_LQueue()
{
    LQueue *q;;
    QNode *p;
    q=(LQueue *)malloc(sizeof(LQueue));
    p=(QNode *)malloc(sizeof(QNode));
    p->next=NULL;
    q->front=p;
    q->rear=p;
    return q;
}

  (2)入队操作In_LQueue(LQueue *q,int x)

void In_LQueue(LQueue *q,int x)
{
    QNode *p;
    p=(QNode *)malloc(sizeof(QNode));
    p->data=x;
    p->next=NULL;
    q->rear->next=p;
    q->rear=p;
    printf("入队成功!\n");
}

  (3)出队操作Out_LQueue(LQueue *q,int *x)

int Out_LQueue(LQueue *q,int *x)
{
    QNode *p;
    if(Empty_LQueue(q))
    {
        printf("队空,无法出队!\n");
        return 0;
    }
    else
    {
        p=q->front->next;
        q->front->next=p->next;
        *x=p->data;
        free(p);
        if(q->front->next==NULL)
            q->rear=q->front;
        return 1;
    }
}

  (4)取队头元素操作Read_LQueue(LQueue *q,int *x)

int Read_LQueue(LQueue *q,int *x)
{
    QNode *p;
    if(Empty_LQueue(q))
    {
        printf("队空,无法读取!\n");
        return 0;
    }
    else
    {
        p=q->front->next;
        *x=p->data;
        return 1;
    }
}

  (5)判空队操作Empty_LQueue(LQueue *q)

int Empty_LQueue(LQueue *q)
{
    if(q->front==q->rear)
        return 1;
    else 
        return 0;
}

主函数实现

void main()
{
    LQueue *Lqueue;
    int model,item;
    Lqueue=Init_LQueue();
    printf("队列已初始化!\n");
    while(1)
    {
        printf("请选择你需要的操作:\n");
        printf("【1】入队\n【2】出队\n【3】读队头元素\n【4】退出程序\n");
        printf("请输入:  ");
        scanf("%d",&model);
        switch(model)
        {
        case 1:
            while(1)
            {
                printf("请输入入队元素:  ");
                scanf("%d",&item);
                if(item==0)
                    break;
                In_LQueue(Lqueue,item);
            }
            break;
        case 2:
            Out_LQueue(Lqueue,&item);
            printf("队头元素 %3d 已出队!\n",item);
            break;
        case 3:
            Read_LQueue(Lqueue,&item);
            printf("队头元素为 %3d \n",item);
            break;
        default:
            printf("输入错误,请重新输入\n");
            break;
        }
    }
}

示意图
示意图
需要源代码的欢迎下载,免积分,共同学习,家下来每天都会分享一篇,持续一个星期
点击此处免积分下载,共同学习,欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值