zoukankan      html  css  js  c++  java
  • 数据结构C语言实现----出队伍操作

    1.创建一个队列时,空队列中队首和队尾相同,但不是NULL,队首后面挂的元素才是NULL

    2.打印队列时,对于链队列,不能把指针加一来找到下一个数据,因为链表地址不连续,需要复制一条链表,不断往后遍历来挨个打印链表的数据

    3.求队伍的长度也是,不能首尾指针相减,因为地址不连续,所以同样需要复制一条链表,通过遍历来求长度

    代码如下:

    #include<stdlib.h>
    #include<stdio.h>
    /*************************************
     * 出队列操作
     * 队首(头指针)---元素1----元素2---元素3---.....
     * 将队首指向元素2,释放掉元素1
     * 注意1:队列原本为空队列,直接返回
     * 注意2:释放掉第一个元素后,队列变为空队列,别忘了让队尾 = 队首
     * ***************************************************************/
    //typedef char ElemType;
    typedef struct QNode 
    {
        char date;
        struct QNode *next;
    }QNode , *QueuePtr;
    typedef struct 
    {
        QueuePtr front , rear;
    }LinkQueue;
    /////////////////////////////////////////////////////////////////////
    //创建一个队列
    void initQueue(LinkQueue *q)
    {
        q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
        if (!q->front)
        {
            exit(0);
        }
        q->front->next = NULL;//这时头结点后面连接的是NULL,但本身不是NULL
    }
    /////////////////////////////////////////////////////////////////////
    //入队列操作
    void EnQueue(LinkQueue *q , char e)
    {
        QueuePtr p;
        p = (QueuePtr)malloc(sizeof(QNode));
        if (!q->front)
        {
            exit(0);
        }
        p->date = e;
        p->next = NULL;
        q->rear->next = p;
        q->rear = p;
    }
    ////////////////////////////////////////////////////////////////////
    //出队列操作
    void DeQueue(LinkQueue *q , char *e)
    {
        if (q->front == q->rear)//判断是否为空队列
        {
            return;
        }
        QueuePtr p;
        p = q->front->next;
        *e = p->date;
        q->front->next = p->next;
        if (q->rear == p)
        {
            q->front = q->rear;
        }
        free(p);
    }
    /////////////////////////////////////////////////////////////////////
    //计算队列长度
    int LenLinkQueue(LinkQueue *q)
    {
        int len,i;
        QueuePtr p = q->front->next;
        for (i = 0; p!=NULL;i++)
        {
            p = p->next;
        }
        return i;
    }
    
    int main()
    {
        LinkQueue q;
        char e;
        //创建队列
        initQueue(&q);
        printf("队列创建中,请稍后...
    队列创建成功!
    ");
        //入队列操作
        printf("请输入要插入队列的字符:");
        while ((e = getchar())!= '
    ')
        {
            if (e!='
    ')
            {
                EnQueue(&q , e);
            }
        }
        //打印队列
        printf("插入成功,正在打印队列字符...
    ");
        printf("当前队列为:");
        int len = LenLinkQueue(&q);//队伍长度
        QueuePtr p = q.front->next;//链表不同于顺序表,地址不连续,所以不能通过指针的增减来打印,需要复制一个链表遍历
        for (size_t i = 0;i<len ; i++)
        {
            printf("%c" , p->date);
            p = p->next;
        }
        putchar('
    ');
        //出队伍
        printf("请输入需要几个元素从队首出队列:");
        int n;
        scanf("%d",&n);
        while (n)
        {
            DeQueue(&q , &e);
            printf("%c已从队首出队列
    " ,e);
            n--;
        }
        //打印队伍
        printf("插入成功,正在打印队列字符...
    ");
        printf("当前队列为:");
        p = q.front->next;
        for (size_t i = 0;i<len ; i++)
        {
            printf("%c" , p->date);
            p = p->next;
        }
        putchar('
    ');
        return 0;
    }
    

      

    运行结果:

  • 相关阅读:
    [ SDOI 2006 ] 保安站岗
    [ TJOI 2012 ] 防御
    [ ZJOI 2012 ] 灾难
    [ HNOI 2008 ] 玩具装箱
    「UER#2」信息的交换
    「UR#5」怎样跑得更快
    「UR#6」懒癌
    清华集训2014 做题记录
    「UR#5」怎样更有力气
    弦图及区间图学习笔记
  • 原文地址:https://www.cnblogs.com/jerryleesir/p/13339458.html
Copyright © 2011-2022 走看看