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;
}
下一篇: 双向链表的创建(带头节点&不带头节点)