C語言隊列入門程序舉例

**

C語言隊列入門程序舉例

**
程序功能
創建一個7個數據的循環隊列,創建完成後立即返回排頭和隊尾元素指針,並返回隊中元素,然後將倒數三個元素退隊,退隊後返回退隊元素是什麼,然後再返回隊中元素和現在的排頭和隊尾指針。

源代碼

main.h
#include <stdio.h>
#include <math.h>
#include "Queue.h"


//函數聲明
void InitQueue(Queue *Q);
void EnQueue(Queue *Q, int key);
int DeQueue(Queue *Q);
int IsQueueEmpty(Queue *Q);
int IsQueueFull(Queue *Q);
Queue.h
#include <stdio.h>
#include <stdlib.h>
typedef struct queue
{
        int queuesize;   //數組的大小
        int head, tail;  //隊列的頭和尾下標
        int *q;          //數組頭指針
}Queue;
main.c
#include "main.h"

void main()
{
    Queue example1,example2,*Q,*X;
    int i,key,size,*h,*t;
    Q=&example1;
    X=&example2;
    InitQueue(Q);
    InitQueue(X);
    printf("請輸入七個整數\n");
    for(i=0;i<7;i++)
    {
        scanf("%d",&key);
        EnQueue(Q,key);
    }
    //遍歷隊列
    h=&Q->q[Q->head];
    t=&Q->q[Q->tail-1];
    size=(int)(fabs((double)((Q->tail)-(Q->head)))); //隊列中現有的元素個數
    printf("輸入完成\n您創建的隊列的排頭指針爲\n%d\n隊尾指針爲\n%d\n隊中各元素分別爲\n",h,t);
    if(size==0)
        printf("隊列爲空\n");
    else
        for(i=0;i<size;i++)
            printf("%d\t",Q->q[(Q->head+i)%(Q->queuesize)]);

    //寄存其餘元素
    InitQueue(X);
    for(i=0;i<size-3;i++)
        EnQueue(X,DeQueue(Q));
    for(i=3;i>0;i--)
        printf("\n退隊的倒數第%d個元素爲\n%d\n",i,DeQueue(Q));


    //恢復原隊列剩餘元素
    for(i=0;i<size-3;i++)
        EnQueue(Q,DeQueue(X));

    //遍歷剩餘元素並輸出頭尾指針
    h=&Q->q[Q->head];
    t=&Q->q[Q->tail-1];
    size=(int)(fabs((double)((Q->tail)-(Q->head)))); //隊列中現有的元素個數
    printf("此時隊列的排頭指針爲\n%d\n隊尾指針爲\n%d\n隊中剩餘各元素分別爲\n",h,t);
    if(size==0)
        printf("隊列爲空\n");
    else
        for(i=0;i<size;i++)
            printf("%d\t",Q->q[(Q->head+i)%(Q->queuesize)]);

}
Queue.c
void InitQueue(Queue *Q)//初始化隊列
{
        Q->queuesize = 8;
        Q->q = (int *)malloc(sizeof(int) * Q->queuesize); //分配內存
        Q->tail = 0;
        Q->head = 0;
}

void EnQueue(Queue *Q, int key)//入隊
{
        int tail = (Q->tail+1) % Q->queuesize; //取餘保證,當quil=queuesize-1時,再轉回0
        if (tail == Q->head)                   //此時隊列沒有空間
        {
            printf("隊列已滿\n");
        }
        else
        {
            Q->q[Q->tail] = key;
            Q->tail = tail;
        }
}

int DeQueue(Queue *Q)//退隊
{
        int tmp;
        if(Q->tail == Q->head)     //判斷隊列不爲空
        {
            tmp=0;
            printf("隊列爲空\n");
        }
        else
        {
            tmp = Q->q[Q->head];
            Q->head = (Q->head+1) % Q->queuesize;
        }
        return tmp;
}


int IsQueueEmpty(Queue *Q)//判斷隊列是否爲空
{
        if(Q->head == Q->tail)
        {
            printf("隊列爲空\n");
            return 0;
        }
        else
        {
            printf("隊列不爲空\n");
            return 0;
        }
}

int IsQueueFull(Queue *Q)//判斷隊列是否爲滿
{
    if((Q->tail+1)% Q->queuesize == Q->head)
    {
        printf("隊列已滿\n");
        return 0;
    }
    else
    {
        printf("隊列未滿\n");
        return 0;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章