数据结构单链队列——链式存储实现

数据结构作业之四,保留做模板

#include<string.h>
#include<ctype.h>
#include<malloc.h> // malloc()等
#include<limits.h> // INT_MAX等
#include<stdio.h> // EOF(=^Z或F6),NULL
#include<stdlib.h> // atoi()
#include<io.h> // eof()
#include<math.h> // floor(),ceil(),abs()
#include<process.h> // exit()
#include<iostream> // cout,cin
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
// #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE

typedef int QElemType;
//单链队列--队列的链式存储结构
typedef struct QNode
{
    QElemType data;
    QNode *next;
}*QueuePtr;

struct LinkQueue
{
    QueuePtr front,rear; // 队头、队尾指针
    int length;
};

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

Status DestroyQueue(LinkQueue &Q)
{
    /// 销毁队列Q(无论空否均可)
    Q.length=0;
    while(Q.front)
    {
        Q.rear=Q.front->next;
        free(Q.front);
        Q.front=Q.rear;
    }
    return OK;
}

Status ClearQueue(LinkQueue &Q)
{
    /// 将Q清为空队列
    Q.front->next=NULL;
    Q.rear=Q.front->next;
    Q.length=0;
    return OK;
}

Status QueueEmpty(LinkQueue Q)
{
    /// 若Q为空队列,则返回TRUE,否则返回FALSE
    if(Q.front==Q.rear)return TRUE;
    else return FALSE;
}

int QueueLength(LinkQueue Q)
{
    /// 求队列的长度
    return Q.length;
}

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

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

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

Status QueueTraverse(LinkQueue Q,void(*vi)(QElemType))
{
    /// 从队头到队尾依次对队列Q中每个元素调用函数vi()。一旦vi失败,则操作失败
    QueuePtr p;
    p=Q.front->next;
    while(p)
    {
        vi(p->data);
        p=p->next;
    }
    printf("\n");
    return OK;
}

void visit(QElemType i)
{
    printf("%d ",i);
}

int main()
{
    int i;
    QElemType d;
    LinkQueue q;
    i=InitQueue(q);
    if(i)
        printf("成功地构造了一个空队列!\n");
    printf("是否空队列?%d(1:空 0:否)  ",QueueEmpty(q));
    printf("队列的长度为%d\n",QueueLength(q));
    EnQueue(q,-5);
    EnQueue(q,5);
    EnQueue(q,10);
    printf("插入3个元素(-5,5,10)后,队列的长度为%d\n",QueueLength(q));
    printf("是否空队列?%d(1:空 0:否)  ",QueueEmpty(q));
    printf("队列的元素依次为:");
    QueueTraverse(q,visit);
    i=GetHead(q,d);
    if(i==OK)
        printf("队头元素是:%d\n",d);
    DeQueue(q,d);
    printf("删除了队头元素%d\n",d);
    i=GetHead(q,d);
    if(i==OK)
        printf("新的队头元素是:%d\n",d);
    ClearQueue(q);
    printf("清空队列后,q.front=%u q.rear=%u q.front->next=%u\n",q.front,q.rear,q.front->next);
    DestroyQueue(q);
    printf("销毁队列后,q.front=%u q.rear=%u\n",q.front, q.rear);
}
posted @ 2017-11-20 19:29  KuroNekonano  阅读(170)  评论(0编辑  收藏  举报