• 基本数据结构 -- 队列(链表实现)


      上一篇简单介绍了使用数组实现一个队列的方法,本文使用链表来实现队列:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int ElementType;
    
    typedef struct ListNode {  // 定义结点结构
        ElementType data;
        struct ListNode *next;
    }node;
    
    typedef struct QueueRecord {  // 定义结构体,用于存放队列的头指针和尾指针
        node *Front;
        node *Rear;
    }Queue;
    
    typedef Queue *PtrToQueue;
    
    PtrToQueue InitQueue();void Enqueue(PtrToQueue Q, ElementType element);
    void Dequeue(PtrToQueue Q);
    void TraverseQueue(PtrToQueue Q);
    
    int main()
    {
        PtrToQueue LinkedQueue = InitQueue();
        for (int i = 0; i < 10; i++) {
            Enqueue(LinkedQueue, i);
        }
        TraverseQueue(LinkedQueue);
    
        Dequeue(LinkedQueue);
        Dequeue(LinkedQueue);
        TraverseQueue(LinkedQueue);
    
        Enqueue(LinkedQueue, 50);
        TraverseQueue(LinkedQueue);
    
        DestoryQueue(LinkedQueue);
        TraverseQueue(LinkedQueue);
    }
    
    /* 队列初始化 */
    PtrToQueue InitQueue()
    {
        PtrToQueue queue = (PtrToQueue)malloc(sizeof(Queue));  // 创建一个队列,并动态分配内存
       if(queue == NULL) {  
             perror("malloc failed!
    ");
             exit(EXIT_FAILURE);
       }
    
        queue->Front = queue->Rear = NULL;  // 初始化头指针和尾指针
        return queue;
    }
    
    /* 入队 */
    void Enqueue(PtrToQueue Q,ElementType element)
    {
        node *newNode = (node *)malloc(sizeof(node));  // 新建一个链表结点,用于存放入队元素的值
        if (newNode == NULL) {
            perror("malloc failed!
    ");
            exit(EXIT_FAILURE);
        }
    
        newNode->next = NULL;    
        newNode->data = element;
        if (Q->Rear == NULL) {
            Q->Front = newNode;
            Q->Rear = newNode;
        }
        else {
            Q->Rear->next = newNode;    // 让新结点作为当前尾结点的下一个结点
            Q->Rear = newNode;          // 尾指针指向新结点
        }
    }
    
    /* 出队 */
    void Dequeue(PtrToQueue Q)
    {
        node *delNode = Q->Front;
        if (Q->Front == NULL) {
            printf("队列为空,无法执行出队操作
    ");
        }
        if (Q->Front == Q->Rear) {
            Q->Front = NULL;
            Q->Rear = NULL;
            free(delNode);        // 释放结点内存
        }
        else {
            Q->Front = Q->Front->next;
            free(delNode);        // 释放结点内存
        }
    
    }
    
    /* 遍历队列 */
    void TraverseQueue(PtrToQueue Q)
    {
        node *tmpNode = Q->Front;
        if (tmpNode == NULL) {
            printf("队列为空
    ");
        }
        while(tmpNode != NULL) {
            printf("%d ", tmpNode->data);
            tmpNode = tmpNode->next;
        }
        printf("
    ");
    }

       程序运行结果如下:

    参考资料:

    《算法精解 C语言描述》

  • 相关阅读:
    html基础笔记
    webpack实用配置总结
    Vue生命周期
    Vue跨域解决方法
    日历
    绝对地址和相对地址
    HTML+CSS要点
    (利用DOM)在新打开的页面点击关闭当前浏览器窗口
    前端面试
    前端工程师的知识体系
  • 原文地址:https://www.cnblogs.com/tongye/p/10782983.html
Copyright © 2020-2023  润新知