#include#include #include //设计节点 typedef struct LQnode { int data; //值域 struct LQnode *next; //next指针 }Lqueue, *LQueue; //设计队列 typedef struct queue { LQueue front; //指向队首节点的指针 LQueue rear; //指向队尾节点的指针 }Queue, *Queue_l; //初始化队列 创建一个队列,队列里面包含一个头节点 Queue_l Init_queue(void) { Queue_l lq = malloc(sizeof(Queue)); //申请大小为Queue的内存 if(lq != NULL) { lq->front = malloc(sizeof(Lqueue)); lq->rear = lq->front; lq->rear->next = NULL; return lq; } return 0; } //判空 bool Is_empty(Queue_l lq) { //队首指针和队尾指针相等则空,返回true,否则返回false return lq->front == lq->rear; } //入队 尾部添加 bool Enter_queue(Queue_l lq, int da) { LQueue new_node = malloc(sizeof(Lqueue)); //为新节点申请一片内存 if(new_node != NULL) { new_node->data = da; new_node->next = NULL; lq->rear->next = new_node; //把新节点添加到队尾 lq->rear = new_node; //更新队尾指针的位置 return true; } return false; } //出队, 队头出 bool Out_queue(Queue_l lq, int *da) { //先判空 if(Is_empty(lq)) { printf("队空!n"); return false; } *da = lq->front->next->data; //先存值 LQueue temp_n = lq->front->next; //临时指针temp指向队首节点的下一个节点 lq->front->next = temp_n->next; //更新队首节点的next指针 free(temp_n); //释放掉第一个节点 if(lq->front->next == NULL) //出队之后,如果队空 { lq->rear = lq->front; //更新队尾指针的位置,不更新导致队尾指针丢失 } return true; } //打印队列 bool Show_queue(Queue_l lq) { if(Is_empty(lq)) { printf("队空!n"); return false; } LQueue pos = lq->front->next; //临时节点指针指向队首节点的next while(pos != NULL) //当temp不为空时 { printf("%dn", pos->data); //打印temp的值域 pos = pos->next; //temp指向下一个节点 } return true; } //销毁队列 bool Destory_queue(Queue_l lq) { if(Is_empty(lq)) { free(lq); return true; } int data; while(lq->front->next != NULL) { Out_queue(lq, &data); printf("OUT: %dn", data); } free(lq); return true; } int main() { Queue_l lq = Init_queue(); for(int i = 0; i < 5; ++i) { Enter_queue(lq, i); } Show_queue(lq); int data; Out_queue(lq , &data); printf("out: %dn", data); Show_queue(lq); Destory_queue(lq); }
结果:



