• 用链表实现消息队列


    l链表可以实现多种数据结构,消息队列,环形缓存等。下面先介绍消息队列的实现,后面介绍ring buf的实现。

     1 /*FIFO队列中参数的类型*/
     2 typedef int QElemtype;
     3 
     4  /*对节点的结构定义*/
     5 typedef struct QNode
     6 {
     7     QElemtype data;
     8     struct QNode *next;
     9 }QNode,*QueuePtr;
    10  
    11 /*FIFO队列的结构定义*/
    12 typedef struct{     
    13     QueuePtr head;
    14     QueuePtr rear;
    15 }LinkQueue;
    16 LinkQueue updateListMsgQ;
    17 
    18 /*.BH-----------------------------------------------------------------
    19 **
    20 **函数名:
    21 **
    22 **功能:链表实现消息队列,支持任意类型数据
    23 **
    24 **参数: 
    25 **
    26 **返回值:
    27 **
    28 **设计注记:
    29 **
    30 **.EH-----------------------------------------------------------------
    31 */
    32  //初始化队列
    33 int Queue_Init(LinkQueue* que)
    34 {
    35     que->head=que->rear=(QueuePtr)malloc(sizeof(QNode));
    36     if(!que->head)  //这段代码对队列里面的用户自定义数据类型进行了初始化
    37         return ERROR;
    38     return OK;
    39 }
    40  
    41 //回收队列
    42 int Queue_Destory(LinkQueue* que) 
    43 {
    44     while(que->head)
    45     {
    46         que->rear = que->head->next;
    47         free(que->head);
    48         que->head=que->rear;
    49     }
    50     return OK;
    51 }
    52 
    53  /*将元素插到尾部*/
    54 int Queue_Push(LinkQueue* que,QElemtype e)
    55 {
    56     QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    57     if(!p) //若未能申请到空间,便退出
    58         return ERROR;
    59     p->data=e;
    60     p->next=NULL;
    61 
    62     que->rear->next = p;
    63     que->rear=p;
    64     return OK;
    65 }
    66 
    67  /*指针que指向头节点的后一节点,既要出队的节点*/
    68 int Queue_Pop(LinkQueue* que,QElemtype *t)
    69 {
    70     if(que->rear==que->head)
    71         return ERROR; //队列为空
    72 
    73     QueuePtr p = que->head->next;
    74     *t=p->data;
    75 
    76     que->head->next=p->next;
    77     if(que->rear==p) //这个判断是 确保在清空队列的时候,让rear指针归位。
    78         que->rear=que->head;
    79     free(p);
    80     return OK;
    81 }
    82 
    83 /*遍历队列*/
    84 int Queue_View(LinkQueue* que)
    85 {
    86     if(que->rear == que->head)
    87         return ERROR;
    88     
    89     QueuePtr p =que->head->next;
    90     while(p)
    91     {
    92         printf("val:%d",p->data);
    93         p=p->next;
    94     }
    95     return OK;
    96 }
  • 相关阅读:
    MySQL
    用python自动复制粘贴excel表里某一列的数据到另一个表中
    python操作excel小试牛刀
    python- 安装扩展包
    15分钟用ppt制作桌面整理四格壁纸
    R-算术运算符
    R-变量
    R-函数/语法-整合版
    MySQL-函数-整合版
    Python_图片对比问题汇总
  • 原文地址:https://www.cnblogs.com/AndrewYin/p/9203611.html
Copyright © 2020-2023  润新知