队列(链表实现)
队列概念
队列(Queue)和栈类似,相同点是都属于线性结构,不同点是栈遵循“后进先出”原则,而队列遵循“先进先出”的原则,也被成为“FIFO”结构,就是“First Input First Output”。
数据结构中的队列的两端都允许操作,只不过要求数据只能从队列的一端插入,从队列的另一端删除,可以把队列理解为一根水管,水管有进水口和出水口。一般把允许数据插入的一端称为队尾(Tail或者Rear),一般把允许删除数据的一端称为队头队首(Head或Front)。
队列的结构

- 代码描述
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
|
#ifndef LINKQUEUE_H #define LINKQUEUE_H
#include<stdio.h> #include<stdlib.h>
#define DataType int
#define OUTPUTERROR -2147483648
typedef struct node // 结点结构体 { DataType data; struct node *next; }QueueNode;
typedef struct queue // 队列结构体 { int size; QueueNode *front; QueueNode *rear; }LinkQueue;
LinkQueue *Inti_LinkQueue(void); int Queue_IsEmpty(LinkQueue *queue); int Input(LinkQueue *queue,DataType data); DataType Output(LinkQueue *queue); void Display_Queue(LinkQueue *queue); void Distory_Queue(LinkQueue *queue);
#endif
|
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 112 113 114 115 116 117
|
#include"linkQueue.h"
static QueueNode *NewNode(DataType x) { QueueNode *node = (QueueNode*)malloc(sizeof(QueueNode)); if(node != NULL) { node->data = x; node->next = NULL; } return node; }
LinkQueue *Inti_LinkQueue(void) { LinkQueue *queue = (LinkQueue*)malloc(sizeof(LinkQueue)); queue->front = NULL; queue->rear = NULL; queue->size = 0; return queue; }
int Queue_IsEmpty(LinkQueue *queue) { return queue->size == 0; }
static int Input_Node(LinkQueue *queue,QueueNode *node) { if (queue == NULL || node == NULL) return 0; if (Queue_IsEmpty(queue)) { queue->rear = node; queue->front = node; } else { queue->rear->next = node; queue->rear = node; } queue->size++;
return 1; }
int Input(LinkQueue *queue,DataType data) { return Input_Node(queue,NewNode(data)); }
DataType Output(LinkQueue *queue) { if (queue == NULL || Queue_IsEmpty(queue)) return OUTPUTERROR; QueueNode *output_node = queue->front; DataType output_data = output_node->data;
if (queue->size == 1) { queue->front = NULL; queue->rear = NULL; } else queue->front = output_node->next;
queue->size--; free(output_node); return output_data; }
void Display_Queue(LinkQueue *queue) { if(queue == NULL || Queue_IsEmpty(queue)) { printf("queue can not display\n"); return; }
QueueNode *p = queue->front;
printf("(queue front ↑)\n"); for (int i = 0; i < queue->size; i++) { printf("%d\n",p->data); p = p->next; } printf("(queue rear ↑)\n"); }
void Distory_Queue(LinkQueue *queue) { queue->rear->next = NULL; QueueNode *p = queue->front; QueueNode *q; while (p != NULL) { q = p->next; free(p); p = q; } free(queue); }
|