鏈隊列,即隊列的鏈式存儲結構,它是僅在表頭刪除和表尾插入的單鏈表,因此一個鏈隊列需要設置兩個分別指示隊頭元素和隊尾元素的指針,為了操作方便,給鏈隊列添加一個頭結點,並令隊頭指針指向頭結點,由此,空的鏈隊列的判斷條件就是隊頭指針和隊尾指針均指向頭結點。
//鏈隊列類型描述 typedef int QElemType; typedef struct node{ QElemType data; struct node *next; }QNode,*QueuePtr; typedef struct{ QueuePtr front; //隊頭指針 QueuePtr rear; //隊尾指針 }LinkQueue;
//鏈隊列的初始化(帶頭結點) void Init_LinkQueue(LinkQueue *Q){ QueuePtr head = (QueuePtr)malloc(sizeof(QNode)); if(!head) exit(OVERFLOW); head->next = NULL; Q->front = Q->rear = head; }
//銷毀鏈隊列 void Destroy_LinkQueue(LinkQueue *Q){ //從頭結點開始釋放鏈隊列中所有的結點 while(Q->front){ Q->rear = Q->front->next; free(Q->front); Q->front = Q->rear; } }
//清空鏈隊列 void Clear_LinkQueue(LinkQueue *Q){ Destroy_LinkQueue(Q); Init_LinkQueue(Q); }
//判斷鏈隊列是否為空 int IsEmpty_LinkQueue(LinkQueue *Q){ return Q->front == Q->rear; }
//求鏈隊列的長度 int GetLength_LinkQueue(LinkQueue *Q){ int count = 0; //指向存放數據的第一個結點 QueuePtr p = Q->front->next; while(p){ count++; p = p->next; } return count; }
//取得鏈隊列的頭部元素 void GetHead_LinkQueue(LinkQueue *Q,QElemType *x){ if(IsEmpty_LinkQueue(Q)){ printf("鏈隊列為空!\n"); exit(0); } else{ *x = Q->front->next->data; } }
//取得鏈隊尾的頭部元素 void GetRear_LinkQueue(LinkQueue *Q,QElemType *x){ if(IsEmpty_LinkQueue(Q)){ printf("鏈隊列為空!\n"); exit(0); } else{ *x = Q->rear->data; } }
//入鏈隊列 void En_LinkQueue(LinkQueue *Q,QElemType x){ QueuePtr q = (QueuePtr)malloc(sizeof(QNode)); if(!q) exit(OVERFLOW); q->data = x; q->next = NULL; Q->rear->next = q; Q->rear = q; }
//出鏈隊列 void De_LinkQueue(LinkQueue *Q,QElemType *x){ QueuePtr q; if(IsEmpty_LinkQueue(Q)){ printf("鏈隊列為空!\n"); exit(0); } else{ *x = Q->front->next->data; q = Q->front->next; *x = q->data; Q->front->next = q->next; //刪除元素後隊列為空 if(q->next == NULL) Q->rear = Q->front; free(q); } }
//輸出鏈隊列 void Print_LinkQueue(LinkQueue *Q){ //p指向頭結點的下一個結點,即存放數據的第一個結點 QueuePtr p = Q->front->next; if(IsEmpty_LinkQueue(Q)){ printf("鏈隊列為空!\n"); exit(0); } else{ while(p){ printf("%d\t",p->data); p = p->next; } printf("\n"); } }