1. 程式人生 > >教大家怎樣寫佇列?

教大家怎樣寫佇列?

學習日誌3 姓名:繆志超 日期:2018.9.12

今日學習任務 1、佇列的順序 2、鏈式儲存 3、空對:隊頭隊尾重合 4、隊尾指標:指向最後一個元素的後一個 5、自定義函式來實現初始化,清空,輸入,輸出,刪除,銷燬等一系列操作

今日任務完成情況 1、按照課上老師的要求已經全部完成了所有的任務,並且實現了除錯。 2、今天的程式碼開發量已經達到400多行。

今日開發中出現的問題 今天開發中出現的問題自己都能獨立解決。

今日開發收穫 1、學會了如何初始化,清空,輸入,輸出,刪除,銷燬等一系列操作 2、學會了如何佇列的順序儲存

自我感覺 感覺不錯,每天都能學到一些在學校學不到的知識,有成為程式設計師的潛力。

程式程式碼 下面我將我今天寫的程式與大家共勉,如有錯誤還請大家指出,謝謝! 1、首先建一個檔名:queue.c

#include "queue.h"
#include <stdlib.h>
int InitQueue(Q *q)
{
    if(NULL == q)      //入參判斷
    {
        return FAILURE;
    }
    //申請一塊記憶體空間 ,並且讓 data 指標指向 這塊空間 
    q->data = (int *)malloc(sizeof(int)*MAXSIZE);
    if(NULL == q->data)        //返回值判斷(如果申請失敗 )
{ return FAILURE; } q->rear = q->front = 0; //隊頭隊尾 指標指向同一個 return SUCCESS; } int EnterQueue(Q *q,int e) { if(NULL == q) { return FAILURE; } if((q->rear + 1) % MAXSIZE == q->front) // 隊滿 { return FAILURE; } q->data[q->rear] = e; q->rear = (q->rear + 1
) % MAXSIZE; return SUCCESS; } int DelQueue(Q *q) { if(NULL == q) { return FAILURE; } if(q->rear == q->front) //空隊 { return FAILURE; } int e = q->data[q->front]; q->front = (q->front + 1) % MAXSIZE; return e; } int LengthQueue(Q q) { return (q.rear - q.front + MAXSIZE) % MAXSIZE; } int ClearQueue(Q *q) { if(NULL == q) { return FAILURE; } q->rear = q->front; return SUCCESS; } int DestroyQueue(Q *q) { if(NULL == q) { return FAILURE; } free(q->data); //釋放空間 q->data = NULL; return SUCCESS; }

再建一個檔名:main.c

#include <stdio.h>
#include "queue.h"

int main()
{
    int i, ret;
    Q queue;    //定義佇列

    ret = InitQueue(&queue);
    if(SUCCESS == ret)
    {
        printf("Init Success!\n");
    }
    else
    {
        printf("Init Failure!\n");
    }
    for(i=0;i<10;i++)
    {
        ret = EnterQueue(&queue,i+1);
        if(ret == FAILURE)
        {
            printf("Enter Failure!\n");
        }
        else
        {
            printf("Enter %d Success!\n",i+1);
        }

    }
    for(i=0;i<5;i++)
    {
        ret = DelQueue(&queue);
        if(ret == FAILURE)
        {
            printf("Delete Failure!\n");
        }
        else
        {
            printf("Delete %d Success!\n",ret);
        }
    }

    ret = LengthQueue(queue);
    printf("length is %d\n",ret);

    ret = ClearQueue(&queue);
    if(ret == SUCCESS)
    {
        printf("Clear Success!\n");
    }
    else
    {
        printf("Clear Failure!\n"); 
    }

    ret = DestroyQueue(&queue);
    if(ret == SUCCESS)
    {
        printf("Destroy Success!\n");
    }
    else
    {
        printf("Destroy Failure!\n");
    }
    return 0;
}

最後建一個檔名:queue.h

#ifndef QUEUE_H
#define QUEUE_H

#define MAXSIZE   10      //RONGLIANG
#define SUCCESS   1000
#define FAILURE   1001

struct queue
{
    int *data;        //指向佇列的儲存空間
    int front;       //隊頭指標
    int rear;        //隊尾指標
};
typedef struct queue Q;

int InitQueue(Q *q);
int EnterQueue(Q *q,int e);
int DelQueue(Q *q);
int LengthQueue(Q q);
int ClearQueue(Q *q);
int DestroyQueue(Q *q);

#endif

輸入命令:./a.out 除錯結果 :這裡寫圖片描述

2、鏈式儲存

首先建一個檔名:queue.h

#ifndef QUEUE_H
#define QUEUE_H

#define SUCCESS  1000
#define FAILURE  1001

struct node     //結點的資訊
{
    int data;   //資料域
    struct node *next;  //指標域
};
typedef struct node Node;

struct queue          //佇列的資訊
{
    Node *front;     //隊頭指標
    Node *rear;      //隊尾指標
};
typedef struct queue Q;

int InitQueue(Q **q);
int EnterQueue(Q *q,int e);
int DeletQueue(Q *q);
int LengthQueue(Q *q);
int ClearQueue(Q *q);
int EmptyQueue(Q *q);
int DestroyQueue(Q **q);
#endif

再建一個檔名:main.c

#include "queue.h"
#include <stdio.h>

int main()
{
    int i, ret;
    Q *queue;

    ret = InitQueue(&queue);
    if(ret == SUCCESS)
    {
        printf("Init Success!\n");
    }
    else
    {
        printf("Init Failure!\n");
    }

    for (i=0;i<10;i++)
    {
        ret = EnterQueue(queue,i+1);
        if(ret == SUCCESS)
        {
            printf("Enter %d Success!\n",i+1);
        }
        else
        {
            printf("Enter Failure!\n");
        }
    }

    for (i=0;i<6;i++)
    {
        ret = DeleteQueue(queue);
        if(ret == FAILURE)
        {
            printf("Delete Failure!\n");
        }
        else
        {
            printf("Delete %d Success!\n",ret);
        }

    }

    ret = LengthQueue(queue);
    printf("length is %d\n",ret);

    ret = ClearQueue(queue);
    if(ret == SUCCESS)
    {
        printf("Clear Success!\n");
    }
    else
    {
        printf("Clear Failure!\n");
    }

    ret = LengthQueue(queue);
    printf("length is %d\n",ret);

    ret = EmptyQueue(queue);
    if(SUCCESS == ret)
    {
        printf("queue is empty!\n");
    }
    else
    {
        printf("queue is not empty!\n");
    }

    ret = DestroyQueue(&queue);
    if(ret == SUCCESS)
    {
        printf("Destroy Success!\n");
    }
    else
    {
        printf("Destroy Failure!\n");
    }
    return 0;
}

最後建一個檔名:queue.c

#include "queue.h"
#include <stdlib.h>

int InitQueue(Q **q)
{
    if (NULL == q)    //入參判斷
    {
        return FAILURE;
    }

    (*q) = (Q *)malloc(sizeof(Q));  //gei dui lie xinxi shenqing kongjian   
    if(NULL == (*q))
    {
        return FAILURE;
    }

    Node *p = (Node *)malloc(sizeof(Node));//頭結點申請空間
    if (NULL == p)
    {
        return FAILURE;
    }

    (*q)->front = (*q)->rear = p;//隊頭指標 隊尾指標都指向頭結點  

    return SUCCESS;
}

int EnterQueue(Q *q,int e)
{
    if(NULL == q)
    {
        return FAILURE;
    }

    Node *p = (Node *)malloc(sizeof(Node));
    if(NULL == p)
    {
        return FAILURE;
    }
    p->next = NULL;         //指標域
    p->data = e;           //資料域

    q->rear->next = p;
    q->rear = p;

    return SUCCESS;
}

int DeleteQueue(Q *q)
{
    if(NULL == q)
    {
        return FAILURE;
    }
    if(q->rear == q->front)     //空隊
    {
        return FAILURE;
    }

    Node *p = q->front->next;
    int e = p->data;
    q->front->next = p->next;
    free(p);

    if(q->rear == p)      //只剩一個結點的情況
    {
        q->rear = q->front;
    }
    return e;
}

int LengthQueue(Q *q)
{
    if(NULL == q)
    {
        return FAILURE;
    }
    int length = 0;

    Node *p = q->front->next;
    while(p)         //while(p!=NULL)
    {
        length++;
        p = p->next;
    }
    return length;

}

int ClearQueue(Q *q)
{
    if(NULL == q)   //入參判斷
    {
        return FAILURE;
    }

    Node *p = q->front->next;

    while(p)
    {
        q->front->next = p->next;
        free(p);                  //釋放結點
        p = q->front->next;      //指向新的結點
    }

    q->rear = q->front;         //刪完所有的結點,隊尾指標指向開頭

    return SUCCESS;
}

int EmptyQueue(Q *q)
{
    if(NULL == q)
    {
        return FAILURE;
    }

    return (q->front == q->rear) ? SUCCESS : FAILURE;

}

int DestroyQueue(Q **q)
{
    if(NULL == q)
    {
        return FAILURE;
    }
    free((*q)->front);       //釋放頭結點
    free(*q);            //釋放佇列資訊
    *q = NULL;

    return SUCCESS;
}

除錯命令:./a.out 除錯結果:這裡寫圖片描述