纯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
本博客文章大多为原创,转载请请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/powerzzjcode/p/10889121.html