和線性類似,隊列也可以有倆種儲存表示。一個鏈隊列需要都兩個分別指向隊頭和隊尾的指標(分別稱為頭指標和尾指標)才能唯一確定。為了操作方便,除了以上兩個指標外,我們還為對列添加一個頭結點。初始化是頭指標和尾指標都指向頭結點,因此,當頭指標和尾指標均指向頭結點時,此隊列為空白。
1. 定義儲存結構:
typedef struct QNode{QElemType data;//存放的資料,稱為資料域struct QNode *next;//存放下一個的地址,稱為指標域} QNode, *QueuePtr;typedef struct{QueuePtr front; //隊頭指標QueuePtr rear;//隊尾指標} LinkQueue;
2. 構建一個空隊列Q:
Status InitQueue(LinkQueue &Q){Q.front = Q.rear = (QueuePtr) malloc(sizeof(QNode));//向系統申請分配記憶體空間if (!Q.front)//如果記憶體配置失敗,程式異常退出exit(OVERFLOW);Q.front->next = NULL;return OK;}
結果如:
3.進隊:讓e進隊,作為新的對尾:
Status EnQueue(LinkQueue &Q, QElemType e){QueuePtr p = (QueuePtr) malloc(sizeof(QNode)); //產生一個新的結點pif (!p)//如果記憶體配置失敗,如果記憶體配置失敗,程式異常退出exit(OVERFLOW);p->data = e;//將要進隊列的值放與p的資料域data上p->next = NULL;//p下一個為空白Q.rear->next = p;//原本的隊尾rear的指標域next中存放p的地址Q.rear = p;//結點p作為新的隊尾return OK;}
結果如:
再e1入隊列:
4.出隊:若隊列不為空白,則刪除Q的對頭元素,用x返回其值:
Status DeQueue(LinkQueue &Q, QElemType &x){if (Q.front == Q.rear)//若隊列為空白,返回ERROR。return ERROR;QueuePtr p = Q.front->next;//隊頭結點賦給px = p->data;//隊頭的資料域賦予xQ.front->next = p->next;//p的指標域賦予隊頭的指標域if (Q.rear == p)//若該隊列只有一個元素,則該元素出隊列後,隊列為空白Q.rear = Q.front;free(p);//釋放臨時結點preturn OK;}
結果如:
5.隊頭:獲得隊頭的值,同樣用x返回其值:
Status QueueHead(LinkQueue Q, QElemType &x){if(QueueEmpty(Q))return ERROR;QueuePtr p=Q.front->next;//注意這裡是QueuePtr p=Q.front->next,而不是QueuePtr p=Q.frontx=p->data;return OK;}
6.判讀隊列是否為空白:
Status QueueEmpty(LinkQueue Q){return Q.front == Q.rear;}
7.銷毀隊列:
Status DestroyQueue(LinkQueue &Q){while(Q.front){Q.rear = Q.front->next;//隊尾在這裡作為一個“中介”,暫時存放第二個結點free(Q.front);//銷毀隊頭Q.front = Q.rear;//原先的第二個結點作為新的隊頭}return OK;}
8.隊列執行個體運用之楊輝三角如:
Status YhTriangle(LinkQueue &Q, int n){EnQueue(Q,1);EnQueue(Q,1);int i = 2;//用於控制列印數字前的縮排bool flag = 0;//用於區別同一行的兩個"1"while(n >= 2){//前n-1行QElemType e;DeQueue(Q,e);if(flag && e == 1){//若出隊的是第二個"1",再進"1"。flag = 0;EnQueue(Q,1);cout<<setw(4)<<e<<endl;--n;}else{if(e == 1){//若出隊的是第一個"1",再進"1"。for(int j = 0; j < n-i + 1; j++)cout<<setw(2)<<" ";flag = 1;EnQueue(Q,1);}cout<<setw(4)<<e<<" ";QElemType e1 = e + Q.front->next->data;//若出隊的是一行中的第一個"1"或者非"1",使其與隊頭的和入隊。EnQueue(Q,e1);}}while(!QueueEmpty(Q)){//最後一行QElemType e2;DeQueue(Q,e2);cout<<setw(4)<<e2<<" ";}return OK;}
圖示:
注意:隊頭是Q.front->next;