美文网首页
数据结构与算法——队列之链式队列

数据结构与算法——队列之链式队列

作者: A慢慢懂 | 来源:发表于2020-04-18 14:35 被阅读0次

本节主要介绍下队列的链式存储方式,链式毫无疑问也是有队头front和队尾rear,队头front出队,队尾rear入队,也是先进先出的原则。
链式存储结构如下图

队列链式存储.png

1、定义
首先创建结点结构:数据域和指针域。然后是队列的结构:队头、队尾、队长(可有可无根据需求)

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */

typedef int Status;

typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */

//结点结构
typedef struct SqNode{
    QElemType data;
    struct SqNode *next;
}SqNode,*node;
//队头、队尾
typedef struct{
    node front,rear;
    //队列的长度
    int length;
}SqQueue;

2、初始化
初始化队列,队头front指向队尾rear,next=NULL。

Status InitSqQueue(SqQueue *Q){
    //队头队尾指向同一个存储空间
    Q->front = Q->rear = (node)malloc(sizeof(SqNode));
    if (!Q->rear) {
        return ERROR;
    }
    Q->length = 0;
    //头结点的指针置空
    Q->front->next = NULL;
    return OK;
};

3.销毁队列
销毁链式队列,需要把之前指针指向空间给释放,不然容易造成野指针。

Status DestorySqQueue(SqQueue *Q){
    Q->length = 0;
    while (Q->front) {
        Q->rear = Q->front;
        node p = Q->front;
        Q->front = p->next;
        free(p);
    }
    return OK;
}

4.清空队列

Status ClearSqQueue(SqQueue *Q){
    node p,q;
    //记录头和尾的位置
   q =  p = Q->front;
    //1、先将队尾指向队头
    Q->rear = Q->front;
    //2、队头的指针为空
    Q->front->next = NULL;
    //3、销毁队列元素
    while (p) {
        q = p->next;
        p = q;
        free(q);
    }
    Q->length = 0;
    return OK;
}

5.对尾插入元素

Status InsertSqQueue(SqQueue *Q,int e){
//创建新的结点
    node temp = (node)malloc(sizeof(SqNode));
//结点数据域为e。
    temp->data = e;
//结点的next置为NULL
    temp->next = NULL;
//队列队尾的next=temp,
    Q->rear->next = temp;
//队尾后移
    Q->rear = temp;
//队长长队+1
    Q->length++;
    return OK;
}

6.删除队头元素,并返回删除队元素的值

Status DeleteSqQueue(SqQueue *Q,QElemType *e){
    //判断队列是否为空队列
    if (Q->rear == Q->front) {
        return ERROR;
    }
    node deleteNode;
//由于在创建的时候有一个空结点,入队的时候直接是把rear->next 为新的结点,所以获取队头获取的是front->next;
    deleteNode = Q->front->next;
    //取值
    *e = deleteNode->data;
//队头后移
    Q->front = deleteNode->next;
//释放结点
    free(deleteNode);
//长度--
    Q->length--;
    return OK;
}

7.获取队头元素

Status FrontSqQueue(SqQueue Q,QElemType *e){
    //判断队列是否为空队列
    if (Q.rear == Q.front) {
        return ERROR;
    }
    *e = Q.front->next->data;
    return OK;
}

9.获取队尾元素

Status RearSqQueue(SqQueue Q,QElemType *e){
    //判断队列是否为空队列
       if (Q.rear == Q.front) {
           return ERROR;
       }
       *e = Q.rear->data;
       return OK;
}

10.遍历队列(遍历不能改变队列哟!!!)

Status TraverseSqQueue(SqQueue Q){
    //判断队列是否为空队列
    if (Q.rear == Q.front) {
        return ERROR;
    }
    node p = Q.front->next;
    node q ;
    while (p) {
        q = p;
        printf("%d ",q->data);
        p = q->next;
    }
    printf("\n");
    return OK;
}

有什么错误的地方欢迎指出。

相关文章

网友评论

      本文标题:数据结构与算法——队列之链式队列

      本文链接:https://www.haomeiwen.com/subject/bgucvhtx.html