[數據結構]C語言隊列的實現http://www.cnblogs.com/racaljk/p/7822307.html
我個人把鏈表、隊列、棧分爲一類,然後圖、樹分爲一類。(串不考慮),分類的理由就是每一類有規律可循,即你能通過修改極少數的代碼把鏈表變成隊列、棧。(這裏我們不考慮其他諸如設計模式等因素),因此本貼在講完隊列之後還會歸納一下這一類數據結構的規律,幫助大家更好理解數據結構
首先需要知道隊列是什麼,這裏給一個定義:隊列是隻允許一段進行插入操作,一段進行刪除操作的線性表,隊列是先進先出的結構,允許插入成爲隊尾,允許刪除成爲隊頭
如上圖就是一個隊列,這裏我相信你已經對隊列有了一個概念了吧,於是就可以繼續看下面了
隊列同樣存在插入刪除操作,由於我們這裏討論的是鏈式隊列的實現,所以不存在隊列滿的情況
學了這麼多章數據結構我相信你能很容易的寫出隊列的結構了:
- struct node{
- char data;
- struct node *next;
- };
- struct queue{
- struct node *front;
- struct node *rear;
- };
- struct queue *create_queue(){
- struct queue *q=new queue;
- q->front=NULL;
- q->rear=NULL;
- return q;
- }
然後來考慮入隊操作:
如上圖,我們希望把e節點插入到這個隊列裏面,其實細心的朋友可能已經發現了這其實就是鏈表的尾部插入,沒錯,等一下我會總結一下這些規律
,這裏暫且不談。
我們能很容易寫出下面插入節點到隊列的代碼(如果不能你就要發反思是否認真學習了):
- void en_queue(struct queue *q,char c){
- struct node *e=new node;
- if(!n){
- return;
- }
- e->data=c;
- e->next=NULL;
- if(q->rear==NULL){
- q->front=q->rear=e;
- }else{
- q->rear->next=e;
- q->rear=e;
- }
- }
然後出隊:
看着上面的圖片如果你能與鏈表聯繫起來並想到這就是鏈表的頭插法的逆向,那就說明你真的學懂了
我們只需要把front的next指向a2,然後把,然後刪除a1即可完成出隊,同樣,要想刪除a1就應該創建一個臨時變量
代碼如下:
- void out_queue(struct queue *q){
- struct node * temp;
- if(q->front==NULL)
- return;
- if(q->front==q->rear)
- {
- q->front=q->rear=NULL;
- return;
- }
- temp=q->front;
- q->front=temp->next;
- delete temp;
- }
遍歷操作也順利成章:
- void print(struct queue *q){
- struct node *n=q->front;
- while(n!=NULL){
- std::cout<< n->data;
- n=n->next;
- }
- }
作者:racaljk