双向队列的实现

#include<stdio.h>

#include<stdlib.h>

typedef struct Node {

    int data;

    struct Node* back;

    struct Node* next;

}Node,*Linklist;

void push(int action,Linklist head1,Linklist head2,Linklist *rear1,Linklist *rear2) {

    printf("请输入要压入的数据 : ");

    int value;

    scanf_s("%d",&value,sizeof(int));

    getchar();

    Linklist node = (Linklist)malloc(sizeof(Node));

    if (node == NULL) {

        printf("\n申请空间失败,压入失败!\n");

        return;

    }

    node->data = value;

    if (action == 1) {

        node->back = NULL;

        if (*rear1 == NULL) {

            head2->back = node;

            *rear2 = node;

        }

        else {

            (*rear1)->back = node;

            node->next = (*rear1);

        }

        *rear1 = node;

        head1->next = *rear1;

    }

    else if (action == 2) {

        node->next = NULL;

        if (*rear2 == NULL) {

            head1->next = node;

            *rear1 = node;

        }

        else {

            (*rear2)->next = node;

            node->back = (*rear2);

        }

        *rear2 = node;

        head2->back = *rear2;

    }

}

void pop(int action, Linklist head1, Linklist head2,Linklist *rear1,Linklist *rear2) {

    Linklist p = NULL;

    if (action == 1) {

        p = head1->next;

        if (p == NULL) {

            printf("\n队列为空!\n");

        }

        else {

            head1->next = p->next;

            *rear1 = p->next;

            (*rear1)->back = NULL;

            free(p);

        }

    }else if(action = 2) {

        p = head2->back;

        if (p == NULL) {

            printf("\n队列为空!\n");

        }

        else {

            head2->back = p->back;

            *rear2 = p->back;

            (*rear2)->next = NULL;

            free(p);

        }

    }

}

void show(Linklist head1) {

    Linklist p = head1->next;

    printf("\n");

    while ( p != NULL) {

        printf("%d ", p->data);

        p = p->next;

    }

}

int main() {

    Linklist head1 = (Linklist)malloc(sizeof(Node));

    if (head1 == NULL) {

        printf("开辟空间失败1!\n");

    }

    head1->next = NULL;

    Linklist head2 = (Linklist)malloc(sizeof(Node));

    if (head2 == NULL) {

        printf("开辟空间失败2!\n");

    }

    head2->back = NULL;

    Linklist rear1 = NULL, rear2 = NULL;

    int i = 0,action = 0;

    do {

        printf("输入请按1,删除请按2,退出请按3 : ");

        scanf_s("%d",&i,sizeof(int));

        getchar();

        if (i == 1) {

            printf("左输入请按1,右输入请按2 : ");

            scanf_s("%d", &action, sizeof(int));

            push(action,head1,head2,&rear1,&rear2);

        }

        else if (i == 2) {

            printf("左删除请输入1,右删除请输入2");

            scanf_s("%d", &action, sizeof(int));

            pop(action,head1,head2,&rear1,&rear2);

        }

    } while (i != 3);

    show(head1);

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值