日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

链表之SLIST

發布時間:2025/3/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链表之SLIST 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 背景
    • SLIST 簡介
    • 接口和實現
    • 舉例
    • 代碼分析
      • SLIST_ENTRY 和 SLIST_HEAD
      • SLIST_INIT
      • SLIST_INSERT_HEAD
      • SLIST_INSERT_AFTER
      • SLIST_REMOVE
      • SLIST_FIRST 和 SLIST_REMOVE_HEAD
      • SLIST_FOREACH
      • SLIST_EMPTY 和 SLIST_INIT
    • 附錄 queue.h
    • 參考資料

背景

對于 C 語言,在編程中需要用到鏈表時,通常需要程序員重新設計鏈表的結構體。這樣做不僅麻煩,且需要驗證代碼的正確性,對于每個閱讀代碼的人,還需要重新理解。

如果有統一的接口,豈不是更好?

在 FreeBSD 中有 queue.h 這樣一個頭文件(Linux 也有,文件路徑是 /usr/include/x86_64-linux-gnu/sys/queue.h,可以查閱 manual 手冊的queue(3) )。

頭文件 queue.h 為 C 語言中的鏈表提供了更加標準規范的編程接口。如今的版本多為伯克利加州大學1994年8月的8.5版本(8.5 (Berkeley) 8/20/94)。

queue 分為 SLIST、LIST、STAILQ、TAILQ、CIRCLEQ ,不同的鏈表有著不同的功能支持。queue 的所有源碼都是宏定義,因此完全包含于queue.h當中,無需編譯為庫文件。

我拿到的 queue.h 一共 500 多行,代碼會在本文的末尾附上,不同的版本可能不太一樣。

建議:如果你想在你的項目中使用它,最好的選擇是將你最喜歡的一個復制到你的項目中并使用它。不要依賴操作系統。它只是一個帶有一堆宏的頭文件,不需要庫或任何依賴項即可工作。

SLIST 簡介

SLIST 是 Singly-linked List 的縮寫,意為單向無尾鏈表。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WuRai1gC-1644726064142)(pics/image-20220101164926598.png)]

SLIST 是最簡單的結構,它適合數據量非常大而幾乎不需要刪除數據的場合,又或者當做棧使用。

接口和實現

/** Singly-linked List declarations.*/ #define SLIST_HEAD(name, type) \ struct name { \struct type *slh_first; /* first element */ \ }#define SLIST_HEAD_INITIALIZER(head) \{ NULL }#define SLIST_ENTRY(type) \ struct { \struct type *sle_next; /* next element */ \ }/** Singly-linked List functions.*/ #define SLIST_EMPTY(head) ((head)->slh_first == NULL)#define SLIST_FIRST(head) ((head)->slh_first)#define SLIST_FOREACH(var, head, field) \for ((var) = SLIST_FIRST((head)); \(var); \(var) = SLIST_NEXT((var), field))#define SLIST_INIT(head) do { \SLIST_FIRST((head)) = NULL; \ } while (0)#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \SLIST_NEXT((slistelm), field) = (elm); \ } while (0)#define SLIST_INSERT_HEAD(head, elm, field) do { \SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \SLIST_FIRST((head)) = (elm); \ } while (0)#define SLIST_NEXT(elm, field) ((elm)->field.sle_next)#define SLIST_REMOVE(head, elm, type, field) do { \if (SLIST_FIRST((head)) == (elm)) { \SLIST_REMOVE_HEAD((head), field); \} \else { \struct type *curelm = SLIST_FIRST((head)); \while (SLIST_NEXT(curelm, field) != (elm)) \curelm = SLIST_NEXT(curelm, field); \SLIST_NEXT(curelm, field) = \SLIST_NEXT(SLIST_NEXT(curelm, field), field); \} \ } while (0)#define SLIST_REMOVE_HEAD(head, field) do { \SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ } while (0)

舉例

光看代碼可能會頭暈,我們用例子來說明。

例子來自 https://man7.org/linux/man-pages/man3/SLIST_ENTRY.3.html

#include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <sys/queue.h>struct entry {int data;SLIST_ENTRY(entry) entries; };SLIST_HEAD(slisthead, entry);int main(void) {struct entry *n1, *n2, *n3, *np;struct slisthead head; /* Singly linked list head */SLIST_INIT(&head); /* Initialize the queue */n1 = malloc(sizeof(struct entry)); /* Insert at the head */SLIST_INSERT_HEAD(&head, n1, entries);n2 = malloc(sizeof(struct entry)); /* Insert after */SLIST_INSERT_AFTER(n1, n2, entries);SLIST_REMOVE(&head, n2, entry, entries);/* Deletion */free(n2);// 刪除第一個節點n3 = SLIST_FIRST(&head);SLIST_REMOVE_HEAD(&head, entries); /* Deletion from the head */free(n3);for (int i = 0; i < 5; i++) {n1 = malloc(sizeof(struct entry));SLIST_INSERT_HEAD(&head, n1, entries);n1->data = i;}/* Forward traversal */SLIST_FOREACH(np, &head, entries)printf("%i\n", np->data);while (!SLIST_EMPTY(&head)) { /* List deletion */n1 = SLIST_FIRST(&head);SLIST_REMOVE_HEAD(&head, entries);free(n1);}SLIST_INIT(&head);exit(EXIT_SUCCESS); }

代碼分析

我們一點一點分析。

SLIST_ENTRY 和 SLIST_HEAD

先看結構體的定義

struct entry {int data;SLIST_ENTRY(entry) entries; }; SLIST_HEAD(slisthead, entry);

需要注意,上面有 3 個 entry,不管叫什么名字,必須一致;

int data; 是用戶數據,根據需要添加;

entries 是

struct { struct entry *sle_next; }

類型的成員(注:這個結構體沒有標簽),entries 也可以換成別的名字;

slisthead 是鏈表頭結構體的標簽名。

宏替換后就是

struct entry {int data;struct { struct entry *sle_next; } entries; };struct slisthead { struct entry *slh_first; };

可以看到,和我們初學時定義的不太一樣,初學者不太可能把第 4、9 行用結構體包起來。

SLIST_INIT

我們繼續看。

struct entry *n1, *n2, *n3, *np;struct slisthead head; /* Singly linked list head */SLIST_INIT(&head); /* Initialize the queue */

1:定義了 3 個指向節點的指針;

2:定義表示表頭的結構體變量 head,slisthead 要和前面的一致;

3:宏替換后是 (&head)->slh_first = NULL; 意思是初始化為一個空的鏈表,頭指針指向 NULL

SLIST_INSERT_HEAD

n1 = malloc(sizeof(struct entry)); /* Insert at the head */SLIST_INSERT_HEAD(&head, n1, entries);

1:為節點分配內存,這里省略了對返回指的檢查;

2:宏替換后是

(n1)->entries.sle_next = (&head)->slh_first; (&head)->slh_first = (n1);

典型的頭插。SLIST_INSERT_HEAD(&head, n1, entries) 的意思是:把 n1 節點插入到鏈表 head 的頭部;第一個參數是表頭的地址,第二參數是待插入的節點的地址,第三個參數是無標簽結構體的成員名,和之前的要一致。

SLIST_INSERT_AFTER

n2 = malloc(sizeof(struct entry)); /* Insert after */SLIST_INSERT_AFTER(n1, n2, entries);

2:宏替換后是

(n2)->entries.sle_next = (n1)->entries.sle_next; (n1)->entries.sle_next = (n2);

用大白話說就是把 n1 后面的節點接在 n2 后面,再把 n2 接到 n1 后面,所以:

SLIST_INSERT_AFTER(n1, n2, entries) 的意思是把節點 n2 插入到 n1 的后面。n1、n2 都是節點的地址,entries 是無標簽結構體的成員名,和之前的要一致。

SLIST_REMOVE

SLIST_REMOVE(&head, n2, entry, entries);/* Deletion */free(n2);

這個宏替換有點復雜:

if ((&head)->slh_first == (n2)) { ((&head))->slh_first = ((&head))->slh_first->entries.sle_next; } else { struct entry *curelm = (&head)->slh_first; while(curelm->entries.sle_next != (n2)) curelm = curelm->entries.sle_next; curelm->entries.sle_next = curelm->entries.sle_next->entries.sle_next; }

1:看看要刪除的節點是不是第一個節點,如果是,就刪除;如果不是,走 else 分支

5:取第一個節點為當前節點

6:判斷當前節點的下一個節點是不是要刪除的節點,如果是,while 語句結束,執行第 8 行,刪除之。

總結,SLIST_REMOVE(&head, n2, entry, entries) 的意思是:

第一個參數是表頭的地址,第二參數是待刪除的節點的地址,第三和第四個參數要和最開始定義結構體的時候保持一致,比如 SLIST_ENTRY(entry) entries 中的 entry、entries

SLIST_FIRST 和 SLIST_REMOVE_HEAD

n3 = SLIST_FIRST(&head);SLIST_REMOVE_HEAD(&head, entries); /* Deletion from the head */free(n3);

宏替換是:

n3 = ((&head)->slh_first); (&head)->slh_first = (&head)->slh_first->entries.sle_next;

SLIST_FIRST (&head) 這個宏就是取第一個節點的地址,參數是表頭的地址;

2:刪除第一個節點

為什么會有第 1 行呢?如果不在這個時候保存第一個節點的地址,那么刪除后,就無法獲得其地址了,也就無法執行第 3 行的釋放空間了。所以,這個例子給我們提供了標準的頭刪操作。

SLIST_REMOVE_HEAD(&head, entries) 這個宏的意思是刪除第一個節點,第一個參數是表頭的地址,entries 是無標簽結構體的成員名,和之前的要一致。

SLIST_FOREACH

for (int i = 0; i < 5; i++) {n1 = malloc(sizeof(struct entry));SLIST_INSERT_HEAD(&head, n1, entries);n1->data = i;}/* Forward traversal */SLIST_FOREACH(np, &head, entries)printf("%i\n", np->data);

3:SLIST_INSERT_HEAD 這個在前面說了,就是頭插

4:宏替換后,是

for((np) = (&head)->slh_first; (np); (np) = (np)->entries.sle_next)printf("%i\n", np->data);

典型的遍歷。注意,這種遍歷是不能刪除的,因為如果把 np 指向的節點刪除了,

(np)->entries.sle_next 這句就不對了。

SLIST_FOREACH(np, &head, entries) 用來遍歷鏈表的每個節點。第一個參數是臨時變量,指向當前的節點,第二個參數是表頭的地址,第三個 entries 是無標簽結構體的成員名,和之前的一致。

這個例子就這一個地方是有打印,打印的結果是:

4 3 2 1 0

因為是頭插,所以先插入的會在鏈表的末尾。遍歷的順序是從頭到尾,所以順序是 4,3,2,1,0

SLIST_EMPTY 和 SLIST_INIT

while (!SLIST_EMPTY(&head)) { /* List deletion */n1 = SLIST_FIRST(&head);SLIST_REMOVE_HEAD(&head, entries);free(n1);}

2-4 行就不解釋了,前文說過了。

SLIST_EMPTY(&head) 宏展開是:

(&head)->slh_first == NULL,就是判斷鏈表是否為空。

附錄 queue.h

/** Copyright (c) 1991, 1993* The Regents of the University of California. All rights reserved.** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions* are met:* 1. Redistributions of source code must retain the above copyright* notice, this list of conditions and the following disclaimer.* 2. Redistributions in binary form must reproduce the above copyright* notice, this list of conditions and the following disclaimer in the* documentation and/or other materials provided with the distribution.* 4. Neither the name of the University nor the names of its contributors* may be used to endorse or promote products derived from this software* without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF* SUCH DAMAGE.** @(#)queue.h 8.5 (Berkeley) 8/20/94* $FreeBSD: src/sys/sys/queue.h,v 1.32.2.7 2002/04/17 14:21:02 des Exp $*/#ifndef _QUEUE_H_ #define _QUEUE_H_#ifdef __cplusplus extern "C" { #endif/** This file defines five types of data structures: singly-linked lists,* singly-linked tail queues, lists, tail queues, and circular queues.** A singly-linked list is headed by a single forward pointer. The elements* are singly linked for minimum space and pointer manipulation overhead at* the expense of O(n) removal for arbitrary elements. New elements can be* added to the list after an existing element or at the head of the list.* Elements being removed from the head of the list should use the explicit* macro for this purpose for optimum efficiency. A singly-linked list may* only be traversed in the forward direction. Singly-linked lists are ideal* for applications with large datasets and few or no removals or for* implementing a LIFO queue.** A singly-linked tail queue is headed by a pair of pointers, one to the* head of the list and the other to the tail of the list. The elements are* singly linked for minimum space and pointer manipulation overhead at the* expense of O(n) removal for arbitrary elements. New elements can be added* to the list after an existing element, at the head of the list, or at the* end of the list. Elements being removed from the head of the tail queue* should use the explicit macro for this purpose for optimum efficiency.* A singly-linked tail queue may only be traversed in the forward direction.* Singly-linked tail queues are ideal for applications with large datasets* and few or no removals or for implementing a FIFO queue.** A list is headed by a single forward pointer (or an array of forward* pointers for a hash table header). The elements are doubly linked* so that an arbitrary element can be removed without a need to* traverse the list. New elements can be added to the list before* or after an existing element or at the head of the list. A list* may only be traversed in the forward direction.** A tail queue is headed by a pair of pointers, one to the head of the* list and the other to the tail of the list. The elements are doubly* linked so that an arbitrary element can be removed without a need to* traverse the list. New elements can be added to the list before or* after an existing element, at the head of the list, or at the end of* the list. A tail queue may be traversed in either direction.** A circle queue is headed by a pair of pointers, one to the head of the* list and the other to the tail of the list. The elements are doubly* linked so that an arbitrary element can be removed without a need to* traverse the list. New elements can be added to the list before or after* an existing element, at the head of the list, or at the end of the list.* A circle queue may be traversed in either direction, but has a more* complex end of list detection.** For details on the use of these macros, see the queue(3) manual page.*** SLIST LIST STAILQ TAILQ CIRCLEQ* _HEAD + + + + +* _HEAD_INITIALIZER + + + + +* _ENTRY + + + + +* _INIT + + + + +* _EMPTY + + + + +* _FIRST + + + + +* _NEXT + + + + +* _PREV - - - + +* _LAST - - + + +* _FOREACH + + + + +* _FOREACH_REVERSE - - - + +* _INSERT_HEAD + + + + +* _INSERT_BEFORE - + - + +* _INSERT_AFTER + + + + +* _INSERT_TAIL - - + + +* _REMOVE_HEAD + - + - -* _REMOVE + + + + +**//** Singly-linked List declarations.*/ #define SLIST_HEAD(name, type) \ struct name { \struct type *slh_first; /* first element */ \ }#define SLIST_HEAD_INITIALIZER(head) \{ NULL }#define SLIST_ENTRY(type) \ struct { \struct type *sle_next; /* next element */ \ }/** Singly-linked List functions.*/ #define SLIST_EMPTY(head) ((head)->slh_first == NULL)#define SLIST_FIRST(head) ((head)->slh_first)#define SLIST_FOREACH(var, head, field) \for ((var) = SLIST_FIRST((head)); \(var); \(var) = SLIST_NEXT((var), field))#define SLIST_INIT(head) do { \SLIST_FIRST((head)) = NULL; \ } while (0)#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \SLIST_NEXT((slistelm), field) = (elm); \ } while (0)#define SLIST_INSERT_HEAD(head, elm, field) do { \SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \SLIST_FIRST((head)) = (elm); \ } while (0)#define SLIST_NEXT(elm, field) ((elm)->field.sle_next)#define SLIST_REMOVE(head, elm, type, field) do { \if (SLIST_FIRST((head)) == (elm)) { \SLIST_REMOVE_HEAD((head), field); \} \else { \struct type *curelm = SLIST_FIRST((head)); \while (SLIST_NEXT(curelm, field) != (elm)) \curelm = SLIST_NEXT(curelm, field); \SLIST_NEXT(curelm, field) = \SLIST_NEXT(SLIST_NEXT(curelm, field), field); \} \ } while (0)#define SLIST_REMOVE_HEAD(head, field) do { \SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ } while (0)/** Singly-linked Tail queue declarations.*/ #define STAILQ_HEAD(name, type) \ struct name { \struct type *stqh_first;/* first element */ \struct type **stqh_last;/* addr of last next element */ \ }#define STAILQ_HEAD_INITIALIZER(head) \{ NULL, &(head).stqh_first }#define STAILQ_ENTRY(type) \ struct { \struct type *stqe_next; /* next element */ \ }/** Singly-linked Tail queue functions.*/ #define STAILQ_EMPTY(head) ((head)->stqh_first == NULL)#define STAILQ_FIRST(head) ((head)->stqh_first)#define STAILQ_FOREACH(var, head, field) \for((var) = STAILQ_FIRST((head)); \(var); \(var) = STAILQ_NEXT((var), field))#define STAILQ_INIT(head) do { \STAILQ_FIRST((head)) = NULL; \(head)->stqh_last = &STAILQ_FIRST((head)); \ } while (0)#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\(head)->stqh_last = &STAILQ_NEXT((elm), field); \STAILQ_NEXT((tqelm), field) = (elm); \ } while (0)#define STAILQ_INSERT_HEAD(head, elm, field) do { \if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \(head)->stqh_last = &STAILQ_NEXT((elm), field); \STAILQ_FIRST((head)) = (elm); \ } while (0)#define STAILQ_INSERT_TAIL(head, elm, field) do { \STAILQ_NEXT((elm), field) = NULL; \*(head)->stqh_last = (elm); \(head)->stqh_last = &STAILQ_NEXT((elm), field); \ } while (0)#define STAILQ_LAST(head, type, field) \(STAILQ_EMPTY(head) ? \NULL : \((struct type *) \((char *)((head)->stqh_last) - offsetof(struct type, field))))#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)#define STAILQ_REMOVE(head, elm, type, field) do { \if (STAILQ_FIRST((head)) == (elm)) { \STAILQ_REMOVE_HEAD(head, field); \} \else { \struct type *curelm = STAILQ_FIRST((head)); \while (STAILQ_NEXT(curelm, field) != (elm)) \curelm = STAILQ_NEXT(curelm, field); \if ((STAILQ_NEXT(curelm, field) = \STAILQ_NEXT(STAILQ_NEXT(curelm, field), field)) == NULL)\(head)->stqh_last = &STAILQ_NEXT((curelm), field);\} \ } while (0)#define STAILQ_REMOVE_HEAD(head, field) do { \if ((STAILQ_FIRST((head)) = \STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \(head)->stqh_last = &STAILQ_FIRST((head)); \ } while (0)#define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \(head)->stqh_last = &STAILQ_FIRST((head)); \ } while (0)#define STAILQ_REMOVE_AFTER(head, elm, field) do { \if ((STAILQ_NEXT(elm, field) = \STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \(head)->stqh_last = &STAILQ_NEXT((elm), field); \ } while (0)/** List declarations.*/ #define LIST_HEAD(name, type) \ struct name { \struct type *lh_first; /* first element */ \ }#define LIST_HEAD_INITIALIZER(head) \{ NULL }#define LIST_ENTRY(type) \ struct { \struct type *le_next; /* next element */ \struct type **le_prev; /* address of previous next element */ \ }/** List functions.*/#define LIST_EMPTY(head) ((head)->lh_first == NULL)#define LIST_FIRST(head) ((head)->lh_first)#define LIST_FOREACH(var, head, field) \for ((var) = LIST_FIRST((head)); \(var); \(var) = LIST_NEXT((var), field))#define LIST_INIT(head) do { \LIST_FIRST((head)) = NULL; \ } while (0)#define LIST_INSERT_AFTER(listelm, elm, field) do { \if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\LIST_NEXT((listelm), field)->field.le_prev = \&LIST_NEXT((elm), field); \LIST_NEXT((listelm), field) = (elm); \(elm)->field.le_prev = &LIST_NEXT((listelm), field); \ } while (0)#define LIST_INSERT_BEFORE(listelm, elm, field) do { \(elm)->field.le_prev = (listelm)->field.le_prev; \LIST_NEXT((elm), field) = (listelm); \*(listelm)->field.le_prev = (elm); \(listelm)->field.le_prev = &LIST_NEXT((elm), field); \ } while (0)#define LIST_INSERT_HEAD(head, elm, field) do { \if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\LIST_FIRST((head)) = (elm); \(elm)->field.le_prev = &LIST_FIRST((head)); \ } while (0)#define LIST_NEXT(elm, field) ((elm)->field.le_next)#define LIST_REMOVE(elm, field) do { \if (LIST_NEXT((elm), field) != NULL) \LIST_NEXT((elm), field)->field.le_prev = \(elm)->field.le_prev; \*(elm)->field.le_prev = LIST_NEXT((elm), field); \ } while (0)/** Tail queue declarations.*/ #define TAILQ_HEAD(name, type) \ struct name { \struct type *tqh_first; /* first element */ \struct type **tqh_last; /* addr of last next element */ \ }#define TAILQ_HEAD_INITIALIZER(head) \{ NULL, &(head).tqh_first }#define TAILQ_ENTRY(type) \ struct { \struct type *tqe_next; /* next element */ \struct type **tqe_prev; /* address of previous next element */ \ }/** Tail queue functions.*/ #define TAILQ_EMPTY(head) ((head)->tqh_first == NULL)#define TAILQ_FIRST(head) ((head)->tqh_first)#define TAILQ_FOREACH(var, head, field) \for ((var) = TAILQ_FIRST((head)); \(var); \(var) = TAILQ_NEXT((var), field))#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \for ((var) = TAILQ_LAST((head), headname); \(var); \(var) = TAILQ_PREV((var), headname, field))#define TAILQ_INIT(head) do { \TAILQ_FIRST((head)) = NULL; \(head)->tqh_last = &TAILQ_FIRST((head)); \ } while (0)#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\TAILQ_NEXT((elm), field)->field.tqe_prev = \&TAILQ_NEXT((elm), field); \else \(head)->tqh_last = &TAILQ_NEXT((elm), field); \TAILQ_NEXT((listelm), field) = (elm); \(elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ } while (0)#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \(elm)->field.tqe_prev = (listelm)->field.tqe_prev; \TAILQ_NEXT((elm), field) = (listelm); \*(listelm)->field.tqe_prev = (elm); \(listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ } while (0)#define TAILQ_INSERT_HEAD(head, elm, field) do { \if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \TAILQ_FIRST((head))->field.tqe_prev = \&TAILQ_NEXT((elm), field); \else \(head)->tqh_last = &TAILQ_NEXT((elm), field); \TAILQ_FIRST((head)) = (elm); \(elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ } while (0)#define TAILQ_INSERT_TAIL(head, elm, field) do { \TAILQ_NEXT((elm), field) = NULL; \(elm)->field.tqe_prev = (head)->tqh_last; \*(head)->tqh_last = (elm); \(head)->tqh_last = &TAILQ_NEXT((elm), field); \ } while (0)#define TAILQ_LAST(head, headname) \(*(((struct headname *)((head)->tqh_last))->tqh_last))#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)#define TAILQ_PREV(elm, headname, field) \(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))#define TAILQ_REMOVE(head, elm, field) do { \if ((TAILQ_NEXT((elm), field)) != NULL) \TAILQ_NEXT((elm), field)->field.tqe_prev = \(elm)->field.tqe_prev; \else \(head)->tqh_last = (elm)->field.tqe_prev; \*(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ } while (0)/** Circular queue declarations.*/ #define CIRCLEQ_HEAD(name, type) \ struct name { \struct type *cqh_first; /* first element */ \struct type *cqh_last; /* last element */ \ }#define CIRCLEQ_HEAD_INITIALIZER(head) \{ (void *)&(head), (void *)&(head) }#define CIRCLEQ_ENTRY(type) \ struct { \struct type *cqe_next; /* next element */ \struct type *cqe_prev; /* previous element */ \ }/** Circular queue functions.*/ #define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head))#define CIRCLEQ_FIRST(head) ((head)->cqh_first)#define CIRCLEQ_FOREACH(var, head, field) \for ((var) = CIRCLEQ_FIRST((head)); \(var) != (void *)(head) || ((var) = NULL); \(var) = CIRCLEQ_NEXT((var), field))#define CIRCLEQ_FOREACH_REVERSE(var, head, field) \for ((var) = CIRCLEQ_LAST((head)); \(var) != (void *)(head) || ((var) = NULL); \(var) = CIRCLEQ_PREV((var), field))#define CIRCLEQ_INIT(head) do { \CIRCLEQ_FIRST((head)) = (void *)(head); \CIRCLEQ_LAST((head)) = (void *)(head); \ } while (0)#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \CIRCLEQ_NEXT((elm), field) = CIRCLEQ_NEXT((listelm), field); \CIRCLEQ_PREV((elm), field) = (listelm); \if (CIRCLEQ_NEXT((listelm), field) == (void *)(head)) \CIRCLEQ_LAST((head)) = (elm); \else \CIRCLEQ_PREV(CIRCLEQ_NEXT((listelm), field), field) = (elm);\CIRCLEQ_NEXT((listelm), field) = (elm); \ } while (0)#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \CIRCLEQ_NEXT((elm), field) = (listelm); \CIRCLEQ_PREV((elm), field) = CIRCLEQ_PREV((listelm), field); \if (CIRCLEQ_PREV((listelm), field) == (void *)(head)) \CIRCLEQ_FIRST((head)) = (elm); \else \CIRCLEQ_NEXT(CIRCLEQ_PREV((listelm), field), field) = (elm);\CIRCLEQ_PREV((listelm), field) = (elm); \ } while (0)#define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \CIRCLEQ_NEXT((elm), field) = CIRCLEQ_FIRST((head)); \CIRCLEQ_PREV((elm), field) = (void *)(head); \if (CIRCLEQ_LAST((head)) == (void *)(head)) \CIRCLEQ_LAST((head)) = (elm); \else \CIRCLEQ_PREV(CIRCLEQ_FIRST((head)), field) = (elm); \CIRCLEQ_FIRST((head)) = (elm); \ } while (0)#define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \CIRCLEQ_NEXT((elm), field) = (void *)(head); \CIRCLEQ_PREV((elm), field) = CIRCLEQ_LAST((head)); \if (CIRCLEQ_FIRST((head)) == (void *)(head)) \CIRCLEQ_FIRST((head)) = (elm); \else \CIRCLEQ_NEXT(CIRCLEQ_LAST((head)), field) = (elm); \CIRCLEQ_LAST((head)) = (elm); \ } while (0)#define CIRCLEQ_LAST(head) ((head)->cqh_last)#define CIRCLEQ_NEXT(elm,field) ((elm)->field.cqe_next)#define CIRCLEQ_PREV(elm,field) ((elm)->field.cqe_prev)#define CIRCLEQ_REMOVE(head, elm, field) do { \if (CIRCLEQ_NEXT((elm), field) == (void *)(head)) \CIRCLEQ_LAST((head)) = CIRCLEQ_PREV((elm), field); \else \CIRCLEQ_PREV(CIRCLEQ_NEXT((elm), field), field) = \CIRCLEQ_PREV((elm), field); \if (CIRCLEQ_PREV((elm), field) == (void *)(head)) \CIRCLEQ_FIRST((head)) = CIRCLEQ_NEXT((elm), field); \else \CIRCLEQ_NEXT(CIRCLEQ_PREV((elm), field), field) = \CIRCLEQ_NEXT((elm), field); \ } while (0)#ifdef __cplusplus } #endif#endif /* !_SYS_QUEUE_H_ */

參考資料

【1】https://blog.csdn.net/tissar/article/details/86978743

【2】http://manpages.courier-mta.org/htmlman3/slist.3.html

【3】https://wizardforcel.gitbooks.io/100-gcc-tips/content/inhibit-linemarkers.html

【4】where to find Linux version sys/queue.h header file? - Stack Overflow

總結

以上是生活随笔為你收集整理的链表之SLIST的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

成年人电影毛片 | 日本99热| 久久国精品 | 久久久久久久福利 | 国产中文字幕视频在线 | 欧美激情第十页 | 日韩免费av在线 | 国产免费观看视频 | 操操操人人 | 久久成人麻豆午夜电影 | 天天射天天干天天插 | 在线国产中文字幕 | 国产精品短视频 | 特级黄录像视频 | 麻豆国产在线视频 | 91精品在线视频观看 | 91av观看 | 99热精品在线观看 | 在线观看中文字幕第一页 | 91爱爱免费观看 | 国产成人精品不卡 | 日韩一区二区三区视频在线 | 久久曰视频 | 丁香视频免费观看 | 中文字幕日本在线观看 | 成人精品亚洲 | 亚洲精品一区二区三区高潮 | 免费国产在线精品 | 91完整视频 | 国产中文字幕在线 | 国产夫妻性生活自拍 | 99国产视频在线 | 亚洲国产久 | 午夜黄网| 国产一区免费视频 | 国产精久久久久久久 | 欧美先锋影音 | 国产精品99久久久久的智能播放 | 精品一区二区三区电影 | 天天做天天看 | 日韩中文字幕在线观看 | 亚洲婷婷在线 | 国产精品一区二区吃奶在线观看 | 午夜在线免费观看 | 欧美另类老妇 | 日韩免费av网址 | 欧美日韩在线观看视频 | 一区二区三区国产欧美 | 精品国产诱惑 | 日韩黄色在线电影 | 97av影院 | 亚洲黄色一级电影 | 久久成年人 | 懂色av懂色av粉嫩av分享吧 | 一区二区三区四区影院 | 香蕉视频国产在线观看 | 伊人电影在线观看 | 国产中文字幕在线视频 | 色婷婷天天干 | 免费高清看电视网站 | 国产精品网红福利 | 最近日韩中文字幕中文 | 久久精品视频4 | 精品毛片久久久久久 | 99视频在线免费播放 | 首页av在线| 日韩av电影免费在线观看 | 粉嫩av一区二区三区四区 | 日本中文字幕网 | 久久人人做 | 又长又大又黑又粗欧美 | 日韩欧美xx | 免费看黄色小说的网站 | 中文字幕乱在线伦视频中文字幕乱码在线 | 日韩av男人的天堂 | 97在线播放 | 国产精品国产亚洲精品看不卡15 | 国产a级精品 | 国产一级片直播 | 欧美激情综合五月色丁香 | 六月婷色 | 中文字幕精品一区久久久久 | 婷婷伊人网 | 中文字幕在线观看完整 | 国产麻豆传媒 | 久久久麻豆视频 | 久久亚洲欧美日韩精品专区 | 狠狠久久综合 | 在线播放一区二区三区 | 五月丁婷婷 | 国产亚州av | 亚洲色视频 | 欧美性成人 | 久久国产经典视频 | 91在线精品秘密一区二区 | 99爱精品视频 | 日韩v在线91成人自拍 | 91成人免费视频 | 午夜视频免费 | 在线免费亚洲 | 六月丁香激情综合 | 成人超碰在线 | 欧美伦理一区二区三区 | 91黄色视屏 | 久久69精品久久久久久久电影好 | 成人毛片在线观看视频 | 热99在线视频 | 国产麻豆精品95视频 | 爱爱av网 | 伊人伊成久久人综合网站 | 色资源网免费观看视频 | 一二三区视频在线 | 婷婷激情五月综合 | 成人在线免费视频观看 | av观看免费在线 | 69中文字幕| 伊人官网 | 欧美日韩高清一区二区三区 | 成年人免费看的视频 | 欧美激情综合五月色丁香 | 操综合 | 久久黄色片 | 中文字幕在线观看三区 | 久草免费福利在线观看 | 一区二区三区 中文字幕 | 黄色的网站免费看 | 国产精品久久久久久a | 久久精品屋 | 9ⅰ精品久久久久久久久中文字幕 | 国产精品国产三级国产aⅴ入口 | 日韩精品久久久久久中文字幕8 | 99久久毛片| 91久久精品一区二区二区 | 国产精品日韩久久久久 | 99久热在线精品视频成人一区 | 国产在线久草 | 国产精品毛片久久久久久久久久99999999 | 999电影免费在线观看 | 亚洲黄色一级电影 | 国产 精品 资源 | 精品久久久久久久久久久久 | 国产午夜免费视频 | 亚洲综合视频在线 | 久久久久久黄 | 日韩三级视频 | 色视频网址 | 99性视频 | 久久综合色8888 | 亚洲综合欧美精品电影 | 日韩三级.com | 国产精品观看在线亚洲人成网 | 天天舔天天射天天操 | 日韩av偷拍 | 国产精品完整版 | 色综合中文综合网 | 国产精品久久久久av免费 | 中文字幕高清在线播放 | 免费观看国产视频 | 欧洲精品视频一区二区 | 狠狠久久综合 | 亚洲精品国产精品99久久 | 涩涩网站在线观看 | 91久色蝌蚪 | 99热九九这里只有精品10 | 国产精品久久中文字幕 | 久久女同性恋中文字幕 | 菠萝菠萝蜜在线播放 | 88av网站 | 在线国产一区二区三区 | 日韩精品一区二区三区电影 | 久久伊人操 | 99综合电影在线视频 | 欧美精品亚洲精品日韩精品 | 成人观看视频 | 天天干,天天插 | 亚洲国产精品第一区二区 | 波多野结衣精品视频 | 久久精品欧美一 | 亚洲最大的av网站 | 91视频黄色 | 伊人狠狠干 | 久久精品视频4 | 国产精品久久久久婷婷 | 精品久久精品 | 色婷婷综合视频在线观看 | 高清av中文字幕 | 少妇bbb好爽 | 国产精品网站一区二区三区 | 97精品超碰一区二区三区 | 国产一区高清在线观看 | 欧美韩国日本在线观看 | 亚洲精品国产精品国自 | 丝袜av网站 | 久草在线99| 欧美久久久一区二区三区 | 久久草在线视频国产 | 在线99| 成年人国产在线观看 | 国产香蕉视频 | 国产精品96久久久久久吹潮 | 国产二区精品 | 国产精品久久久久久a | 色美女在线 | www.成人精品| 91精品国产一区 | 丁香五婷 | 天天色天天射天天干 | 97视频亚洲 | 精品99免费视频 | 婷婷色在线播放 | 欧美日韩国产一区二区三区在线观看 | 色噜噜在线观看 | 99精品偷拍视频一区二区三区 | 欧美国产日韩中文 | 米奇影视7777 | 天天射天天操天天干 | 午夜精品一区二区三区视频免费看 | 久久天堂影院 | 国产精品色婷婷视频 | 亚洲精品美女视频 | 在线黄色毛片 | 伊人久久一区 | 国产专区视频在线 | 日韩欧美99 | 久久免费黄色网址 | 国产人在线成免费视频 | 色在线亚洲 | 91九色视频导航 | 国产精品免费一区二区三区 | 在线观看色网 | 成人av av在线 | 国产美女网| av手机版 | 黄色大片免费网站 | 麻豆高清免费国产一区 | 天天插天天干天天操 | 久久污视频 | 香蕉91视频 | 久久久久婷 | 色婷婷国产精品 | 国产一区二区不卡视频 | 国产美女视频免费 | 天天色天天射天天干 | 国产乱码精品一区二区蜜臀 | 欧美三人交 | 欧洲精品一区二区 | 亚洲免费在线 | 亚洲一区不卡视频 | 国产精品1区2区在线观看 | 成人小视频在线观看免费 | 亚洲 欧美 成人 | 欧美性大战久久久久 | 在线播放日韩av | 最近中文字幕完整高清 | 91av小视频 | 久久高清视频免费 | 国产高清第一页 | av手机在线播放 | 欧美黑人性猛交 | 在线看v片成人 | 国产精品黄色 | 亚洲男男gaygayxxxgv | 欧美激情视频一区二区三区 | 国产99亚洲 | 福利电影久久 | 成人免费一区二区三区在线观看 | 国内三级在线观看 | 一本大道久久精品懂色aⅴ 五月婷社区 | 操处女逼 | 在线观看自拍 | 免费91麻豆精品国产自产在线观看 | 成人免费xxxxxx视频 | 免费看搞黄视频网站 | 午夜精品久久久 | 91看片在线播放 | 免费看国产视频 | 国产中的精品av小宝探花 | 视频在线99 | 亚洲免费在线观看视频 | 日韩精品在线免费观看 | 黄色av网站在线免费观看 | 免费开视频 | 女女av在线 | 99精品视频网站 | 在线观看视频一区二区三区 | 日本久久久精品视频 | 丁香综合五月 | 久久久久久美女 | 超碰大片 | 97精品国产97久久久久久粉红 | 在线观看视频亚洲 | 国产一二三四在线观看视频 | 亚洲国产免费 | 日韩丝袜视频 | 婷婷六月天天 | 成人av免费在线播放 | 黄色片网站av | 久久国产精品免费一区二区三区 | 国产高清在线a视频大全 | 最近字幕在线观看第一季 | 国精产品满18岁在线 | 草久在线视频 | 97成人精品视频在线观看 | 亚洲婷婷网 | 日本福利视频在线 | 免费进去里的视频 | 亚洲激情在线观看 | 国产我不卡 | 国产日韩一区在线 | 人人爱人人爽 | 久久久www成人免费毛片麻豆 | 中文字幕传媒 | 亚洲成av人片 | 九九综合在线 | 日本久久91| 婷婷色六月天 | 免费在线一区二区三区 | 波多野结衣精品在线 | 免费看国产a | 激情综合五月 | 欧美精品久久久久久久久久白贞 | 免费看污的网站 | 国产精品123| 亚洲国产精品99久久久久久久久 | 米奇影视7777 | 中文字幕资源在线观看 | 人人插人人草 | 激情综合电影网 | 国产精品九九久久久久久久 | 国产精品成人在线 | 草樱av| 国产69精品久久99的直播节目 | 国产精品久久久久三级 | 婷婷色婷婷 | 日韩字幕| 国产精国产精品 | 伊人五月天综合 | 91免费高清| 亚洲免费不卡 | 四虎永久免费网站 | 久久一区国产 | 中文字幕在线观看免费 | www.久热| 激情丁香久久 | 欧美大片mv免费 | 黄色成人在线观看 | 成片免费观看视频 | 96精品视频| 日韩欧美一区二区在线观看 | 欧美 亚洲 另类 激情 另类 | 久久精品亚洲一区二区三区观看模式 | 特级a老妇做爰全过程 | 在线观看日韩中文字幕 | 国产精品精品国产 | 亚洲免费专区 | 欧美日本不卡高清 | 五月天亚洲激情 | 日韩欧美在线免费观看 | 国产成人一区二区三区影院在线 | 美女精品在线观看 | 一区二区三区在线免费观看视频 | 免费观看视频的网站 | 91精品第一页 | 激情网第四色 | 免费av网址大全 | 欧美精品在线观看 | 欧美精品一区二区在线观看 | 在线观看视频一区二区三区 | 在线 成人 | 91精品国产一区二区三区 | 日日夜色| 最新中文字幕视频 | 中文电影网| 久久精品国产第一区二区三区 | 在线视频久久 | 久草影视在线 | 国产精品成人免费一区久久羞羞 | 在线av资源 | 久久精品久久国产 | www.人人草| 中国一 片免费观看 | 97av色| 欧美亚洲国产精品久久高清浪潮 | 久久视频免费观看 | 超碰国产在线播放 | 天天爽夜夜爽精品视频婷婷 | 美女av在线免费 | 中文字幕一区二区在线播放 | 最新av网址在线观看 | 四虎影视成人永久免费观看亚洲欧美 | 久久久不卡影院 | 亚洲免费精品一区二区 | 欧美日韩国产欧美 | 婷婷去俺也去六月色 | 国产精品美女久久久久久久 | 日韩高清dvd| 中文av日韩| 五月婷婷丁香综合 | 精品99视频 | 99re视频在线观看 | 中文字幕在线专区 | 九九热精品视频在线观看 | 激情视频网页 | 成人av在线影院 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 日韩精品 在线视频 | 在线a亚洲视频播放在线观看 | 色综合天天视频在线观看 | 久久蜜臀一区二区三区av | 黄色美女免费网站 | 天堂网中文在线 | 天天爱综合 | 国产精品久久久久久久久久久久午 | 亚洲最新视频在线 | 免费观看日韩 | 免费视频一区 | 人人搞人人爽 | 亚洲国产精品999 | 欧美一区二区三区在线看 | 久久免费av| 狠狠躁夜夜躁人人爽超碰97香蕉 | 免费观看成人av | 亚洲精品在线一区二区三区 | 91看毛片 | 高清国产一区 | 中文字幕 国产视频 | 99精品成人| av黄色免费看 | 久久黄色免费观看 | 最新极品jizzhd欧美 | 亚洲综合射 | 欧美最新另类人妖 | 性色在线视频 | 蜜桃视频成人在线观看 | 99久久久久久国产精品 | 二区三区在线视频 | 激情视频在线观看网址 | 五月开心六月伊人色婷婷 | 麻豆极品 | 91av九色| 国精产品满18岁在线 | 久久激情综合网 | www日韩视频 | av不卡中文 | 日日夜夜精品视频天天综合网 | 天天草天天操 | 在线观看aaa | 久久综合影音 | 欧美亚洲国产精品久久高清浪潮 | 中文字幕综合在线 | 国产免费高清视频 | 在线之家免费在线观看电影 | 国产色资源 | 我要看黄色一级片 | 国产伦理久久精品久久久久_ | 久久系列 | 欧美在线观看视频 | 国产精品久久视频 | 久久久久伦理电影 | 日韩亚洲欧美中文字幕 | 天天操天天爱天天爽 | 特级西西444www大精品视频免费看 | 超碰成人网 | 欧美一级在线 | 亚洲精品综合一二三区在线观看 | 久久久久久久久久久影院 | 天天拍天天操 | 欧美 日韩 国产 中文字幕 | 五月激情站 | 色综合激情网 | 免费人做人爱www的视 | 中文字幕在线日 | 成人免费中文字幕 | 伊人婷婷综合 | 大胆欧美gogo免费视频一二区 | 欧美成人高清 | 国产一区二区高清视频 | 91精品麻豆 | 免费高清在线观看成人 | 不卡av免费在线观看 | 国产精品视频99 | 午夜av大片 | 国产成人精品久久 | 久久a级片| 亚州精品天堂中文字幕 | 日韩精品欧美一区 | 亚洲mv大片欧洲mv大片免费 | 国精产品999国精产品视频 | 深爱综合网 | 天天干天天搞天天射 | av一区二区在线观看中文字幕 | 91在线免费观看网站 | 亚洲国产成人在线观看 | 激情视频91 | 欧美在线一级片 | 久久视频在线观看免费 | 深夜成人av| 99久久国产免费,99久久国产免费大片 | 欧美日韩国产一区二区在线观看 | 九九九在线观看视频 | 久久久影院一区二区三区 | 国产欧美在线一区 | www.久久久com| 久草9视频 | 97在线免费观看 | 国产护士在线 | 精品国产一区二区三区av性色 | 欧美日韩中文字幕综合视频 | 激情久久久久久久久久久久久久久久 | 一区二区三区电影在线播 | 欧美一区二区在线免费观看 | 天天看天天干 | 国产91精品一区二区麻豆网站 | 亚洲国产精品一区二区久久,亚洲午夜 | 国产精品99久久久久 | 狠狠的操你 | 九9热这里真品2 | 看黄色91 | 亚洲激情久久 | aaa日本高清在线播放免费观看 | 在线日韩中文字幕 | 特级毛片在线免费观看 | 在线观看黄色的网站 | 天天射狠狠干 | 最近能播放的中文字幕 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 超碰在线观看99 | 黄色午夜网站 | 国产精品99免视看9 国产精品毛片一区视频 | 久久午夜影视 | 日韩欧美xxx | 在线免费观看涩涩 | 成人污视频在线观看 | www日韩视频 | 综合精品久久 | 在线99热 | 国产五码一区 | 在线不卡a | 日韩免费观看一区二区三区 | 香蕉视频久久久 | 波多野结衣一区二区三区中文字幕 | 色多多在线观看 | 日韩精品高清不卡 | 国产99亚洲 | 中文字幕日本特黄aa毛片 | 日本不卡一区二区三区在线观看 | 精品免费国产一区二区三区四区 | 国产美女在线免费观看 | 久久久久免费网 | 久久精品区| 免费av小说 | 天天爱天天干天天爽 | 99久久日韩精品免费热麻豆美女 | www.xxx.性狂虐 | 高清国产在线一区 | 国产在线观看黄 | 人人爽人人爽人人爽人人爽 | 99 色| 亚洲国产精品女人久久久 | 亚洲精品白浆高清久久久久久 | 日韩在线精品视频 | 97超级碰碰碰碰久久久久 | 狠狠操天天操 | 毛片二区 | 欧美精品免费视频 | 久久999久久 | 国产精品系列在线播放 | 丁香花在线视频观看免费 | av丝袜在线 | 91精品久久久久久综合五月天 | 久草网站在线 | 国产精品日韩高清 | 亚洲欧美精品在线 | 九九在线精品视频 | 色久av| 国产中文字幕久久 | 91精品久久久久久综合乱菊 | 欧美夫妻生活视频 | 国产精品一区二区免费在线观看 | 亚洲精品网页 | 在线观看免费视频你懂的 | 亚洲一级国产 | 亚洲精品高清视频 | 亚洲国产精品第一区二区 | 久久久久在线视频 | 不卡的av在线播放 | 欧美性色综合网 | 国产色 在线 | 在线日韩视频 | 亚洲精品在线观看中文字幕 | 国产成人一区二区三区影院在线 | 久久在线精品视频 | 97狠狠干 | 久久综合九色综合欧美狠狠 | 国产精品婷婷午夜在线观看 | 亚洲1级片 | 精品欧美一区二区在线观看 | 丁香综合 | 国产精品成人一区二区 | 亚洲国产中文字幕 | 国产视频在线播放 | 亚洲一级电影在线观看 | 日韩女同av | 伊人中文字幕在线 | 国产日韩视频在线 | 免费福利视频导航 | 日韩国产精品毛片 | 国产精品成人aaaaa网站 | av在线网站大全 | 国产99色 | 激情综合色综合久久综合 | 色av男人的天堂免费在线 | 日日夜夜精品免费 | 亚洲免费在线看 | 国产婷婷久久 | 免费观看十分钟 | 中文字幕一二 | 粉嫩av一区二区三区免费 | 亚洲视频aaa | 婷婷激情五月 | 国产高清精品在线 | 女人高潮特级毛片 | 91精品久久久久久综合乱菊 | 99在线播放 | 国产成人av福利 | 五月综合在线观看 | 91久久精品一区二区二区 | 丁香综合 | 特级毛片爽www免费版 | 九热在线 | 九九九热精品免费视频观看网站 | 99草在线视频| 九九视频在线 | 日韩高清国产精品 | 狠狠操天天操 | 久久精精品视频 | 92av视频 | 黄色在线免费观看网址 | 亚洲自拍偷拍色图 | 国产成人一级 | 久久蜜桃av | av播放在线 | 免费在线色 | 国产又粗又硬又爽的视频 | 波多野结衣久久资源 | 久久精品中文字幕一区二区三区 | 成人蜜桃| 精品视频不卡 | 天堂久色 | 日韩久久精品一区二区三区下载 | 在线观看一区 | 国产爽妇网 | 9999国产精品 | 免费色av | 99久久久国产精品美女 | av中文字幕网站 | 日韩精品综合在线 | 欧美日韩在线观看一区 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 人人超碰人人 | 亚洲少妇激情 | 欧美一级特黄aaaaaa大片在线观看 | 五月婷婷在线观看 | 在线观看免费福利 | 天堂网一区二区三区 | 免费看片日韩 | 日本精品中文字幕 | 婷香五月 | 成人精品久久久 | 久草在线最新免费 | 一级黄色在线免费观看 | 久久精品久久久久电影 | 国产在线2020 | 一区二区欧美日韩 | 亚洲狠狠婷婷综合久久久 | 六月婷婷久香在线视频 | 18性欧美xxxⅹ性满足 | 国产打女人屁股调教97 | 久久高视频 | 久久精品一二三区白丝高潮 | 伊人中文在线 | 免费美女av | 91久久精品日日躁夜夜躁国产 | 成 人 黄 色 视频免费播放 | 精品福利国产 | 黄色字幕网 | 在线观看涩涩 | 天天爱av导航 | 成人毛片一区二区三区 | 天天天色 | 综合网天天色 | 最新国产福利 | www.婷婷色 | 视频一区亚洲 | 国产精品一区二区在线播放 | 久久爱www. | 国产一区在线看 | 中文字幕资源网在线观看 | 久久久久久久久久久久影院 | 国产一区精品在线观看 | 中国一级片在线观看 | av一区二区三区在线 | 免费看高清毛片 | 奇米影视8888在线观看大全免费 | 天天色天天草天天射 | 久久成人精品视频 | www.久久久.com| 韩国一区二区三区在线观看 | 香蕉视频导航 | 国产人成在线观看 | 国产精品岛国久久久久久久久红粉 | 亚洲一级电影在线观看 | 欧洲精品一区二区 | 米奇四色影视 | 国产视频中文字幕在线观看 | 91免费在线看片 | 久久影视精品 | ,午夜性刺激免费看视频 | 成人黄色中文字幕 | 亚洲欧洲成人 | 2022久久国产露脸精品国产 | 国产免费小视频 | 免费看v片| 久久字幕 | 亚洲午夜久久久久 | 国产九九九视频 | 亚洲精品五月天 | 激情婷婷综合 | 亚洲免费永久精品国产 | 国产精品网红直播 | 超碰在线98| 一区在线观看 | 蜜臀久久99精品久久久久久网站 | 四虎在线视频 | 三级av免费 | 欧美日韩中文字幕综合视频 | 97超碰国产精品 | 91传媒免费观看 | 人人爽人人爽人人 | 亚洲高清视频在线播放 | 一区二区视 | 97人人精品| 亚洲精品乱码久久久久久蜜桃欧美 | 日韩激情av在线 | 久久久久福利视频 | 欧美日韩不卡一区二区三区 | 99免费在线视频观看 | 久久美女精品 | 日韩理论片中文字幕 | a黄色 | 热久在线 | 99精品视频在线看 | 欧美日本中文字幕 | 中文字幕一二三区 | 三级av小说 | 国产精品 国内视频 | 久久超 | 草免费视频 | 九九热在线视频免费观看 | 91精品视频一区二区三区 | 色在线网站 | 亚洲不卡av一区二区三区 | 久久久黄色免费网站 | 狠狠狠色 | 久久免费视频一区 | 天天色天 | 日韩欧美视频一区二区 | 久草| 久久99久国产精品黄毛片入口 | 国内少妇自拍视频一区 | 91香蕉嫩草 | 欧美日韩一区二区在线观看 | 91字幕 | 国外成人在线视频网站 | 亚洲视频网站在线观看 | 日本中文字幕电影在线免费观看 | 不卡的av在线 | 视频精品一区二区三区 | 欧美日韩国产三级 | 国产精品私拍 | 天天干,天天干 | 丁香六月中文字幕 | 日韩国产精品一区 | 免费在线黄色av | 久久久久国产精品www | 99r在线播放 | wwwwww色| 99精品视频免费看 | 一级片免费观看视频 | 在线观看中文字幕dvd播放 | 久久人人爽爽 | 婷婷丁香色综合狠狠色 | 欧美一区二区在线 | 亚洲 中文 欧美 日韩vr 在线 | 97国产超碰在线 | av丝袜在线 | 国产视频一二区 | 九九免费观看全部免费视频 | 久久爱www.| 99热.com | 亚洲网站在线看 | 日本精品久久久久中文字幕 | 久久歪歪| 久久香蕉电影网 | 欧美一级片免费播放 | 久草视频在线免费播放 | 午夜黄色 | 黄色在线成人 | 精品亚洲视频在线 | 手机在线观看国产精品 | 色婷婷色 | free. 性欧美.com | 91完整版在线观看 | 国产精品一区二区久久精品爱微奶 | 视频在线观看亚洲 | 日日干夜夜干 | 91视频88av| 9在线观看免费 | 色综合天天色综合 | 欧美日韩中文在线观看 | 97超碰在| 婷婷色综合 | 国产亚洲无 | 国产成人黄色在线 | 久久久久久久久久电影 | 69av在线视频 | 国产精品扒开做爽爽的视频 | 亚洲爱爱视频 | 色婷婷六月 | 久久99精品久久久久蜜臀 | 黄色av一级 | 在线观看日韩精品 | 久久99电影 | 亚洲 中文字幕av | 亚洲年轻女教师毛茸茸 | 精品在线观看一区二区 | 免费观看v片在线观看 | 国产视频精品久久 | 亚洲综合在线五月天 | 国产免费美女 | 欧美激情视频在线观看免费 | 天堂av色婷婷一区二区三区 | 91精品成人 | 精品视频成人 | 97电影院在线观看 | 亚洲精品在线一区二区三区 | 国产精品一区在线 | 日韩精品视频久久 | www.福利视频 | 久久成人午夜 | 日本精品一二区 | 日韩在线视频网站 | 91在线视频播放 | 国产麻豆果冻传媒在线观看 | 日韩激情视频在线 | 国产亚洲精品成人av久久ww | 精品国产1区2区3区 国产欧美精品在线观看 | 久久久免费看片 | 国产 日韩 欧美 自拍 | 黄色片亚洲 | 色永久免费视频 | 免费看三级黄色片 | 日韩理论片 | 一区二区三区韩国免费中文网站 | 久久久久久久久久久成人 | 国产黄在线免费观看 | 久草线| 精品在线播放视频 | 国产成人在线播放 | 碰超在线观看 | 西西大胆啪啪 | 国产精品久久久久久久久久久久午夜片 | 一区二区三区四区五区在线 | 日本一区二区免费在线观看 | 五月开心色 | 亚洲激情六月 | 麻豆视频在线观看免费 | 三日本三级少妇三级99 | 国产超碰在线 | 天天搞天天 | 三日本三级少妇三级99 | 亚州中文av | 午夜精品视频一区 | 欧美日韩二区在线 | 免费看国产曰批40分钟 | 久久久国际精品 | 少妇bbr搡bbb搡bbb | 免费a v视频 | 波多野结衣电影一区二区三区 | 国产不卡一区二区视频 | 日韩精品中字 | 亚洲综合成人在线 | 99久久99久久精品 | 黄色福利网 | 亚洲成人精品av | 伊人资源站 | 在线免费看黄网站 | 一区二区精品国产 | 91视频三区| 九月婷婷综合网 | 久久久免费视频播放 | 色香网 | 亚洲国产中文在线观看 | 亚洲特级片 | 免费三级网 | 日韩欧美精品在线 | 99久久精品国产毛片 | 亚洲最大av网 | 97免费中文视频在线观看 | 天天草天天色 | 国产一区二区三区免费在线 | 狠狠的日| 手机看片1042 | 六月丁香综合网 | 人人爽人人av| 香蕉视频在线免费 | 日本精品一区二区三区在线播放视频 | 91人人澡人人爽人人精品 | 日韩精品中文字幕久久臀 | 久久久久久高潮国产精品视 | 久久综合干 | 97成人精品 | 日韩精品资源 | 91精品综合| 天天操夜夜操夜夜操 | 亚洲天堂网在线观看视频 | 日本精品久久久久久 | 视频一区二区视频 | 波多野结衣视频一区二区三区 | 亚洲成人高清在线 | 欧美三级在线播放 | 黄色av一区二区 | 国产美女久久久 | 国产精品网站一区二区三区 | 国产精品视频最多的网站 | 日韩理论| 黄色毛片在线 | 在线电影 一区 | 狠狠干成人综合网 | 欧美激情综合五月色丁香 | 国产黄色一级大片 | 在线成人一区二区 | 激情久久一区二区三区 | 欧美精品三级 | 国产精品高潮久久av | 一区二区三区免费网站 | 久久激情小视频 | 午夜精品久久久久久中宇69 | 中文字幕免费高清在线观看 | 欧美日韩一区二区三区视频 | 欧美人牲 | 亚洲 欧美 另类人妖 | 国产精品一二 | 伊人中文在线 | 精品国产亚洲在线 | 亚洲闷骚少妇在线观看网站 | 欧美日韩观看 | 一级c片| 精品视频久久 | 91中文字幕在线 | 精品久久久久久电影 | 日韩av网页 | 九九欧美| 午夜在线观看影院 | 欧美激情综合网 | 亚洲欧美色婷婷 | 久久婷婷色 | 在线国产日本 | 欧美日韩国产色综合一二三四 | 亚洲欧美一区二区三区孕妇写真 | 色com网 | 久久99精品国产91久久来源 | 午夜视频不卡 | www.久久精品视频 | 激情久久综合网 | 五月亚洲综合 | 国产视频综合在线 | 亚洲a网 | 久久久毛片 | 日产av在线播放 | 999电影免费在线观看 | 91大神电影 | 日韩电影一区二区在线观看 | 人人玩人人添人人澡超碰 | 免费亚洲精品 | 国产亚洲精品成人av久久影院 | 97国产小视频| 久久97久久97精品免视看 | 国产精品第三页 | 久视频在线 | av看片网 | 96av麻豆蜜桃一区二区 | 国色天香第二季 | 国产精品久久久毛片 | 在线播放 日韩专区 | 韩国三级av在线 | 3d黄动漫免费看 | 国内精品久久久 |