zoukankan      html  css  js  c++  java
  • 队列queue(2):链表实现队列

    基本概念


     

      队列是只允许在一端进行插入操作,另一端进行删除操作的线性表。

       我们规定,允许删除的叫做队首“head”,允许插入的叫做队尾“tail”。

      

    基本操作


      我们规定,一个结点包含数值域与指针域两部分,数值域存放链表所需要用到的非指针型数值,指针域用于存放数值以及指向下一个结点的next指针。

      

      /*定义链表队列*/

      struct Node{ int dota;struct Node *next}node;   //结构体存放结点

      struct linkqueue{struct Node *head;struct Node *tail}queue;  //存放队头指针和队尾指针,不存放在Node中是为了节省节点入队时占用的内存空间

      

       /* 初始化队列 */

      1.队头指针和队尾指针共同申请一个内存空间,我们假定申请到的内存地址是0X01

      2.结点下一结指向NULL

         注意:头结点的数据域为空

      PS:框框下头的&q、head、tail表示的是已串到0X01内存地址上的结点

      

       /* 入队操作 */

        1.申请新结点p,申请内存空间,我们规定申请到的内存空间地址为0X02

      2.输入的数据elem存放在新结点数据中

      3.新结点p的下一结指向NULL

      4.尾结点tail的下一结点指向新结点p,即把新结点p串到链表中

      5.队尾指针tail->next指向新结点,保证尾结点指针tail->next始终指向NULL

      

      

      

      /* 出队操作 */

      1.申请结点指针p,指向队头结点head,内存地址为0X01

      2.队头结点head传入下一结点,以免其被free();而失去了删除的这一端

      3.free();指针p指向的结点,原队头结点head所在的内存地址0X01

      4.p=NULL //避免野指针

      

      

      /* 打印操作 */

      1.若队头结点还位于内存地址0X01上,由于0X01内存地址上结点的数值域未写入,所以队头结点head应移入下一结点中,即head=head->next;

      2.申请一个结点p

      3.把结点p串入含有数值域的结点,即p=q->head->next,q是结构体queue类型的队列。

      4.遍历打印p=p->next,直到NULL。

      

    源代码


      

    /**********************************************************************
                    实现一个queue
                    输入: 7  6  8  6  6  7  0  4  1(队列)
    
                           9(出队的个数)
                    输出:The queue is empty!
    **********************************************************************/
    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct Node
    {
         int data;
         struct node *next;
    }node;
    /* 当链式队列的头尾节点指针定义成为一个单独的结构体,避免在新增节点时占用过多的空间 */
    typedef struct list
    {
            struct Node *head;
            struct Node *tail;
    }queue;
    
    void queue_init(queue *q);
    void queue_in(queue *q,int elem);
    void queue_out(queue *q);
    void queue_print(queue *q);
    void queue_empty(queue *q);
    
    int main()
    {
            queue q;
            queue_init(&q);
            int elem;
            printf("input:");
            while(scanf("%d",&elem)!=EOF)
            {
                    getchar();
                    queue_in(&q,elem);
            }
            queue_print(&q);
            queue_out(&q);
            queue_print(&q);
            queue_empty(&q);
            return 0;
    }
    
    void queue_init(queue *q)
    {
            q->head=q->tail=(node*)malloc(sizeof(node));  //head,tail共同指向一个内存空间
            q->tail->next=NULL;  //队尾指针的next指针指向NULL,头结点head不变
            return;
    }
    
    void queue_in(queue *q,int elem)
    {
            node *p;
            p=(node *)malloc(sizeof(node));
            p->data=elem;
            p->next=NULL;
            q->tail->next=p;
            q->tail=p;
            return;
    }
    
    void queue_out(queue *q)
    {
            node *p;
            int i;  //i==出队的数据个数
            printf("The number of out queue:
    ");
            scanf("%d",&i);
            while(i)
            {
                    p=q->head;
                    q->head=q->head->next;
                    free(p);
                    p=NULL; //防止野指针
                    i--;
            }
            return;
    }
    
    void queue_print(queue *q)
    {
    
            node *p;
            p=q->head->next;
            while(p!=NULL)
            {
                    printf("%d",p->data);
                    p=p->next;
            }
            return;
    }
    
    void queue_empty(queue *q)
    {
            if(q->head->next==NULL)
            {
                    printf("The queue is empty!
    ");
            }
            return;
    }
    
    ————全心全意投入,拒绝画地为牢
  • 相关阅读:
    Django搭建环境
    python切片
    python数据类型
    jquery 淡入淡出属性
    Jquery Tab切换
    jQuery Clone方法
    jQuery属性操作
    python 变量以及循环
    获取网站目录
    posting-jsonobject-with-httpclient-from-web-api
  • 原文地址:https://www.cnblogs.com/Bw98blogs/p/7190422.html
Copyright © 2011-2022 走看看