佇列的鏈式表示和實現
阿新 • • 發佈:2019-01-24
注意:
- 隊首指標 Q.front 指向的不是第一個資料元素結點 Q.front->next 才是。
- 隊尾指標 Q.rear 始終指向最後一個結點。
- Q.length 始終是當前佇列的長度
#include <iostream> using namespace std; typedef struct QNode{ int data; struct QNode *next; } QNode, *QNodePtr; typedef struct{ QNodePtr front; // 隊首指標 QNodePtr rear; // 隊尾指標 int length; } LinkQueue; bool QueueInit(LinkQueue &Q) { Q.front = Q.rear = new QNode; // 生成新節點作為頭結點, 隊首和隊尾指標指向它 Q.rear->next = NULL; // 頭結點的指標域置為空 Q.length = 0; // 初始長度為0 return true; } bool QueuePush(LinkQueue &Q, int e) // 插入元素e為Q的新隊尾元素 { QNodePtr p = new QNode; // 先申請節點 p->data = e; // 設定資料域 p->next = NULL; // 指標域 Q.rear->next = p; // 新節點插入到隊尾 Q.rear = p; // 修改隊尾指標 Q.length ++; // 長度加一 return true; } bool QueuePop(LinkQueue &Q) { if(Q.front == Q.rear) return false; // 隊空,不能刪除 QNodePtr p = Q.front->next; // 臨時指標指向隊首結點 Q.front->next = p->next; // 隊首指標指向首節點的下一個節點 if(p == Q.rear) // 如果最後一個結點被刪 Q.rear = Q.front; // delete p; Q.length --; // 長度減一 return true; } int QueueTop(const LinkQueue &Q) { if(Q.front == Q.rear) { cout << "Error" << endl; return 0; } return Q.front->next->data; } int QueueSize(const LinkQueue &Q) { return Q.length; } int main() { LinkQueue Q; QueueInit(Q); QueuePush(Q, 1); QueuePush(Q, 2); QueuePush(Q, 3); cout << QueueTop(Q) << endl; cout << QueueSize(Q) << endl; QueuePop(Q); cout << QueueTop(Q) << endl; cout << QueueSize(Q) << endl; return 0; }