zoukankan      html  css  js  c++  java
  • 纯C语言实现链队

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int QElemType;
    
    typedef struct QNode{
        QElemType data;
        struct QNode *next;
    }QNode;
    
    typedef struct{
        QNode *front;
        QNode *rear;
    }LinkQueue;
    
    LinkQueue *InitQueue(LinkQueue *Q); //初始化
    LinkQueue *DestroyQueue(LinkQueue* Q);//销毁
    void ClearQueue(LinkQueue *Q);//清空
    int QueueEmpty(LinkQueue *Q);//判空
    int QueueLength(LinkQueue *Q);//队列长度
    QElemType GetHead(LinkQueue *Q);//获取队头元素
    int EnQueue(LinkQueue *Q, QElemType e);//插入新元素到队尾
    int DeQueue(LinkQueue *Q, QElemType *e);//删除队头元素
    void QueueTraverse(LinkQueue *Q);//遍历
    
    //初始化
    LinkQueue *InitQueue(LinkQueue *Q){
        Q = (LinkQueue *)malloc(sizeof(LinkQueue));
        //共同指向头节点
        Q->front = Q->rear = (QNode *)malloc(sizeof(QNode));
        Q->front->next = NULL;
        printf("初始化成功
    ");
        return Q;
    }
    
    //销毁,返回一个空指针
    LinkQueue *DestroyQueue(LinkQueue* Q){
        QNode *p = Q->front->next;
        QNode *r = p->next;
        while(r){
            free(p);
            p = r;
            r = p->next;
        }
        free(Q->front);
        free(Q);
        printf("销毁成功
    ");
        return NULL;
    }
    
    //清空
    void ClearQueue(LinkQueue *Q){
        QNode *p = Q->front->next;
        while(p){
            p->data = 0;
            p = p->next;
        }
        printf("清空成功
    ");
    }
    
    //判空
    int QueueEmpty(LinkQueue *Q){
        return Q->rear==Q->front;
    }
    
    //队列长度
    int QueueLength(LinkQueue *Q){
        int len = 0;
        QNode *p = Q->front->next;
        while(p){
            len++;
            p = p->next;
        }
        return len;
    }
    
    //获取队头元素
    QElemType GetHead(LinkQueue *Q){
        if(Q->front != Q->rear){
            printf("队头元素是%d
    ", Q->front->next->data);
            return Q->front->next->data;
        }else{
            printf("空链队,无头元素
    ");
            return NULL;
        }
    }
    
    //插入新元素到队尾
    int EnQueue(LinkQueue *Q, QElemType e){
        QNode *p = (QNode *)malloc(sizeof(QNode));
        p ->data = e;
        p->next = NULL;
        Q->rear->next = p;
        Q->rear = p;
        printf("元素%d插入成功
    ", e);
        return 1;
    }
    
    //删除队头元素
    int DeQueue(LinkQueue *Q, QElemType *e){
        if(Q->front == Q->rear){
            printf("空链队,删除失败
    ");
            return 0;
        }
        QNode *p = Q->front->next;
        *e = p->data;
        printf("%d元素出链队
    ", *e);
        Q->front->next = p->next;
        //最后一个元素被删除,队尾指针指向头节点
        if(Q->rear == p) Q->rear=Q->front;
        free(p);
        return 1;
    }
    
    //遍历
    void QueueTraverse(LinkQueue *Q){
        if(Q->front == Q->rear){
            printf("空链队
    ");
            return;
        }
        QNode *p = Q->front->next;
        while(p){
            printf("%d ", p->data);
            p = p->next;
        }
        printf("
    ");
    }
    
    int main()
    {
        LinkQueue *Q = NULL;
        QElemType e = NULL;
    
        //初始化测试
        Q = InitQueue(Q);
    
    //    //判空测试
    //    if(QueueEmpty(Q)){
    //        printf("空链栈
    ");
    //    }
    //    EnQueue(Q, 1);
    //    if(QueueEmpty(Q)){
    //        printf("空链栈
    ");
    //    }
    //    DeQueue(Q, &e);
    //    if(QueueEmpty(Q)){
    //        printf("空链栈
    ");
    //    }
    
    //    //长度测试
    //    printf("链队长度为%d
    ", QueueLength(Q));
    //    EnQueue(Q, 1);
    //    EnQueue(Q, 2);
    //    printf("链队长度为%d
    ", QueueLength(Q));
    //    DeQueue(Q, &e);
    //    DeQueue(Q, &e);
    //    printf("链队长度为%d
    ", QueueLength(Q));
    
    //    //遍历测试
    //    QueueTraverse(Q);
    
    //    //获取头元素测试
    //    e = GetHead(Q);
    //    EnQueue(Q, 1);
    //    EnQueue(Q, 2);
    //    e = GetHead(Q);
    //    DeQueue(Q, &e);
    //    e = GetHead(Q);
    
    
    //    //入队测试
    //    EnQueue(Q, 1);
    //    EnQueue(Q, 2);
    //    EnQueue(Q, 3);
    //    EnQueue(Q, 4);
    //    EnQueue(Q, 5);
    //    EnQueue(Q, 6);
    //    EnQueue(Q, 7);
    //    QueueTraverse(Q);
    
    //    //出队测试
    //    EnQueue(Q, 1);
    //    EnQueue(Q, 2);
    //    EnQueue(Q, 3);
    //    EnQueue(Q, 4);
    //    QueueTraverse(Q);
    //    DeQueue(Q, &e);
    //    printf("测试e是否改变:%d
    ",e);
    //    DeQueue(Q, &e);
    //    printf("测试e是否改变:%d
    ",e);
    //    QueueTraverse(Q);
    
    
    //    //清空测试
    //    EnQueue(Q, 1);
    //    EnQueue(Q, 2);
    //    ClearQueue(Q);
    //    QueueTraverse(Q);
    
        //销毁测试
        EnQueue(Q, 1);
        EnQueue(Q, 2);
        Q = DestroyQueue(Q);
        QueueTraverse(Q);
    }
    作者:PowerZZJ
    本博客文章大多为原创,转载请请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    15 鼠标事件
    09 属性操作
    06 DOM操作之插入节点
    03 如何处理多个库$冲突的问题
    01 jquery引入
    08 千千音乐盒实现全选和反选
    03 衣服相册切换效果
    02 显示和隐藏图片
    01 图片切换
    派生
  • 原文地址:https://www.cnblogs.com/powerzzjcode/p/10889121.html
Copyright © 2011-2022 走看看