• 数据结构 | 链表队列(基本操作及图示)


    ————————————————————————————————————————————

    基本概念:

    • 和栈相反,队列是一种先进先出(FIFO)的线性表。只允许在一端插入,在另一端删除。
    • 允许插入的叫"队尾"(rear),允许删除的叫"队头"(front)。

    • 使用场景:操作系统的作业排队。在允许多道程序运行的计算机系统中,同时有几个作业运行。如果运行结果都需要通道输出,则按照请求输出的先后次序排队。每当通道传输完毕可以接受新的输出任务时,队头的作业先从队列中退出作输出操作。申请输出的作业都从队尾进入。

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    基本操作:

    /* 定义链表队列 */

    struct Node //结构体存放节点

    struct LinkQueue //存放队头指针和队尾指针,不存放在Node中是为了节省节点入队时占用的内存空间

    /* 初始化队列 */

    队头指针和队尾指针共同申请一个内存空间

    节点下一节指向NULL

    注意:头结点的数据为空

    /* 入队操作 */

    申请新节点

    输入的数据elem存放在新节点数据中

    新节点下一节指向NULL

    尾节点的下一节点指向新节点

    队尾指针指向新节点

    /* 出队操作 */

    节点指针p指向队头结点

    队头结点指向第一节点

    释放指针p指向的节点

    p指向NULL //避免野指针

    /* 打印操作 */

    由于头节点为空,所以从第二节点开始打印,直到指向NULL时停止打印

    实现代码:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #define OK 1
     4 #define ERROE 0
     5 #define OVERFLOW -2
     6 typedef int Status;
     7 typedef int QElemType;
     8 typedef struct Node
     9 {
    10     QElemType data;
    11     struct Node *next;
    12 } QNode;
    13 /* 当链式队列的头尾节点指针定义成为一个单独的结构体,避免在新增节点时占用过多的空间 */
    14 typedef struct
    15 {
    16     QNode *front;
    17     QNode *rear;
    18 } LinkQueue;
    19 Status InitQueue(LinkQueue *Q)
    20 {
    21     Q->front = Q->rear = (QNode *)malloc(sizeof(QNode));
    22     if (!Q->front)
    23         exit(OVERFLOW);
    24     Q->rear->next = NULL; //rear.next始终指向NULL,头结点front不动
    25     return OK;
    26 }
    27 Status InQueue (LinkQueue *Q, int elem)
    28 {
    29     QNode *p;
    30     p = (QNode *)malloc(sizeof(QNode));
    31     p->data = elem;
    32     p->next = NULL;
    33     Q->rear->next = p;
    34     Q->rear = p;
    35     return OK;
    36 }
    37 Status PrintQueue(LinkQueue Q)
    38 {
    39     QNode *p;
    40     p = Q.front->next;
    41     printf("the queue is:");
    42     while(p != NULL)
    43     {
    44         printf("%d ", p->data);
    45         p = p->next;
    46     }
    47     return OK;
    48 }
    49 Status OutQueue(LinkQueue *Q)
    50 {
    51     QNode *p;
    52     int i;
    53     printf("
    the number of out queue:");
    54     scanf("%d", &i);
    55     while(i != 0)
    56     {
    57         p = Q->front;
    58         Q->front = Q->front->next;
    59         free(p);
    60         i--;
    61     }
    62     p = NULL;
    63     return OK;
    64 }
    65 Status EmptyQueue(LinkQueue Q)
    66 {
    67     if (Q.front->next == NULL)
    68         printf("
    The queue is empty!
    ");
    69     return OK;
    70 }
    71 int main()
    72 {
    73     LinkQueue queue;
    74     InitQueue(&queue);
    75     int elem;
    76     printf("input:");
    77     while(scanf("%d", &elem) != EOF)
    78     {
    79         InQueue(&queue, elem);
    80     }
    81     PrintQueue(queue);
    82     OutQueue(&queue);
    83     PrintQueue(queue);
    84     EmptyQueue(queue);
    85     return OK;
    86 }
  • 相关阅读:
    找不到方法 Void Newtonsoft.Json.JsonConvert.set_DefaultSettings
    HDUJ 1203 I NEED A OFFER!
    EasyUI基础入门之Resiable(可缩放)
    6大设计原则(2):里氏替换原则
    scikit-learn:class and function reference(看看你究竟掌握了多少。。)
    NoSQL之Redis探析
    docker 命令汇总2
    【Web应用-FTP】FTP 容量显示说明
    【Web应用-网络连接】关于 Azure Web 应用 4 分钟空闲连接的限制
    【Web应用-网络连接】Azure Web 应用对外连接数上限分析
  • 原文地址:https://www.cnblogs.com/hughdong/p/6841337.html
Copyright © 2020-2023  润新知