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

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

#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!\n");
         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!\n");
        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("队列为空,无法执行出队操作\n");
    }
    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("队列为空\n");
    }
    while(tmpNode != NULL) {
        printf("%d ", tmpNode->data);
        tmpNode = tmpNode->next;
    }
    printf("\n");
}

   程序运行结果如下:

 

参考资料:

《算法精解 C语言描述》

posted @ 2019-04-30 16:50  tongye  阅读(1169)  评论(0编辑  收藏  举报