码迷,mamicode.com
首页 > 其他好文 > 详细

链队列

时间:2017-11-26 15:01:21      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:出队   scanf   efi   入队   stat   写法   color   lin   ret   

 

#include<bits/stdc++.h>
#define OK 1
#define ERROR 0
using namespace std;

typedef int Status;
typedef int ElemType;

typedef struct QNode
{
    ElemType data;
    struct QNode *next;
}*Node;

typedef struct
{
    Node front;
    Node rear;
    int len;
}LinkQueue;
///初始化
Status Init(LinkQueue &Q)
{
    Node p;
    p=(Node)malloc(sizeof(QNode));
    if(p)
    {
        Q.front=Q.rear=p;
        p->next=NULL;
        Q.len=0;
        return OK;
    }
    else
        return ERROR;
}
///判断队列是否为空
bool EmptyQueue(LinkQueue Q)
{
    if(Q.front == Q.rear)
    {
        return true;
    }
    else
    {
        return ERROR;
    }
}
///入队
Status Push(LinkQueue &Q, ElemType e)
{
    Node p;
    p=(Node)malloc(sizeof(QNode));
    if(!p)
        exit(1);
    p->data=e;
    p->next=NULL; ///注意此处,刚开始没有想到,只有 p->next = NULL 才确定p是尾部
    Q.rear->next=p;
    Q.rear=p;
    Q.len++;
    return OK;
}
///出队
int Pop(LinkQueue &Q,ElemType &e)
{
    if(Q.front == Q.rear)
    {
        printf("链队列没有元素\n");
        return ERROR;
    }
    else
    {
        Node p;
        p=Q.front->next;
        e=p->data;
        Q.front->next=p->next;
        if(Q.rear ==  p)
            Q.rear=Q.front;
        free(p);
        Q.len--;
        return e;
    }
}
///求队列长度
int QueueLength(LinkQueue Q)
{
    return Q.len;
}
///销毁队列
Status DestroyQueue(LinkQueue &Q)
{
    while(Q.front)
    {
        Q.rear=Q.front->next;
        free(Q.front);
        Q.front=Q.rear;
    }
    return OK;
}

///清空队列
Status ClearQueue(LinkQueue &Q)
{
    DestroyQueue(Q);
    Init(Q);
    return OK;
}

/*另一种思路写法
Status ClearQueue(LinkQueue &Q)
{
    Node p,q;
    p=Q.front->next;
    while(p)
    {
        q=p;
        p=p->next;
        free(q);
    }
    Q.rear=Q.front;
    Q.len=0;
    return OK;

}另一种思路写法*/

Status Print(LinkQueue Q)
{
    Node p;
    p=Q.front->next;
    while(p!=Q.rear)
    {
        printf("%d--",p->data);
        p=p->next;
    }
    printf("%d\n",Q.rear->data);
    return OK;
}

int main()
{
    int n;
    LinkQueue Q;
    Init(Q);
    printf("请输入入队元素(以0为结束标志):");
    while(~scanf("%d",&n))
    {
        if(n == 0)
            break;
        Push(Q,n);
    }
    if(EmptyQueue(Q))
        printf("YES,kong\n");
    else
        printf("NO kong\n");
    printf("队列的长度为:%d\n",QueueLength(Q));
    printf("遍历队首到队尾的元素:\n");
    Print(Q);
    printf("------------------------------\n");
    int e;
    printf("出队的队首元素为:%d\n",Pop(Q,e));
    printf("队列的长度为:%d\n",QueueLength(Q));
    printf("遍历队首到队尾的元素:\n");
    Print(Q);
    printf("------------------------------\n");
    printf("Clear queue...\n");
    ClearQueue(Q);
    if(EmptyQueue(Q))
        printf("YES,kong\n");
    else
        printf("NO kong\n");
    printf("------------------------------\n");
    return 0;
}
/*
1 2 3 4 5 0
*/

 

链队列

标签:出队   scanf   efi   入队   stat   写法   color   lin   ret   

原文地址:http://www.cnblogs.com/hhkobeww/p/7898843.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!