演算法入門之隊列的鏈式表示

來源:互聯網
上載者:User

         
和線性類似,隊列也可以有倆種儲存表示。一個鏈隊列需要都兩個分別指向隊頭和隊尾的指標(分別稱為頭指標和尾指標)才能唯一確定。為了操作方便,除了以上兩個指標外,我們還為對列添加一個頭結點。初始化是頭指標和尾指標都指向頭結點,因此,當頭指標和尾指標均指向頭結點時,此隊列為空白。

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;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.