一、圖示
1. 隊列中的節點圖示
包括範圍(儲存節點的值)、指標域(指向下一個節點),每一個節點也都有個記憶體位址 XXXX.
2.隊列圖示
設定兩個指標,一個隊首,一個隊尾。
初始化(Init)時,分配一塊記憶體區,front、rear都指向這裡
front指向的記憶體塊,在棧的整個生命週期中,都是不儲存有效資料的
rear指向隊尾節點,當rear與front相同時,說明隊列為空白
a. 初始化 操作
b. 入隊 操作
front指標不變
rear指標指向入隊的節點,也就是隊尾節點
第二個節點入隊時,隊列
c.出隊操作
rear指標不變
front指向下一個節點,說明這一個節點已經是無效的了。
圖中的節點 1 變成了隊首,說明節點1的範圍1已經等同於無效了。
d. 隊列為空白
front與rear指向同一塊記憶體,亦即兩者相等
二、實現
/*****************************************************************<br />*功 能: 實現隊列基本操作<br />*描 述: 實現隊列的鏈式儲存,及其出隊、入隊、隊長度、顯示等操作<br />*方 法:分配一塊記憶體,隊首front和隊尾rear指標都指向該塊記憶體,<br /> 但這一塊記憶體,是不儲存有效資料的,<br />操作過程中,front指向的記憶體始終是不儲存有效資料的,<br />於是,隊列判空條件就是 front==rear<br />相當於 浪費了一個隊列元素大小(sizeof(Node))的記憶體區,<br />但為程式實現提供了極大方便<br />*時 間: 2010-11-27<br />******************************************************************/ </p><p>#include <stdio.h><br />#include <malloc.h></p><p>//---------------------------資料結構定義---------------------------------------------</p><p>typedef int ElemType;</p><p>typedef struct Node{ //隊列節點結構定義<br />ElemType value; //節點的值<br />struct Node* next; //下一個節點地址<br />}Node;</p><p>typedef struct{ //隊列結構定義<br />Node* front; //隊首<br />Node* rear; //隊尾<br />}Queue;</p><p>//--------------------------隊列操作------------------------------------------------</p><p>//初始化隊列<br />void InitQueue(Queue* queue){<br />queue->front = queue->rear = (Node*)malloc(sizeof(Node));<br />queue->front->next = NULL; //也就等同於 rear->next = NULL<br />}</p><p>//清空隊列<br />void Clean(Queue* queue){<br />Node* pNode,*tmp;<br />pNode = queue->front->next;<br />while(pNode != NULL){ //遍曆隊列,釋放每一塊節點記憶體<br />tmp = pNode; //記錄下要釋放的記憶體位址<br />pNode = pNode->next; //下一個節點的地址<br />free(tmp);<br />}<br />}<br />void Destroy(Queue* queue){<br />Clean(queue); //先清空隊列,釋放記憶體<br />free(queue->front); //釋放<br />}</p><p>//銷毀隊列</p><p>//入隊<br />void EnQueue(Queue* queue,Node* node){<br />/*<br />*說明:這裡可以有另一種更好的做法<br />* 分配一塊Node 大小的記憶體,然後將node中的資料複製到該記憶體處<br />* 這樣,當node指向的記憶體區,在EnQueue函數外通過node指標修改了該塊記憶體的值後,<br />* 隊列中儲存的值不會變動<br />* 本函數從簡,沒有採用這種做法<br />*/<br />node->next = NULL;<br /> queue->rear->next = node;<br />queue->rear =queue->rear->next;<br />}</p><p>//出隊<br />Node* DeQueue(Queue* queue){<br />Node* del= NULL;<br />if(queue->front == queue->rear) //空隊<br />return NULL;<br />del = queue->front->next; //非空<br />queue->front = queue->front->next;<br />return del;<br />}</p><p>//隊列長度<br />int Length(Queue* queue){<br />int i = 0;<br />Node* pNode;</p><p>pNode = queue->front->next; //指向隊列的第一個節點<br />while(pNode != NULL){<br />i++;<br />pNode = pNode->next;<br />}<br />return i;<br />}</p><p>//顯示隊列節點<br />void NodeDisplay(Node* node){<br />/*<br />*說明:當節點的資料類型不是int類型時<br />* 重寫該函數<br />*/<br />printf("value = %d/n",node->value);<br />}</p><p>//顯示隊列<br />void QueueDisplay(Queue* queue){<br />Node* pNode;<br />pNode = queue->front->next; //第一個事件<br />while(pNode != NULL){ //空表<br />NodeDisplay(pNode);<br />pNode = pNode->next;<br />}<br />}</p><p>//--------------------------主函數------------------------------------------------</p><p>void main(){<br />Queue* linkQueue;<br />Node* node1,*node2,*node3,*node4,*node5;</p><p>node1 = (Node*)malloc(sizeof(Node));<br />node2 = (Node*)malloc(sizeof(Node));<br />node3 = (Node*)malloc(sizeof(Node));<br />node4 = (Node*)malloc(sizeof(Node));</p><p>linkQueue = (Queue*)malloc(sizeof(Queue));</p><p>node1->value = 1;<br />node2->value = 2;<br />node3->value = 3;<br />node4->value = 4;</p><p>InitQueue(linkQueue);</p><p>EnQueue(linkQueue,node1);<br />printf("%d 入隊,隊列長度為%d/n",node1->value,Length(linkQueue));<br />QueueDisplay(linkQueue);<br />printf("-----------------------------------/n");</p><p>EnQueue(linkQueue,node2);<br />printf("%d 入隊,隊列長度為%d/n",node2->value,Length(linkQueue));<br />QueueDisplay(linkQueue);<br />printf("-----------------------------------/n");</p><p>node5 = DeQueue(linkQueue);<br />printf("%d 出隊,隊列長度為%d/n",node5->value,Length(linkQueue));<br />printf("",Length(linkQueue));<br />QueueDisplay(linkQueue);<br />printf("-----------------------------------/n");</p><p>EnQueue(linkQueue,node3);<br />printf("%d 入隊,隊列長度為%d/n",node3->value,Length(linkQueue));<br />QueueDisplay(linkQueue);<br />printf("-----------------------------------/n");</p><p>EnQueue(linkQueue,node4);<br />printf("%d 入隊,隊列長度為%d/n",node4->value,Length(linkQueue));<br />QueueDisplay(linkQueue);<br />printf("-----------------------------------/n");<br />}