基本數據結構 -- 隊列(鏈表實現)

  上一篇簡單介紹了使用數組實現一個隊列的方法,本文使用鏈表來實現隊列:node

#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語言描述》spa

相關文章
相關標籤/搜索