双向队列
左插右放,右插左放
双向队列:左插右删,右插左删 是 队列
同侧插入删除 是 栈
可以使用中间结点和两个左右指针,去判断指针怎么走
左插 动右指针
右插 动左指针
左插
左插 左删 栈 (动右指针)
删除 3
左插 右删 队列
删除 1
右插
右插 右删 栈 (动左指针)
删除 3
右插 左删 队列
删除 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");
}