• 《链队列---队列的链式表示和实现》


    //队列的一些基本操作
    /*
    1,构造一个空队列InitQueue(LinkQueue &Q)
    2,销毁队列Q
    3,将Q清为空队列
    4,若队列Q为空队列,则返回TRUE,否则返回FALSE
    5,返回Q元素的个数,即队列的长度
    6,返回队列的队头元素
    7,插入e为队列的新的队尾元素
    8,删除队列的队头元素
    9,依次输出队列中的每一个元素
    */


    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
    #define OVERFLOW -2
    typedef int Status; //函数结果状态类型
    typedef int QElemType; //数据元素类型
    typedef struct QNode
    {
    QElemType data;
    struct QNode *next;
    }QNode,*QueuePtr;
    typedef struct
    {
    QueuePtr front; //队头指针
    QueuePtr rear; //队尾指针
    }LinkQueue;

    //构造一个空队列Q
    Status InitQueue(LinkQueue &Q)
    {
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    if(!Q.front)
    exit(OVERFLOW);
    Q.front->next = NULL;
    return OK;
    }

    //插入元素e为Q的新的队尾元素
    Status EnQueue(LinkQueue &Q,QElemType e)
    {
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QNode));
    if(!p)
    exit(OVERFLOW);
    p->data = e;
    p->next = NULL;
    Q.rear->next = p;
    Q.rear = p;
    return OK;
    }

    //定义QueueLength(LinkQueue Q)函数,返回队列中元素的个数
    Status QueueLength(LinkQueue Q)
    {
    int i = 0;
    while(Q.front->next)
    {
    Q.front = Q.front->next;
    i++;
    }
    return i;

    }

    //定义QueueEmpty(LinkQueue Q)函数,若队列为空,则返回TRUE,否则返回FLASE
    Status QueueEmpty(LinkQueue Q)
    {
    if(Q.front == Q.rear)
    {
    printf("队列为空... ");
    return TRUE;
    }
    else
    {
    printf("队列不为空... ");
    return FALSE;
    }
    }

    //若队列不为空,则用e返回Q的队头元素
    Status GetHead(LinkQueue &Q,QElemType &e)
    {
    QueuePtr p;
    if(Q.front == Q.rear)
    return ERROR;
    p = Q.front->next;
    e = p->data;
    return e;
    }

    //依次输出队列中的每一个元素
    Status Foreach(LinkQueue &Q)
    {
    QueuePtr p;
    if(!Q.front)
    exit(OVERFLOW);
    p = Q.front->next;
    while(p)
    {
    printf("%3d",p->data);
    p = p->next;
    }
    return OK;
    }

    //若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;
    //否则返回ERROR
    Status DeQueue(LinkQueue &Q,QElemType &e)
    {
    QueuePtr p;
    if(!Q.front)
    exit(OVERFLOW);
    p = Q.front->next;
    e = p->data;
    //printf("e=%d",e);
    Q.front->next = p->next;
    if(Q.rear == p)
    Q.rear = Q.front;
    free(p);
    return e;
    }

    //清空一个队列
    Status ClearQueue(LinkQueue &Q)
    {
    Q.front = Q.rear;
    return OK;
    }
    //销毁一个队列Q
    Status DestroyQueue(LinkQueue &Q)
    {
    while(Q.front)
    {
    Q.rear = Q.front->next;
    free(Q.front);
    Q.front = Q.rear;
    }
    return OK;
    }
    //主函数
    int main()
    {
    LinkQueue q;
    int n,i,e;
    //调用InitQueue(LinkQueue &Q)函数,构造一个空队列
    InitQueue(q);
    printf("队列已创建好...");
    printf(" ");

    //调用EnQueue(LinkQueue &Q,QElemType e)函数,插入新的队尾元素
    printf("请输入入队列元素的个数:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
    printf("Please input a integer number:");
    scanf("%d",&e);
    EnQueue(q,e);
    }
    printf(" ");

    //调用QueueLength(LinkQueue Q)函数,输出队列中元素的个数
    printf("队列中的元素个数(即队列的长度)是;%d",QueueLength(q));
    printf(" ");

    //调用GetHead(LindQueue &Q,QElemType &e)函数,输出队头元素
    printf("队头元素是:%d",GetHead(q,e));
    printf(" ");

    //调用Foreach(LinkQueue &Q)函数,依次输出队列中的每一个元素
    printf("遍历队列元素:");
    Foreach(q);
    printf(" ");

    //调用DeQueue(LinkQueue &Q,QElemType &e)函数,删除队头的元素,并打印出来
    printf("被删除的队头元素是:%d",DeQueue(q,e));
    printf(" ");

    //调用ClearQueue(LinkQueue &Q)函数,清空队列
    ClearQueue(q);
    printf("队列已被清空...");
    printf(" ");

    //再次遍历队列
    printf("再次遍历队列的结果是...");
    Foreach(q);
    printf(" ");

    //调用DestroyQueue(LinkQueue &Q)函数,销毁一个队列Q
    printf("队列已被销毁...");
    DestroyQueue(q);
    printf(" ");
    return 0;
    }

     

  • 相关阅读:
    POJ-2393
    POJ-1328
    POJ-2376
    CF-811B
    CF-811A
    CF-816B
    P1111 修复公路
    P2777 [AHOI2016初中组]自行车比赛
    P1889 士兵站队
    P1459 三值的排序 Sorting a Three-Valued Sequence
  • 原文地址:https://www.cnblogs.com/sun-/p/4860077.html
Copyright © 2020-2023  润新知