• [转载]队列的链式存储


    申明:转自    http://www.cnblogs.com/Romi/archive/2012/08/28/2660954.html

      1 //队列的链式存储.C
      2 #include<stdio.h>
      3 #include<stdlib.h>
      4 #include<malloc.h>
      5 
      6 //定义队列
      7 typedef struct node {
      8     int data;
      9     struct node *next;
     10 }Queue;
     11 
     12 //定义对手指针和队尾指针
     13 typedef struct pointer {
     14     Queue *front;//队首指针,队首指针不存放队列元素
     15     Queue *rear;//队尾指针,指向队尾的结点
     16 }Qpointer;
     17 
     18 //队列初始化,队首和队尾指向同一个内存空间,指针域为NULL
     19 void QueueInit(Qpointer *qp)
     20 {
     21     Queue *que;
     22     que = (Queue*)malloc(sizeof(Queue));
     23     que->next = NULL;
     24     qp->front = que;
     25     qp->rear = que;
     26 }
     27 
     28 //判断队列是否为空:为空返回1,不为空返回0
     29 int IsEmpty(Qpointer *qp)
     30 {
     31     //判断方法:对手指针和队尾指针是否相同
     32     if (qp->front == qp->rear)
     33     {
     34         return 1;
     35     }
     36     return 0;
     37 }
     38 
     39 //插入数据元素:插入成功返回1,失败返回0
     40 int QueuePush(Qpointer *qp, int element)
     41 {
     42     Queue *que;
     43     que = (Queue*)malloc(sizeof(Queue));
     44     if (que == NULL)
     45     {
     46         return 0;
     47     }
     48     que->data = element;
     49     que->next = NULL;
     50     qp->rear->next = que;//将节点插入队列尾
     51     qp->rear = que;//调整队尾指针(队尾指针,指向队尾的结点)
     52     return 1;
     53 }
     54 
     55 //删除数据元素:删除成功返回1,失败返回0
     56 int QueuePop(Qpointer *qp, int *element)
     57 {
     58     Queue *que;
     59     if (IsEmpty(qp))
     60     {
     61         return 0;
     62     }
     63     que = qp->front->next;//que指向队列头结点的下一个节点,即真正的队首
     64     *element = que->data;//将要出队列的元素
     65     qp->front->next = que->next;
     66     //判断队列是否就只剩下一个元素
     67     if (qp->rear == que)
     68     {
     69         qp->rear = qp->front;
     70     }
     71     free(que);
     72     return 1;
     73 }
     74 
     75 int main()
     76 {
     77     Qpointer *qp;
     78     int x;
     79     int element;
     80     //初始化队列
     81     qp = (Qpointer*)malloc(sizeof(Qpointer));
     82     QueueInit(qp);
     83     printf("input positive integers:
    ");
     84     scanf("%d", &x);
     85     while (x > 0)
     86     {
     87         QueuePush(qp, x);
     88         scanf("%d", &x);
     89     }
     90     //输出队列:队首->队尾
     91     Queue *p = qp->front->next;
     92     if (p == NULL)
     93         return 0;
     94     printf("queue element:
    ");
     95     while (p)
     96     {
     97         printf("%d ", p->data);
     98         p = p->next;
     99     }
    100     printf("
    ");
    101     //删除队列
    102     printf("delete queue:
    ");
    103     while (QueuePop(qp, &element))
    104     {
    105         printf("%d ", element);
    106     }
    107     printf("
    ");
    108     //释放内存空间
    109     p = qp->front;
    110     free(p);
    111     free(qp);
    112 
    113     return 0;
    114 }
    View Code

    1.队列定义:除了定义队列中节点的数据结构,还专门定义了队首和队尾,方便对队列操作,这样一来,队列的操作就只需要对pointer结构体中的对手指真和队尾指针进行。

    2.判断是否为空
    当队首指针和队尾指针只想同一块地址时,队列为空,队列为空就是说队列中没有数据元素。注意队首front只是队列的头结点,并不代表队列的实际队首,在队列不为空时,队列的实际队首应该是头结点的下一个节点。

    3.插入数据元素

    插入在队尾进行,插入后,新插入的节点就成为了队尾。

    4.删除数据元素

    删除在队首进行,需要注意的是,当实际的队首也是队尾时,删除队列中的一个数据后队列就成为了空队列(rear=front)。最后不要忘了将删除的数据的内存空间释放掉。

    5.注意点

    最后释放内存时,一定要先释放掉pointer中的队首指针和队尾指针指向的内存空间,再释放掉pointer结构体指向的内存空间。

  • 相关阅读:
    linux基础
    spring学习 之 spring与java web整合原理示例
    idea 使用tomcat插件创建Java web项目
    xml解析
    spring注解学习之 九 DeferredImportSelector接口
    springboot学习一 idea配置文件乱码
    "从客户端中检测到有潜在危险的 Request.Form 值"的解决方案汇总
    通过Cookie存放用户登录信息以及安全性问题
    从数据库所有表中查找特定的数据(模糊匹配)
    CentOS 7 系列修改默认网卡名为 eth0 的两种方法
  • 原文地址:https://www.cnblogs.com/-rfq/p/5930183.html
Copyright © 2020-2023  润新知