双向队列代码实现

双向队列

左插右放,右插左放

image-20221219175841689

双向队列:左插右删,右插左删 是 队列

同侧插入删除 是 栈

可以使用中间结点和两个左右指针,去判断指针怎么走

左插 动右指针

右插 动左指针

左插

左插 左删 栈 (动右指针)

image-20221219185724170

删除 3

左插 右删 队列

image-20221219185734354 删除 1

右插

右插 右删 栈 (动左指针)

image-20221219185936197

删除 3

右插 左删 队列

image-20221219190002569

删除 1

不需要动右指针,只需要把中间结点指向2,2再指向中间结点,释放1就行

#include <stdio.h>
#include <stdlib.h>

typedef struct LinkQueue {
    int element;  // 数据
    struct LinkQueue * pre;   //前指针
    struct LinkQueue * next;  //后指针
}Node;

Node* middle; // 中间结点
Node* left;  // 左指针
Node* right; //右指针

/*   初始化    */
void InitQueue()
{
    middle=(Node*)malloc(sizeof(Node));
    middle->next = NULL;
    middle->pre = NULL;
    /*  左右指针都指向中间结点  */
    left = middle ;
    right = middle ;
}

/*  左插  */
//左插右放   动右指针
void left_push(int key)
{
    Node* new_node = (Node*)malloc(sizeof(Node));
    new_node->element=key;   //存放数据
    right->next = new_node;  //右指针的后指针指向 新结点
    new_node->pre = right;   //新节点的前指针指向 右指针
    new_node->next = NULL;   //新结点的后指针指向 NULL
    right = right->next;     //右指针挪动到新结点的位置
}

/*  左删  */

void left_pop()
{
    //如果右指针指向中间结点,代表右插左删形成队列
    //如果没有指向中间结点,代表左插左删形成栈
    if(right == middle)  //队列
    {
        Node* temp = right->pre;
        right->pre = right->pre->pre; //右指针的前指针 指向 前一个的前一个 也就是由指向1到指向2
        right->pre->next=right;  // 右指针的前一个结点的后指针指向中间结点 也就是2指向中间结点
        free(temp);
    }
    else  //栈
    {
        Node* temp = right;
        right = right->pre;  //右指针往前挪一个结点
        right->next = NULL;  //右指针的后指针指向空
        free(temp);
    }
}


/*  右插  */
//尾插
void right_push(int key)
{
    Node * new_node = (Node*)malloc(sizeof(Node));
    new_node->element = key;
    left->pre = new_node;
    new_node->next=left;
    new_node->pre = NULL;
    left = left->pre;

}

/*  右删  */
void right_pop()
{
    //看左指针 如果左指针移动了 代表在进行右插右删
    //如果左指针没有动  代表在进行左插右删
    if(left == middle)
    {
        Node* temp = left->next;
        left->next=left->next->next;
        left->next->pre=left;
        free(temp);
    }
    else
    {
        Node*temp = left;
        left = left->next;
        left->pre = NULL;
        free(temp);
    }
}


int main()
{
    InitQueue();
    left_push(1);
    left_push(2);
    left_push(3);
    Node* temp = middle->next ;
    while(temp!=NULL)
    {
        printf("%d",temp->element);
        temp = temp->next;
    }
    printf("\n");
    right_pop();
    temp=middle->next;
    while(temp!=NULL)
    {
        printf("%d",temp->element);
        temp = temp->next;
    }
    printf("\n");

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tian Meng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值