数据结构---基于链式存储结构实现的双端队列
链式双端队列
实现方式:双链表
循环双链表也可以实现,但是没有必要
单链表和循环单链表不能实现
操作:
(1)初始化
#include<stdio.h>
#include<stdlib.h>
//链式双端队列
//结点结构
typedef struct Node
{int data;struct Node* pre;struct Node* next;
}Node;
typedef struct
{Node* left;Node* right;
}LinkDouQueue;
//初始化
LinkDouQueue* InitQueue()
{Node* s = (Node*)malloc(sizeof(Node));if(s == NULL){printf("内存申请失败\n");return NULL;}s->pre = s->next = NULL;LinkDouQueue* lq = (LinkDouQueue*)malloc(sizeof(LinkDouQueue));if(lq == NULL){printf("内存申请失败\n");return NULL;}lq->left = lq->right = s;return lq;
}
(2)左边入队
//左边入队
void LeEnQueue(LinkDouQueue* lq,int k)
{Node* s = (Node*)malloc(sizeof(Node));if(s == NULL){printf("内存申请失败\n");return;}s->data = k;lq->left->pre = s;s->next = lq->left;lq->left = s;}
(3)判空
//判空
int isEmpty(LinkDouQueue* lq)
{if(lq->left == lq->right){return 1;//空}return 0;//非空
}
(4)左边出队
//左边出队
void LeDeQueue(LinkDouQueue* lq)
{if(isEmpty(lq) == 1){printf("队列为空\n");return ;}Node* temp = lq->left;lq->left->next->pre = NULL;lq->left = lq->left->next;free(temp);}
(5)右边入队
//右边入队
void RiEnQueue(LinkDouQueue* lq,int k)
{Node* s = (Node*)malloc(sizeof(Node));if(s == NULL){printf("内存申请失败\n");return ;}lq->right->data = k;lq->right->next = s;s->pre = lq->right;lq->right = s;}
(6)右边出队
//右边出队
void RiDeQueue(LinkDouQueue* lq)
{if(isEmpty(lq) == 1){printf("队列为空\n");return ;}Node* temp = lq->right;lq->right = lq->right->pre;lq->right->next = NULL;free(temp);}
(7)输出
//输出
void Print(LinkDouQueue* lq)
{if(lq->left == lq->right){printf("队列为空\n");return ;}Node* temp = lq->left;while(temp != lq->right){printf("%d ",temp->data);temp = temp->next;}
}