链队列的c语言实现

写于 2015-06-11

可能有错误,感谢指出


#include<stdio.h>
#include<stdlib.h>
#define QUEUE_MAX_SIZE 100
typedef int Status;
typedef int QElemtype;
typedef struct QNode{
    QElemtype data;
    struct QNode *next;
}*QueuePtr;
typedef struct{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;

Status InitQueue(LinkQueue &Q){
    Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
    if(!Q.front) return 0;
    Q.front->next=NULL;
    return 1;
}

Status DestoryQueue(LinkQueue &Q){
    while(Q.front){
        Q.rear=Q.front->next;
        free(Q.front);
        Q.front=Q.rear;
    }
    return 1;
}

Status ClearQueue(LinkQueue &Q){
    while(Q.front){
        Q.rear=Q.front->next;
        Q.front->data=NULL;
        Q.front=Q.rear;
    }
    return 1;
}

Status IsQueueEmpty(LinkQueue &Q){
    if(Q.front==Q.rear)return 1;
    return 0;
}

Status QueueLength(LinkQueue &Q){
    QNode *p;
    int i=0;
    p=Q.front;
    while(p->next){
        p=p->next;
        i++;
    }
    return i;
}

Status GetHead(LinkQueue &Q,QElemtype &e){
    if(Q.front==Q.rear) return 0;
    e=Q.front->next->data;
    return 1;
}

Status EnQueue(LinkQueue &Q,QElemtype e){
    QueuePtr p;
    p=(QueuePtr)malloc(sizeof(QNode));
    if(!p) return 0;
    p->data=e;p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
    return 1;
    
}

Status DeQueue(LinkQueue &Q,QElemtype &e){
    QueuePtr p;
    p=Q.front->next;
    if(Q.front==Q.rear) return 0;
    e=p->data;
    Q.front->next=p->next;
    if(Q.rear==p) Q.rear=Q.front;
    free(p);
    return 1;
}

Status PrintQueue(LinkQueue &Q){
    QNode *p;
    p=Q.front;
    while(p->next){
        p=p->next;
        printf("%d\n",p->data);
    }
    return 1;
}

int main(){
    LinkQueue q;
    InitQueue(q);
    int set,isclose;
    QElemtype e;
    while(1){
        set=0;
        printf(" 1.队尾插入元素\n 2.删除队头元素并输出\n 3.输出队列的长度\n 4.销毁队列\n 5.得到队头元素 \n 6.查询该队列是否为空 \n 7.输出整个队列中的所有元素\n 8.建立队列(在销毁后重建)\n");
        scanf("%d",&set);
        switch(set){
            case 1:printf("请输入元素\n");scanf("%d",&e);if(EnQueue(q,e)) printf("插入成功\n");else printf("插入失败\n"); break;
            case 2:if(DeQueue(q,e))printf("%d\n",e);else printf("队列里无元素\n");break;
            case 3:printf("%d\n",QueueLength(q));break;
            case 4:if(DestoryQueue(q)) printf("销毁成功\n");break;
            case 5:if(GetHead(q,e)) printf("%d\n",e);break;
            case 6:if(IsQueueEmpty(q)) printf("队列为空\n"); else printf("队列不为空\n");break;
            case 7:PrintQueue(q);break;
            case 8:if(InitQueue(q))printf("建立成功\n");break;
        }
        printf("结束输入0\n");
        scanf("%d",&isclose);
        if(!isclose) break;
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值