队列 —— 链式存储
队列:一种限定性的线性表,它只允许在表的一端插入元素,在表的另一端删除元素。在队列中,允许插入的一端叫做队尾,允许删除的一端则称为队头。
特点:先进先出。
链队列:用链表表示的队列称为链队列。
空链队列:
非空链队列:
链队列存储结构的定义:
1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef int QueueElemType; 4 typedef struct Node { 5 QueueElemType data;/*数据域*/ 6 struct Node* next;/*指针域*/ 7 }QueueNode; 8 typedef struct { 9 QueueNode* front;/*队首指针*/ 10 QueueNode* rear;/*队尾指针*/ 11 }LinkQueue;
链队列初始化:
1 int InitQueue(LinkQueue* q) { 2 q->front = (QueueNode*)malloc(sizeof(QueueNode)); 3 if (q->front != NULL) { 4 q->rear = q->front; 5 q->front->next = NULL; 6 return true; 7 } 8 return false; 9 }
链队列入队操作:
1 int EnterQueue(LinkQueue *q,QueueElemType e) { 2 QueueNode* node; 3 node = (QueueNode*)malloc(sizeof(QueueNode)); 4 if (node!=NULL) { 5 node->data = e; 6 node->next = NULL; 7 //结点从队尾进入 8 q->rear->next = node; 9 //队列的尾指针指向新尾结点 10 q->rear = node; 11 return true; 12 } 13 return false; 14 }
链队列出队操作:
1 int DeleteQueue(LinkQueue *q,QueueElemType *e) { 2 QueueNode* p; 3 //判断是否队空 4 if (q->front==q->rear) { 5 return false; 6 } 7 p = q->front->next; 8 //队首元素出队 9 q->front->next = p->next; 10 if (q->rear==p) { 11 q->rear = q->front; 12 } 13 //记录出队元素 14 *e = p->data; 15 free(p); 16 return true; 17 }
打印链队列内元素:
1 void printfQueue(LinkQueue *q) { 2 QueueNode* p; 3 p = q->front->next; 4 printf("队内元素:"); 5 while (p!=NULL) 6 { 7 printf("%d ", p->data); 8 p = p->next; 9 } 10 printf("\n"); 11 }
主函数:
1 int main() { 2 LinkQueue q; 3 QueueElemType e; 4 //初始化链队列 5 InitQueue(&q); 6 //元素入队 7 EnterQueue(&q, 10); 8 EnterQueue(&q, 20); 9 EnterQueue(&q, 30); 10 printfQueue(&q); 11 //元素出队 12 DeleteQueue(&q,&e); 13 printf("出队元素:%d\n",e); 14 printfQueue(&q); 15 return 0; 16 }