1. 程式人生 > >資料結構(佇列--單鏈表表實現--不含隊頭尾指標)

資料結構(佇列--單鏈表表實現--不含隊頭尾指標)



這裡介紹下用單鏈表實現的佇列,不包含隊頭隊尾指標。

 如圖

這裡介紹雙向連結串列的常用操作:

l 建立佇列

l 銷燬佇列

l 清空佇列

l 入隊

l 出隊

l 返回隊首元素

l 返回隊的大小

程式碼總分為三個檔案:

LinkQueue.h : 放置功能函式的宣告,以及表的宣告 

LinkQueue.c : 放置功能函式的定義,以及表結點的定義

Main.c     : 主函式,使用功能函式完成各種需求,一般用作測試

整體結構圖為:

這裡詳細說下入隊操作,出隊操作和返回隊首元素操作:

入隊操作:

 如圖:

出隊操作:

 如圖:

返回隊首元素:

 如圖:

          

       因為入隊和出隊操作不管是在表頭或表尾,都會進行遍歷。但是如果要返回隊首元素,當表頭為隊首時,就不用進行遍歷。所以綜合比較,當(表頭當作隊頭,表尾當作隊尾)時,較合適。

OK! 上程式碼:

LinkQueue.h : 

  1. #ifndef _LINKQUEUE_H_
  2. #define _LINKQUEUE_H_
  3. typedefvoid LinkQueue;  
  4. LinkQueue* LinkQueue_Create();  
  5. void LinkQueue_Destroy(LinkQueue* queue);  
  6. void LinkQueue_Clear(LinkQueue* queue);  
  7. int LinkQueue_Append(LinkQueue* queue, void* item);  
  8. void* LinkQueue_Retrieve(LinkQueue* queue);  
  9. void* LinkQueue_Header(LinkQueue* queue);  
  10. int LinkQueue_Length(LinkQueue* queue);  
  11. #endif

LinkQueue.c : 

  1. #include <stdio.h>
  2. #include "LinkList.h"
  3. #include "LinkQueue.h"
  4. typedefstruct _tag_LinkQueueNode  
  5. {  
  6.     LinkListNode header;  
  7.     void* item;  
  8. }TLinkQueueNode;  
  9. LinkQueue* LinkQueue_Create()  
  10. {  
  11.     return LinkList_Create();     
  12. }  
  13. void LinkQueue_Destroy(LinkQueue* queue)  
  14. {  
  15.     LinkQueue_Clear(queue);  
  16.     LinkQueue_Destroy(queue);  
  17. }  
  18. void LinkQueue_Clear(LinkQueue* queue)  
  19. {  
  20.     while(LinkQueue_Length(queue) > 0)  
  21.     {  
  22.         LinkQueue_Retrieve(queue);  
  23.     }  
  24. }  
  25. int LinkQueue_Append(LinkQueue* queue, void* item)  
  26. {  
  27.     TLinkQueueNode* node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode));  
  28.     int ret = (NULL != item) && (NULL != node);  
  29.     if(ret)  
  30.     {  
  31.         node->item = item;  
  32.         ret = LinkList_Insert(queue, (LinkListNode*)node, LinkList_Length(queue));  
  33.     }  
  34.     if(!ret)  
  35.     {  
  36.         free(node);  
  37.     }  
  38.     return ret;  
  39. }  
  40. void* LinkQueue_Retrieve(LinkQueue* queue)  
  41. {  
  42.     TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Delete(queue, 0);  
  43.     void* ret = NULL;  
  44.     if(NULL != node)  
  45.     {  
  46.         ret = node->item;  
  47.         free(node);  
  48.     }  
  49.     return ret;  
  50. }  
  51. void* LinkQueue_Header(LinkQueue* queue)  
  52. {  
  53.     TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Get(queue, 0);  
  54.     void* ret = NULL;  
  55.     if(NULL != node)  
  56.     {  
  57.         ret = node->item;  
  58.     }  
  59.     return ret;  
  60. }  
  61. int LinkQueue_Length(LinkQueue* queue)  
  62. {  
  63.     return LinkList_Length(queue);  
  64. }  

Main.c     :

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "LinkQueue.h"
  4. int main(void)  
  5. {  
  6.     LinkQueue* queue = LinkQueue_Create();  
  7.     int a[10];  
  8.     int i = 0;  
  9.     for(i=0; i<10; i++)  
  10.     {  
  11.         a[i] = i;  
  12.         LinkQueue_Append(queue, a+i);  
  13.     }  
  14.     printf("Header:   %d\n", *(int*)LinkQueue_Header(queue));  
  15.     printf("Length:   %d\n\n", LinkQueue_Length(queue));  
  16.     while(LinkQueue_Length(queue) > 0)  
  17.     {  
  18.         printf("Retrieve : %d\n", *(int*)LinkQueue_Retrieve(queue));      
  19.     }  
  20.     LinkQueue_Destroy(queue);  
  21.     return 0;  
  22. }  

這裡介紹下用單鏈表實現的佇列,不包含隊頭隊尾指標。

 如圖

這裡介紹雙向連結串列的常用操作:

l 建立佇列

l 銷燬佇列

l 清空佇列

l 入隊

l 出隊

l 返回隊首元素

l 返回隊的大小

程式碼總分為三個檔案:

LinkQueue.h : 放置功能函式的宣告,以及表的宣告 

LinkQueue.c : 放置功能函式的定義,以及表結點的定義

Main.c     : 主函式,使用功能函式完成各種需求,一般用作測試

整體結構圖為:

這裡詳細說下入隊操作,出隊操作和返回隊首元素操作:

入隊操作:

 如圖:

出隊操作:

 如圖:

返回隊首元素:

 如圖:

          

       因為入隊和出隊操作不管是在表頭或表尾,都會進行遍歷。但是如果要返回隊首元素,當表頭為隊首時,就不用進行遍歷。所以綜合比較,當(表頭當作隊頭,表尾當作隊尾)時,較合適。

OK! 上程式碼:

LinkQueue.h : 

  1. #ifndef _LINKQUEUE_H_
  2. #define _LINKQUEUE_H_
  3. typedefvoid LinkQueue;  
  4. LinkQueue* LinkQueue_Create();  
  5. 相關推薦

    資料結構佇列--單鏈表表實現--頭尾指標

    這裡介紹下用單鏈表實現的佇列,不包含隊頭隊尾指標。  如圖 這裡介紹雙向連結串列的常用操作: l 建立佇列 l 銷燬佇列 l 清空佇列 l 入隊 l 出隊 l 返回隊首元素 l 

    資料結構佇列(Queue)的實現 Java

    佇列 - 實現 為了實現佇列,我們可以使用動態陣列和指向佇列頭部的索引。 如上所述,佇列應支援兩種操作:入隊和出隊。入隊會向佇列追加一個新元素,而出隊會刪除第一個元素。 所以我們需要一個索引來指出起點。 這是一個供你參考的實現: // "static void mai

    資料結構複習------------迴圈單鏈實現約瑟夫問題

    用連結串列求約瑟夫問題: 前面小編試過用順序表來實現約瑟夫問題,用的是連用起始結點加報數然後球餘出列,這次利用迴圈單鏈表來實現。可能思考不周,但歡迎各路大神賜教! 演算法思路 : 由於約瑟夫問題是n個人圍坐一圈,所以採用迴圈連結串列實現,又由於報數可

    資料結構---迴圈佇列(順序表實現)

    一、理論知識 待續 二、程式碼實現 1.佇列結構體定義 typedef struct lQueue { int* pBase; int size; int length; int front; int rear; }lQueue,*plQu

    資料結構連結串列的實現

    1.連結串列的實現:插入結點,想要動態分配記憶體,如果分配的記憶體為空,則記憶體分配失敗。 2.序號查詢:for迴圈查詢,關鍵字查詢:while迴圈 3.連結串列的缺點就是不管查詢,刪除都是的從頭結點開始遍歷。 4.如果資料項只有一個,則只用一個結構體,如果資料項有

    資料結構佇列C語言實現

    C語言實現迴圈佇列:實現佇列需要理解先進先出的思想,可以先看一下資料機構的書籍,不做過多累述定義為順序表形式。typedef struct{ Elemtype data[MaxSize]; int front,rear; }Queue;MaxSize表示佇列最大值,其中f

    資料結構4--佇列java程式碼實現佇列的鏈式儲存

    1.什麼是佇列?      佇列也叫隊,時允許在一段進行擦汗如另一端進行刪除的運算受限的線性表。區別佇列和棧:棧時先進後出,佇列時先進先出。                 &nbs

    資料結構棧與佇列 java實現

    棧的相關定義 package StackDef; import java.util.Arrays; import java.util.EmptyStackException; /** * 通過陣列模擬棧 * @author tian * */ public cla

    資料結構-迴圈佇列的基本操作函式實現全部程式碼

        主要包含以下函式:    InitQueue(SqQueue &Q)              引數:迴圈佇列Q 功能:初始化迴圈佇列Q 時間複雜度:O(1)     QueueEmpty(SqQueue Q)              引數:迴圈佇列Q

    資料結構c語言——鏈佇列儲存結構實現

    是佇列鴨,FIFO,先進先出! 對於帶頭節點的和不帶頭節點的鏈佇列的操作有個小小的區別: 不帶頭結點的鏈佇列在入佇列的時候,第一個元素時要先判斷是否為空,再插入。而帶頭結點不需要,操作更方便些;  我是分割線-----------------------------

    自己動手實現java資料結構雙端佇列

    自己動手實現java資料結構(四)雙端佇列 1.雙端佇列介紹   在介紹雙端佇列之前,我們需要先介紹佇列的概念。和棧相對應,在許多演算法設計中,需要一種"先進先出(First Input First Output)"的資料結構,因而一種被稱為"佇列(Queue)"的資料結構被抽象了出來(因為

    資料結構及演算法——單鏈表逆轉C語言間斷更新

    題目來源:浙大程式設計類實驗輔助教學平臺 本題要求實現一個函式,將給定的單鏈表逆轉。 函式介面定義: List Reverse( List L ); 其中List結構定義如下: typedef struct Node *PtrToNode; stru

    c語言實現通用資料結構:通用佇列

         注意佇列中只儲存了指標,沒有儲存實際的資料。      標頭檔案 myQueue.h #ifndef MYQUEUE_H_INCLUDED #define MYQUEUE_H_INCLUDED #include "myList.h" typedef My

    資料結構——佇列實現、迴圈佇列實現

    一、佇列    佇列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇

    資料結構佇列Queue實現及簡單操作

    在生活中我們經常會遇到排隊的事情,比如說排隊買東西,大家依次站一個隊,隊頭的人要比後面的人先買到東西,先到先得,然後買完東西就會離開這個隊 而我們平時為了解決在比如說打客服電話,排隊叫號之類的應用問題時我們就應用了 佇列 這種資料結構,實現先到先得,先入先出的排隊功能

    資料結構——迴圈佇列順序佇列模板類實現

    資料結構筆記3.3 順序佇列是用順序表實現的(即依託於陣列),這裡實現的是迴圈佇列,其實也可以不用迴圈,但是那樣的話,空間的利用效率就太低了,這就是”假溢位”問題,因為在陣列的前端可能還有空閒的位置(因為佇列中的資料是在動態變化的,可能出隊也可能入對)

    資料結構5線性表之連結串列C++實現帶頭結點的單鏈表合併

    題目 如何將有序連結串列合併成有序連結串列 假設頭指標為La和Lb的單鏈表分別為線性表LA和LB的儲存結構,現要歸併La和Lb得到單鏈表Lc。 思路點撥 按照第三篇文章的思想,需要設立三個指標pa,pb和pc,其中pa和

    資料結構c語言——順序佇列儲存結構實現

    使用迴圈佇列,避免出現偽滿佇列的情況 判斷佇列為空的條件:rear == front; 判斷佇列為滿的條件:(rear+1)%MAXSIZE == front; 空出一個數組元素空間,用以區別開來滿佇列和空佇列。 一個順序佇列的結構:  typedef struc

    資料結構|順序佇列實現實驗3.3

    一、實驗目的 1、   熟練掌佇列的結構特點,掌握佇列的順序儲存和實現。 2、      學會使用佇列解決實際問題。 二、實驗內容 1、自己確定結點的具體資料型別和問題規模,建立一個順序佇列

    資料結構-->迴圈佇列佇列的順序實現】ADT

    #define ERROR 0 #define OK 1 #define MAXQSIZE 200 //!注意棧是沒有頭結點的 typedef int QElemType; typedef struct