链队列类似于单链表,为了限制只能从两端操作数据,其结构体内有2个指针分别指向头尾,但队列里的节点用另一种结构体来表示,头尾指针则为指向该结构体的类型。只能通过操作头尾指针来操作队列。
1 typedef int elemtype; 2 3 typedef struct QueueNode{ 4 elemtype date; 5 struct QueueNode *next; 6 }LinkQueueNode; 7 typedef struct LQueue{ 8 LinkQueueNode *front; 9 LinkQueueNode *rear; 10 }LinkQueue;
初始化链队列
1 LinkQueue *init_LinkQueue(){ 2 3 LinkQueueNode *node = (LinkQueueNode *)malloc(sizeof(LinkQueueNode)); 4 LinkQueue *queue = (LinkQueue *)malloc(sizeof(LinkQueue)); 5 6 //front、rear初始化时都指在头结点 7 if(node!=NULL && queue!=NULL){ 8 node->next = NULL; 9 queue->front = node; 10 queue->rear = node; 11 return queue; 12 } 13 return NULL; 14 }
链队列只要有内存空间就会不溢出,判断空的条件是头尾指针相同
1 int Empty_LinkQueue(LinkQueue *p){ 2 3 if(p->front == p->rear) 4 return 1; 5 6 return 0; 7 8 }
入队和出队要特别注意只能通过操作头尾指针来操作队列
1 int delete_LinkQueue(LinkQueue *p,elemtype *e){ 2 3 if(p->front == p->rear) 4 return 0; 5 6 LinkQueueNode *node = (LinkQueueNode *)malloc(sizeof(LinkQueueNode)); 7 8 node = p->front->next; 9 *e = node->date; 10 p->front = node; 11 12 if(node == p->rear) 13 p->rear = p->front; 14 free(node); 15 return 1; 16 17 } 18 19 int Entry_LinkQueue(LinkQueue *p,elemtype e){ 20 21 LinkQueueNode *node = (LinkQueueNode *)malloc(sizeof(LinkQueueNode)); 22 if(node == NULL) 23 return 0; 24 25 node->date = e; 26 node->next = NULL; 27 p->rear->next = node; 28 p->rear = node; 29 return 1; 30 31 }