美文网首页
动态队列

动态队列

作者: Roadsun | 来源:发表于2017-12-01 23:14 被阅读0次
#include <stdio.h>  
#include <malloc.h>  
//动态队列,链式队列   
typedef struct Node{  
    int data;  
    struct Node * pNext;   
}NODE,*PNODE;   
typedef struct Queue{  
    PNODE front;//队列的出队处   
    PNODE rear;//队列的入队处   
}QUEUE,*PQUEUE;   
  
void init(PQUEUE);//队列的初始化  
void in(PQUEUE);//入队  
void out(PQUEUE,int *);//出队,以及返回出队的元素   
int getSize(PQUEUE);//得到队列的长度   
void printQueue(PQUEUE);//打印队列   
bool is_empty(PQUEUE);   
  
int main(void){  
    QUEUE Q;  
    int val;   
    init(&Q);   
    in(&Q);   
    in(&Q);  
    in(&Q);  
    in(&Q);  
    in(&Q);  
    printQueue(&Q);   
    out(&Q,&val);  
    printf("出队的元素是:%d\n",val);   
    printQueue(&Q);  
    out(&Q,&val);  
    printf("出队的元素是:%d\n",val);   
    printQueue(&Q);    
    return 0;   
}   
//队列的初始化  
void init(PQUEUE pQ){  
    pQ->front = (PNODE)malloc( sizeof(NODE) );  
    if(NULL ==  pQ->front){  
        printf("内存分配失败,初始化失败\n");  
        exit(-1);   
    }   
    pQ->rear = pQ->front;  
    pQ->front->pNext = NULL;   
}   
//入队  
void in(PQUEUE pQ){  
    printf("请输入你要入队的元素值:");  
    int val;   
    scanf("%d",&val);  
    PNODE pNew = (PNODE)malloc( sizeof(NODE) );  
    pNew->data = val;//因为是先进先出,故指针的方向是从font指向到real   
    pNew->pNext = NULL;   
    pQ->rear->pNext = pNew;  
    pQ->rear = pNew;   
}  
//出队       
void out(PQUEUE pQ,int * pVal){  
    if(is_empty(pQ) ){  
        printf("当前队列为空,不能出队");   
        return;   
    }   
    PNODE p = pQ->front->pNext; //因为在初始化的时候pQ->front是为NULL的,所以要用pQ->front->pNext  
    *pVal = p->data;   
    pQ->front->pNext = p->pNext;  
        //一般情况下删除队列头元素时仅需修改头结点中的指针,但当队列中最后一个元素被删后,队列尾指针  
        //也丢失了,因此需对尾指针重新赋值(指向头结点)   
        if(pQ->rear == p)   
           pQ->rear = pQ->front;   
    free(p);   
}  
//是否为空   
bool is_empty(PQUEUE pQ){  
    if(pQ->rear == pQ->front){  
        return true;   
    } return false;   
}  
//得到队列长度   
int getSize(PQUEUE pQ){  
    if(is_empty(pQ) ){  
        return 0;   
    }  
    PNODE p = pQ->front;  
    int count=0;   
    while(p != pQ->rear){  
        p = p->pNext;   
        count++;  
    }   
    return count;   
}   
//打印队列  
void printQueue(PQUEUE pQ){  
    if(is_empty(pQ) ){  
        printf("当前队列为空,不能打印");   
        return ;   
    }     
    PNODE p = pQ->front;  
    int size = getSize(pQ);   
    printf("该队列的%d个元素如下:",size);   
    while(p != pQ->rear){   
        p = p->pNext;   
        printf("%d ",p->data);   
    }   
    printf("\n");   
}  

相关文章

  • 动态队列

  • 815. 公交路线

    注意层次遍历,队列会动态增加

  • C语言数据结构——线性表链式循环队列(链表实现方式)

    队列相关知识及操作请参看上一章 C语言数据结构——线性表循环队列(动态数组实现方式) 一、链式队列 链式队列 : ...

  • RabbbitMQ RabbitListener 使用IP动态队

    在RabbitMQ消息队列使用 @RabbitListener 接收消息,队列名称使用常量命名,但是如果使用动态队...

  • 13-循环双端队列

    验证结果: 测试2: 总结: 用动态数组实现循环队列和循环双端队列的目的:是对动态数组的优化和另外一种思想(思路)...

  • 12-循环队列

    验证结果: 验证结果 循环队列动态扩容 验证结果:

  • 数据结构--优先队列

    优先队列: 出队顺序和入队顺序无关,与优先级相关。动态选择优先级高的先处理(动态数据)。 实现优先队列 底层结构入...

  • 动画 | 什么是二叉堆?

    二叉堆的解释 (动态选择优先级最高的任务执行) 堆,又称为优先队列。虽然名为优先队列,但堆并不是队列。堆和队列是两...

  • 第五章 队列

    队列 先进先出(FIFO) 队列的实现有很多种方法,静态数组或动态数组或链表,我们还是从有趣的“循环队列”开始吧!...

  • ArrayList源码分析

    ArrayList JDK1.8 概述 ArrayList 数组队列,跟普通的数组相比,数组队列的容量能动态增长。...

网友评论

      本文标题:动态队列

      本文链接:https://www.haomeiwen.com/subject/uregbxtx.html