• C语言线性表之队列算法一:链式队列


         之前写过《C语言实现线性表之栈算法》,《C语言实现线性表之链表算法》《C语言实现线性表连续存储结构相关算法》三篇关于算法的文章,但这三篇文章中只有大段的代码,并没有相关的解说,对于当时的我来说,思路会比较清晰,但过一段时间后,这些个算法为什么这样实现,也许就想不起来了,所以本文增加一些解说性的文字,如果各位看官看的不爽,恳请不吝赐教。

    一、定义

    队列:无非就是一种先进先出的一种存储结构,可以用以下的示意图进行演示。

    二、分类

    1)动态队列:通常使用链表来实现
    2)静态队列:使用数组来实现

    三、动态队列的实现

    第一部分:其本实现思路:动太队列的实现使用链表来实现,如下示意图:
    其中Rear为队尾用于插入数据,而Front为队头,用于出队
    第二部分:算法
      1)第一步:定义链表节点及队列,队列只需要包含一个头结一个尾即可。
    1 typedef struct LinkList{
    2     int data;
    3     struct LinkList * next;
    4 }NODE, * PNODE;
    5 
    6 typedef struct Queue{
    7     PNODE front;
    8     PNODE rear;
    9 }QUEUE,* PQUEUE ;
    View Code

      2)第二步:初始化,初始化时,我在此处并没有使用头结点,因为我觉点使用了头结点并非特别好(具体哪里不好我也说不清楚),此处初始化只需要将队头与队属置空即可

    1 //初始化
    2 bool init(PQUEUE pq){
    3     pq->front=NULL;
    4     pq->rear=pq->front;
    5 }           
    View Code

      3)第三步:入队,因为此处并没有使用头结点,所以每次入队元素的时候需要特别判断栈是否为空(暂时先不考虑判空算法),如果为空,需要特别处理一下(需要让队尾与队头指向同一个节点)

     1  bool inQueue(PQUEUE pq,int val){
     2     //创建新的节点 
     3     PNODE pnew=(PNODE)malloc(sizeof(NODE));
     4     if(NULL==pnew){
     5         printf("动态内存分配失败,元素入队失败!");
     6         return false;
     7     }
     8 
     9     pnew->data=val; 
    10     pnew->next=NULL;
    11 
    12 
    13     //判断是否为空    
    14     if(isEmpty(pq)){
    15         pq->rear=pnew;
    16         pq->front=pq->rear; 
    17     }
    18     else{
    19         pq->rear->next=pnew;
    20         pq->rear=pnew;
    21     }
    22 
    23 }
    View Code

      4)第四步:出队,明显示需要判断队列是否为空

     1  int outQueue(PQUEUE pq){
     2     if(isEmpty(pq)){
     3         printf("队列已空,再无元素可供出队,程序将返回0!
    ");
     4         return 0;
     5     }
     6     PNODE p=pq->front;
     7     int result=p->data;
     8     pq->front=pq->front->next;
     9     free(p);
    10 }
    View Code

      5)第五步:判断为空,因为没有使用头结点,所以我们只需要判断队尾或队头是否为空即可,如果使用了头结点,则需要判断队头的next指针域是否为空

    1  bool isEmpty(PQUEUE pq){
    2     if(pq->rear    ==NULL){
    3         return true;
    4     }
    5     return false;
    6 }
    View Code

      6)第六步:输出

     1 void showElements(PQUEUE pq){
     2     if(isEmpty(pq)){
     3         printf("栈为空,无元素可供输出!
    ");
     4         return;
     5     }
     6     PNODE p=pq->front;
     7     while(p!=NULL){
     8         printf("%d  ",p->data);
     9         p=p->next;
    10     }
    11     printf("
    ");
    12
    View Code

      7)第七步:main方法

     1 int main(int argc, char *argv[])
     2 {
     3     QUEUE qu;
     4     init(&qu);
     5     showElements(&qu);
     6     outQueue(&qu);
     7     inQueue(&qu,1);
     8     inQueue(&qu,2);
     9     inQueue(&qu,3);
    10     inQueue(&qu,4);
    11     inQueue(&qu,5);
    12     showElements(&qu);
    13     outQueue(&qu);
    14     showElements(&qu);
    15     outQueue(&qu);
    16     showElements(&qu);
    17     return 0;
    18 }
    View Code

       结果:

           

     8) 程序下载(本程序中另附一份加入头结点的实现方式):点我

  • 相关阅读:
    a标签去除默认样式
    js获取浏览器的get传值
    apache启动的时候报错非法协议
    获取iframe引入页面内的元素
    百度地图,画多边形后获取中心点
    echarts重写提示框信息,使提示框内的数字每3位以逗号分割
    echarts图例和图例文字位置的设置
    websocket socketJs
    winds添加静态路由
    pscp命令详解
  • 原文地址:https://www.cnblogs.com/hymhblf/p/3219514.html
Copyright © 2020-2023  润新知