<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## 概述 Redis中的List是一個有序(按加入的時序排序)的數據結構,一般有序我們會采用數組或者是雙向鏈表,其中雙向鏈表由于有前后指針實際上會很浪費內存。3.2版本之前采用兩種數據結構作為底層實現: * 壓縮列表ziplist * 雙向鏈表linkedlist 在知道了`ziplist`原理后,我們來看一下在*壓縮列表轉化成雙向鏈表的條件*: * 如果添加的字符串元素長度超過默認值64 * zip包含的節點數超過默認值512 這兩個條件是可以修改的,在`redis.conf`中 ``` list-max-ziplist-value?64 list-max-ziplist-entries?512?? ``` ## list數據結構 adlist.h ``` //node的結點 typedef struct listNode { struct listNode *prev; //結點的前一結點 struct listNode *next; //結點的下一結點 void *value; //node的函數指針 } listNode; //list迭代器,只能為單向 typedef struct listIter { listNode *next; //當前迭代位置的下一點 int direction; //方向 } listIter; //node的list列表 typedef struct list { listNode *head; //列表頭 listNode *tail; //列表尾 void *(*dup)(void *ptr);//復制函數指針 void (*free)(void *ptr);//釋放函數指針 int (*match)(void *ptr, void *key);//匹配函數指針 unsigned long len; //列表長度 } list; /* Functions implemented as macros */ #define listLength(l) ((l)->len) //獲取list長度 #define listFirst(l) ((l)->head) //獲取list頭 #define listLast(l) ((l)->tail) //獲取list尾 #define listPrevNode(n) ((n)->prev) //獲取給定結點的上一個結點 #define listNextNode(n) ((n)->next) //獲取給定結點的下一個結點 #define listNodeValue(n) ((n)->value) //獲取給定結點的值,這個value不是一個數值類型,而是一個函數指針 #define listSetDupMethod(l,m) ((l)->dup = (m))//復制函數方法設置 #define listSetFreeMethod(l,m) ((l)->free = (m))//釋放函數方法設置 #define listSetMatchMethod(l,m) ((l)->match = (m))//匹配函數方法設置 #define listGetDupMethod(l) ((l)->dup)//獲取復制函數指針 #define listGetFreeMethod(l) ((l)->free)//獲取釋放函數指針 #define listGetMatchMethod(l) ((l)->match)//匹配函數指針 ``` C++通過class來面向對象編程,從上面可以看出C語言是通過在struct中對象的構造、復制、還有釋放是通過函數指針來實現模塊化的。這就是兩者的區別。 這是一個雙向鏈表實現。 ## 創建 & 迭代 & 銷毀 創建 ``` list *listCreate(void); ``` 添加到鏈表頭部或尾部 ``` list *listAddNodeHead(list *list, void *value); list *listAddNodeTail(list *list, void *value); ``` 銷毀 ``` void listRelease(list *list); void listEmpty(list *list); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看