1. 程式人生 > >鏈式佇列的實現

鏈式佇列的實現

今天實現以下鏈式的佇列,首先,要清楚對列是什麼:
佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(head)進行刪除操作,而在表的後端(tail)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。
這裡寫圖片描述
所以總結一下佇列就是後進前出的一種資料結構,在這裡,我們首先來寫出鏈佇列的實現。

linked_queue.h

#define _CRT_SECURE_NO_WARNINGS 1

#ifndef __QUEUE_H__
#define __QUEUE_H__


#include<stdio.h>
#include<stdlib.h>
#include<assert.h> typedef int datatype; typedef struct queue { datatype data; struct queue *next; }Quenode,*PtrQueue; typedef struct queue_list { PtrQueue Head; PtrQueue Tail; }LinkQueue, *pLinkQueue; enum { EXIT, INIT, DESTORY, CLEAR, LENGTH, ENQUEUE, DEQUEUE, PRINTQUEUE }; void
InitQueue(pLinkQueue q); void DestoryQueue(pLinkQueue q); void ClearQueue(pLinkQueue q); int QueueIsEmpty(pLinkQueue q); int QueueLength(pLinkQueue q); void GetHead(pLinkQueue q, datatype *p); void EnQueue(pLinkQueue q ,datatype x); void Dequeue(pLinkQueue q); void PrintQueue(pLinkQueue q); void
menu(); #endif //!__QUEUE_H__

linked_queue.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"queue.h"


void menu()
{
    printf("$$$$$$$$$$$$$$    QUEUE    $$$$$$$$$$$$$$$$\n");
	printf("$$$$$$$$$$$$$$$$$$$$$¥$$$$$$$$$$$$$$$$$$$$\n");
	printf("$$$  1.init            2.destory        $$$\n");
    printf("$$$  3.clear           4.length         $$$\n");
    printf("$$$  5.enqueue         6.dequeue        $$$\n");
    printf("$$$  7.printqueue      0.EXIT           $$$\n");
    printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");

}
void InitQueue(pLinkQueue q)
{
    assert(q);
    q->Head = q->Tail = (PtrQueue)malloc(sizeof(Quenode));
    if (q->Head == NULL)
    {
        printf("out of memory");
        exit(EXIT_FAILURE);
    }
    q->Head->next = NULL;

}

void DestoryQueue(pLinkQueue q)
{
    assert(q);
    while (q->Head != NULL)
    {
        q->Tail = q->Head->next;
        free(q->Head);
        q->Head = q->Tail;
    }
}

void ClearQueue(pLinkQueue q)
{
    assert(q);
    PtrQueue p = q->Head->next;
    while (p != NULL)
    {
        PtrQueue tmp = p;
        p = p->next;
        free(tmp);
        tmp = NULL;
    }
    p = q->Head;
    q->Head = q->Tail = NULL;
    free(p);
}

int QueueIsEmpty(pLinkQueue q)
{
    assert(q);

    if (q->Head == q->Tail)
        return 1;
    else
        return 0;

}

int QueueLength(pLinkQueue q)
{
    assert(q);

    PtrQueue cur = q->Head->next;
    int count = 0;
    while (cur != NULL)
    {
        count++;
        cur = cur->next;
    }
    return count;
}

void GetHead(pLinkQueue q, datatype *p)
{
    assert(q);

    if (QueueIsEmpty(q))
    {
        printf("佇列為空佇列!\n");
    }
    *p = q->Head->data;

}

void EnQueue(pLinkQueue q , datatype x)
{
    assert(q);
    PtrQueue cur = q->Head;
    PtrQueue newnode = (PtrQueue)malloc(sizeof(Quenode));
    if (newnode == NULL)
    {
        printf("out of memory");
        exit(EXIT_FAILURE);
    }
    newnode->data = x;
    newnode->next = NULL;
    while (cur->next != NULL)
    {
        cur = cur->next;
    }
    cur ->next= newnode;
    q->Tail = newnode;
}

void Dequeue(pLinkQueue q)
{
    assert(q);
    PtrQueue del = NULL,cur=NULL;
    if (q->Head == q->Tail)
    {
        printf("佇列為空\n");
        return;
    }
    cur = q->Head->next;
    del = cur;
    q->Head ->next= cur->next;
    free(del);
    del = NULL;

}

void PrintQueue(pLinkQueue q)
{
    assert(q);
    PtrQueue cur = q->Head->next;
    if (q->Head == q->Tail)
        return;

    while (cur != NULL)
    {
        printf("%3d", cur->data);
        cur = cur->next;
    }
    printf("\n");
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1


#include"queue.h"


void Test()
{
    LinkQueue que;
    int input =1 ;
    int length = 0;
    datatype x = 0;
    InitQueue(&que);
    while (input)
    {
        menu();
        printf("請選擇:");
        scanf("%d", &input);
        switch (input)
        {
        case EXIT:
            DestoryQueue(&que);
            break;
        case INIT:
            InitQueue(&que);
            break;
        case DESTORY:
            DestoryQueue(&que);
            break;
        case CLEAR:
            ClearQueue(&que);
            break;
        case LENGTH:
            length=QueueLength(&que);
            printf("%d\n", length);
            break;
        case ENQUEUE:
            printf("請輸入你所要入隊元素的值:");
            scanf("%d", &x);
            fflush(stdin);
            EnQueue(&que,x);
            break;
        case DEQUEUE:
            Dequeue(&que);
            break;
        case PRINTQUEUE:
            PrintQueue(&que);
            break;
        default:
            input = 1 ;
            break;
        }

    }



}

int main()
{
    Test();
    system("pause");
    return 0;
}