佇列的鏈式儲存結構

Diy_os發表於2015-12-01
佇列的順序儲存結構(參考前面文章:http://blog.itpub.net/29876893/viewspace-1847566/)比鏈式較為複雜些,順序儲存結構要構造迴圈佇列;但是鏈式就不需要,儲存元素的記憶體地址是隨機的,用的時候再向os申請記憶體空間。鏈式儲存結構中需要兩個flag工作指標,過程相對較簡單些。但是其中也有需要注意的細節。下面給出實現程式碼:

點選(此處)摺疊或開啟

  1. #include<iostream>
  2. using namespace std;
  3. typedef struct Queue{  //佇列結點結構
  4.     char ch;
  5.     Queue *next;
  6. }*queue;
  7. typedef struct flaging {  //flag指標結構
  8.     queue front, rear;   
  9. }*flag;

  10. void initSqueue(queue);
  11. void initflag(flag);
  12. void createSqueue(queue, flag);
  13. void pushSqueue(queue, flag, char);
  14. void popSqueue(queue, flag);
  15. void throughSqueue(queue, flag);

  16. void initSqueue(queue first) {
  17.     first = new Queue;
  18. }
  19. void initflag(flag fg) {
  20.     fg = new flaging;
  21. }
  22. void createSqueue(queue q,flag fg){    
  23.     cout << "輸入入隊的元素:" << endl;
  24.     queue p,head;
  25.     head = q;
  26.     for (char ch; cin >> ch, ch != '#';) {

  27.         p = new Queue;
  28.         head->next=p;
  29.         p->ch = ch;
  30.         head = p;
  31.         head->next = NULL;
  32.     }
  33.     fg->front=q->next;
  34.     fg->rear = head;
  35. }
  36. void pushSqueue(queue q,flag fg,char ch) { //入隊
  37.     q = fg->rear;
  38.     q->next = new Queue;
  39.     q->next->ch = ch;
  40.     q->next->next = NULL;
  41.     fg->rear = q->next;
  42. }
  43. void popSqueue(queue q,flag fg){  //出隊
  44.     
  45.     q = fg->front;
  46.         cout << q->ch;
  47.         fg->front = q->next;
  48.         delete q;
  49. }
  50. void throughSqueue(queue q, flag fg) {//遍歷佇列,列印在佇列中的元素
  51.     q = fg->front;
  52.     do{
  53.         cout << q->ch << " ";
  54.         q = q->next;
  55.     } while (q != NULL);
  56. }

  57. int main(){
  58.     Queue q;
  59.     flaging fg;
  60.     initSqueue(&q);
  61.     initflag(&fg);
  62.     createSqueue(&q, &fg);
  63.     pushSqueue(&q, &fg, 'F');
  64.     cout << "出隊的元素是:";
  65.     popSqueue(&q, &fg);
  66.     cout << endl;
  67.     cout << "出隊的元素是:";
  68.     popSqueue(&q, &fg);
  69.     cout << endl;
  70.     cout << "出隊的元素是:";
  71.     popSqueue(&q, &fg);
  72.     cout << endl;
  73.     cout << "在佇列中的元素是:" << endl;
  74.     throughSqueue(&q, &fg);
  75.     cout << endl;
  76. }
執行結果:

該過程用下面圖示簡單的表示一下:


有朋友會問,為什麼最後指向NULL結點,新增這一步似乎對程式的可讀性沒有帶來多少好處,但是這一步關鍵之處,在throughSqueue(queue q, flag fg)中,遍歷整個佇列時,用來判斷遍歷整個佇列時退出的條件,對於該函式作用十分重要,但是如果不實現該函式功能的話,那麼沒有必要再構造出NULL結點。佇列的性質是從front指標處出佇列,從rear指標處入佇列,上面的示意圖很清楚的看出這一性質,front,rear可以看成記憶指標,可以準確的告訴q指標該到什麼位置工作,q指標可以看成是移動的。整個過程,畫出圖會很清晰,相信讀者會有更精彩的功能實現。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1850594/,如需轉載,請註明出處,否則將追究法律責任。

相關文章