#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); }