欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MyDS 带头节点的循环双向链表实现双端队列

程序员文章站 2022-03-16 08:52:31
...
//带头节点循环队列
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct QNode{
    int data;
    struct QNode *next;
    struct QNode *prior;
}QNode;
typedef struct DQueue{
    QNode *front;
    QNode *rear;
}DQueue;
void initDQueue(DQueue *Q){
    QNode *fir=(QNode*)malloc(sizeof(QNode));
    fir->prior=fir;
    fir->next=fir;
    Q->front=fir,Q->rear=fir;

}
void inDQueue(DQueue *Q,int x){
    QNode *now=(QNode*)malloc(sizeof(QNode));
    now->data=x;
    now->prior=Q->rear;
    now->next=Q->rear->next;
    Q->rear->next=now;
    Q->front->prior=now;
    Q->rear=now;
}
void outDQueue(DQueue *Q){
    if(Q->front==Q->rear) return ;
    QNode *now=Q->front->next;
    now->next->prior=Q->front;
    Q->front->next=Q->front->next->next;
    if(now==Q->rear) Q->rear=Q->front;//如果删的是最后一个记得修改尾指针
    free(now);
}
void print_first_to_end(DQueue *Q){
    puts("print_first_to_end:");
    QNode *now=Q->front;
    if(Q->front==Q->rear) return ;
    while(now!=Q->rear){
        now=now->next;
        printf("%d ",now->data);
    }
    puts("");
}
void print_end_to_first(DQueue *Q){
    puts("print_end_to_first:");
    QNode *now=Q->rear;
    if(Q->front==Q->rear) return ;
    while(now!=Q->front){
        printf("%d ",now->data);
        now=now->prior;
    }
    puts("");
}
int main(){
    DQueue *Q=(DQueue*)malloc(sizeof(DQueue));
    initDQueue(Q);
    inDQueue(Q,1);
    print_first_to_end(Q);print_end_to_first(Q);
    outDQueue(Q);
    print_first_to_end(Q);print_end_to_first(Q);
    for(int i=1;i<=10;i++)inDQueue(Q,i);
    print_first_to_end(Q);print_end_to_first(Q);
    for(int _=1;_<=5;_++) outDQueue(Q);
    print_first_to_end(Q);print_end_to_first(Q);
    for(int i=1;i<=7;i++)inDQueue(Q,i+10);
    print_first_to_end(Q);print_end_to_first(Q);
    for(int _=1;_<=8;_++) outDQueue(Q);
    print_first_to_end(Q);print_end_to_first(Q);
    return 0;
}