美文网首页
数据结构与算法(五)

数据结构与算法(五)

作者: E术家 | 来源:发表于2020-04-14 17:02 被阅读0次

    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 {
        QElemType data[MAXSIZE];
        int front; //头指针
        int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
    }SqQueue;
    

    初始化

    Status InitQueue(SqQueue *Q){
        Q->front = 0;
        Q->rear = 0;
        return OK;
    }
    

    清空

    Status ClearQueue(SqQueue *Q){
        
        Q->front = Q->rear = 0;
        return OK;
    }
    

    判断是否为空

    Status QueueEmpty(SqQueue Q){
        //队空标记
        if (Q.front == Q.rear)
            return TRUE;
        else
            return FALSE;
    }
    

    获取队列长度

    int QueueLength(SqQueue Q){
        return (Q.rear - Q.front + MAXSIZE)%MAXSIZE;
    }
    

    获取队列头元素

    Status GetHead(SqQueue Q,QElemType *e){
        //队列已空
        if (Q.front == Q.rear)
            return ERROR;
        
        *e = Q.data[Q.front];
        return OK;
        
    }
    

    插入新元素

    Status EnQueue(SqQueue *Q,QElemType e){
        
        //队列已满
        if((Q->rear+1)%MAXSIZE == Q->front)
            return ERROR;
        
        //将元素e赋值给队尾
        Q->data[Q->rear] = e;
        
        //rear指针向后移动一位,若到最后则转到数组头部;
        Q->rear = (Q->rear+1)%MAXSIZE;
        
        return OK;
    }
    

    删除元素

    Status DeQueue(SqQueue *Q,QElemType *e){
       
        //判断队列是否为空
        if (Q->front == Q->rear) {
            return ERROR;
        }
        
        //将队头元素赋值给e
        *e = Q->data[Q->front];
        
        //front 指针向后移动一位,若到最后则转到数组头部
        Q->front = (Q->front+1)%MAXSIZE;
        
        return OK;
    }
    

    遍历

    Status QueueTraverse(SqQueue Q){
        int i;
        i = Q.front;
        while ((i+Q.front) != Q.rear) {
            printf("%d   ",Q.data[i]);
            i = (i+1)%MAXSIZE;
        }
        printf("\n");
        return OK;
    }
    

    2.链式队列

    结构体

    // 结点结构
    typedef struct QNode {
        QElemType data;
        struct QNode *next;
    }QNode,*QueuePtr;
    
    // 队列的链表结构
    typedef struct {
        QueuePtr front,rear; // 队头、队尾指针
    }LinkQueue;
    

    初始化

    Status InitQueue(LinkQueue *Q){
        //1. 头/尾指针都指向新生成的结点
        Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
    
        //2.判断是否创建新结点成功与否
        if (!Q->front) {
            return ERROR;
        }
    
        //3.头结点的指针域置空
        Q->front->next = NULL;
        
        return OK;
    }
    

    销毁队列(需要逐个销毁)

    Status DestoryQueue(LinkQueue *Q){
        //遍历整个队列,销毁队列的每个结点
        while (Q->front) {
            Q->rear = Q->front->next;
            free(Q->front);
            Q->front = Q->rear;
        }
        return OK;
    }
    

    清空队列

    Status ClearQueue(LinkQueue *Q){
        
        QueuePtr p,q;
        Q->rear = Q->front;
        p = Q->front->next;
        Q->front->next = NULL;
        
        while (p) {
            q = p;
            p = p->next;
            free(q);
        }
        
        return OK;
    }
    

    判断队列是否为空

    Status QueueEmpty(LinkQueue Q){
        if (Q.front == Q.rear)
            return TRUE;
        else
            return FALSE;
    }
    

    获取队列长度

    int QueueLength(LinkQueue Q){
        int i= 0;
        QueuePtr p;
        p = Q.front;
        while (Q.rear != p) {
            i++;
            p = p->next;
        }
        return i;
    }
    

    插入元素

    Status EnQueue(LinkQueue *Q,QElemType e){
        
        //为入队元素分配结点空间,用指针s指向;
        QueuePtr s = (QueuePtr)malloc(sizeof(QNode));
        
        //判断是否分配成功
        if (!s) {
             return ERROR;
        }
        
        //将新结点s指定数据域.
        s->data = e;
        s->next = NULL;
        
        //将新结点插入到队尾
        Q->rear->next = s;
        
        //修改队尾指针
        Q->rear = s;
        
        return OK;
    }
    

    出队列(移除元素)

    Status DeQueue(LinkQueue *Q,QElemType *e){
        
        QueuePtr p;
        
        //判断队列是否为空;
        if (Q->front == Q->rear) {
            return ERROR;
        }
        
        //将要删除的队头结点暂时存储在p
        p = Q->front->next;
        
        //将要删除的队头结点的值赋值给e
        *e = p->data;
        
        //将原队列头结点的后继p->next 赋值给头结点后继
        Q->front->next = p ->next;
        
        //若队头就是队尾,则删除后将rear指向头结点.
        if(Q->rear == p) Q->rear = Q->front;
        
        free(p);
        
        return OK;
    }
    

    获取队头

    Status GetHead(LinkQueue Q,QElemType *e){
       
        //队列非空
        if (Q.front != Q.rear) {
            //返回队头元素的值,队头指针不变
            *e =  Q.front->next->data;
            return TRUE;
        }
        
        return  FALSE;
        
    }
    

    遍历

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

    相关文章

      网友评论

          本文标题:数据结构与算法(五)

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