顺序存储:预分配的空间耗尽时队满
链式存储:一般不会队满,除非内存不足

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| #include<stdio.h> #include<stdbool.h> #include<stdlib.h>
//队列的链式实现(带头结点和不带头结点) typedef struct LinkNode{ //链式队列结点 int data; struct LinkNode *next; }LinkNode;
typedef struct{ //链式队列 LinkNode *front,*rear; //队列的队头和队尾指针 //int length; //求队列的长度 }LinkQueue;
//初始化队列(带头结点) void InitQueue(LinkQueue *Q){ //初始时,front、rear都指向头结点 Q->front=Q->rear=(LinkNode *)malloc(sizeof(LinkNode)); Q->front->next=NULL; }
//判断队列是否为空 bool IsEmpty(LinkQueue *Q){ if(Q->front==Q->rear){ return true; } else{ return false; } }
//初始化(不带头结点) //void InitQueue(LinkQueue *Q){ // //初始时,front、rear都指向NULL // Q->front=NULL; // Q->rear=NULL; //}
//判断队列是否为空(不带头结点) //bool IsEmpty(LinkQueue *Q){ // if(Q->front==NULL){ // return true; // } // else{ // return false; // } //}
//新元素入队(带头结点) void EnQueue(LinkQueue *Q,int x){ LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode)); s->data=x; s->next=NULL; Q->rear->next=s; //新结点插入到rear之后 Q->rear=s; //修改表尾指针 }
//新元素入队(不带头结点) //void EnQueue(LinkQueue *Q,int x){ // LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode)); // s->data=x; // s->next=NULL; // if(Q->front == NULL){ //在空队列中插入第一个元素 // Q->front=s; //修改队头队尾指针 // Q->rear=s; //不带头结点的队列,第一个元素入队时需要特别处理 // }else{ // Q->rear->next=s; //新结点插入到rear之后 // Q->rear=s; //修改rear指针 // } //}
//队头元素出队(带头结点) bool DeQueue(LinkQueue *Q,int *x){ if(Q->front==Q->rear){ return false; //空队 } LinkNode *p=Q->front->next; *x=p->data; //用变量x返回队头元素 Q->front->next=p->next; //修改头结点的next指针 if(Q->rear==p){ //此次是最后一个结点出队 Q->rear=Q->front; //修改rear指针 } free(p); //释放结点空间 return true; }
//队头元素出队(不带头结点) //bool DeQueue(LinkQueue *Q,int *x){ // if(Q->front==NULL){ // return false; //空队 // } // LinkNode *p=Q->front; //p指向此次出队的结点 // *x=p->data; //用变量x返回队头元素 // Q->front=p->next; //修改front指针 // if(Q->rear==p){ //此次是最后一个结点出队 // Q->front=NULL; //front指向NULL // Q->rear=NULL; //rear指向NULL // } // free(p); //释放结点空间 // return true; //}
int main(){ LinkQueue Q; //声明一个队列 InitQueue(&Q); //初始化队列 //...后续操作 }
|