#include <stdio.h> #include <stdlib.h> typedef int QElemType; typedef struct QNode{ QElemType data; struct QNode *next; }QNode; typedef struct{ QNode *front; QNode *rear; }LinkQueue; LinkQueue *InitQueue(LinkQueue *Q); //初始化 LinkQueue *DestroyQueue(LinkQueue* Q);//销毁 void ClearQueue(LinkQueue *Q);//清空 int QueueEmpty(LinkQueue *Q);//判空 int QueueLength(LinkQueue *Q);//队列长度 QElemType GetHead(LinkQueue *Q);//获取队头元素 int EnQueue(LinkQueue *Q, QElemType e);//插入新元素到队尾 int DeQueue(LinkQueue *Q, QElemType *e);//删除队头元素 void QueueTraverse(LinkQueue *Q);//遍历 //初始化 LinkQueue *InitQueue(LinkQueue *Q){ Q = (LinkQueue *)malloc(sizeof(LinkQueue)); //共同指向头节点 Q->front = Q->rear = (QNode *)malloc(sizeof(QNode)); Q->front->next = NULL; printf("初始化成功\n"); return Q; } //销毁,返回一个空指针 LinkQueue *DestroyQueue(LinkQueue* Q){ QNode *p = Q->front->next; QNode *r = p->next; while(r){ free(p); p = r; r = p->next; } free(Q->front); free(Q); printf("销毁成功\n"); return NULL; } //清空 void ClearQueue(LinkQueue *Q){ QNode *p = Q->front->next; while(p){ p->data = 0; p = p->next; } printf("清空成功\n"); } //判空 int QueueEmpty(LinkQueue *Q){ return Q->rear==Q->front; } //队列长度 int QueueLength(LinkQueue *Q){ int len = 0; QNode *p = Q->front->next; while(p){ len++; p = p->next; } return len; } //获取队头元素 QElemType GetHead(LinkQueue *Q){ if(Q->front != Q->rear){ printf("队头元素是%d\n", Q->front->next->data); return Q->front->next->data; }else{ printf("空链队,无头元素\n"); return NULL; } } //插入新元素到队尾 int EnQueue(LinkQueue *Q, QElemType e){ QNode *p = (QNode *)malloc(sizeof(QNode)); p ->data = e; p->next = NULL; Q->rear->next = p; Q->rear = p; printf("元素%d插入成功\n", e); return 1; } //删除队头元素 int DeQueue(LinkQueue *Q, QElemType *e){ if(Q->front == Q->rear){ printf("空链队,删除失败\n"); return 0; } QNode *p = Q->front->next; *e = p->data; printf("%d元素出链队\n", *e); Q->front->next = p->next; //最后一个元素被删除,队尾指针指向头节点 if(Q->rear == p) Q->rear=Q->front; free(p); return 1; } //遍历 void QueueTraverse(LinkQueue *Q){ if(Q->front == Q->rear){ printf("空链队\n"); return; } QNode *p = Q->front->next; while(p){ printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { LinkQueue *Q = NULL; QElemType e = NULL; //初始化测试 Q = InitQueue(Q); // //判空测试 // if(QueueEmpty(Q)){ // printf("空链栈\n"); // } // EnQueue(Q, 1); // if(QueueEmpty(Q)){ // printf("空链栈\n"); // } // DeQueue(Q, &e); // if(QueueEmpty(Q)){ // printf("空链栈\n"); // } // //长度测试 // printf("链队长度为%d\n", QueueLength(Q)); // EnQueue(Q, 1); // EnQueue(Q, 2); // printf("链队长度为%d\n", QueueLength(Q)); // DeQueue(Q, &e); // DeQueue(Q, &e); // printf("链队长度为%d\n", QueueLength(Q)); // //遍历测试 // QueueTraverse(Q); // //获取头元素测试 // e = GetHead(Q); // EnQueue(Q, 1); // EnQueue(Q, 2); // e = GetHead(Q); // DeQueue(Q, &e); // e = GetHead(Q); // //入队测试 // EnQueue(Q, 1); // EnQueue(Q, 2); // EnQueue(Q, 3); // EnQueue(Q, 4); // EnQueue(Q, 5); // EnQueue(Q, 6); // EnQueue(Q, 7); // QueueTraverse(Q); // //出队测试 // EnQueue(Q, 1); // EnQueue(Q, 2); // EnQueue(Q, 3); // EnQueue(Q, 4); // QueueTraverse(Q); // DeQueue(Q, &e); // printf("测试e是否改变:%d\n",e); // DeQueue(Q, &e); // printf("测试e是否改变:%d\n",e); // QueueTraverse(Q); // //清空测试 // EnQueue(Q, 1); // EnQueue(Q, 2); // ClearQueue(Q); // QueueTraverse(Q); //销毁测试 EnQueue(Q, 1); EnQueue(Q, 2); Q = DestroyQueue(Q); QueueTraverse(Q); }