精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Redis的雙向鏈表一文全知道

存儲 存儲軟件 Redis
在Redis中鏈表List的應用非常廣泛,但是Redis是采用C語言來寫,底層采用雙向鏈表實現(這邊提一嘴,如果是科班出身或者大學有學過數據結構的同學,可以劃走啦)。我們今天的重點就是雙向鏈表。

 

[[331862]]

本文轉載自微信公眾號「學習Java的小姐姐」,作者學習Java的小姐姐0618 。轉載本文請聯系學習Java的小姐姐公眾號。

前言

hello,又見面了。不要問為什么,問就是勤勞。馬上要開啟爆更模式啦。

在Redis中鏈表List的應用非常廣泛,但是Redis是采用C語言來寫,底層采用雙向鏈表實現(這邊提一嘴,如果是科班出身或者大學有學過數據結構的同學,可以劃走啦)。我們今天的重點就是雙向鏈表。

 

API使用

先來使用一下API。如果之前有用過的同學,可以直接跳到下一小節。

lpush左側插入數據

使用lpush命令往list的左側中插入a,b,c三個字符,這邊注意順序,查詢出來的是c,b,a。下面會說為什么,先挖個坑。

 

rpush右側插入數據

使用rpush命令往list中插入d,e兩個字符,查詢出來的順序是和我們想的一樣,最后兩位是d,e。

 

刪除某個數據

使用lrem命令刪除a字符,那么中間1代表什么意思呢?其為count,表示移除列表中與a相等的元素個數。即如果count>0,表示從表頭開始向表尾搜索,移除count個與a相等的元素。如果count<0,表示從表尾開始向表頭搜索,移除count個與a相等的元素。如果count=0,移除所有與a相等的元素,因為是移除所有,所以不管從表頭還是表尾,結果是一樣的。

 

修改某個數據

使用lset命令將mylist的下標為1的元素修改為dd,原來list為c ,b,d,e,修改后的結果為c,dd,d,e。

 

具體邏輯圖

這邊看不懂沒關系,下面會針對每個模塊詳細說明。

 

雙向鏈表的定義

節點ListNode

包括頭指針prev,尾指針next,當前的值value,如下圖所示。每個節點都有兩個指針,既能從表頭根據尾指針找到表尾,又能從表尾根據頭指針prev找到表頭,如果將他們連起來,就構成了雙向鏈表。

 

具體代碼如下:

  1. //定義鏈表節點的結構體  
  2. typedef struct listNode { 
  3.     //前面一個節點的指針  
  4.     struct listNode *prev; 
  5.     //后面一個節點的指針  
  6.     struct listNode *next
  7.     //當前節點的值的指針 ,因為值的類型不確定  
  8.     void *value; 
  9. } listNode; 

整體架構

包括頭指針head,尾指針tail,整個鏈表長度len,一些函數(個人認為不重要,如果有知道的小伙伴歡迎評論),如下圖所示。頭指針head指向整個鏈表的第一個節點,尾指針tail指向整個鏈表的最后一個節點。

 

具體代碼如下:

  1. //定義鏈表,對鏈表節點的再封裝 
  2. typedef struct list { 
  3.     listNode *head;//頭指針 
  4.     listNode *tail;//尾指針 
  5.     void *(*dup)(void *ptr);//節點拷貝函數 
  6.     void (*free)(void *ptr);//釋放節點值函數 
  7.     int (*match)(void *ptr, void *key);//判斷兩個節點是否相等函數 
  8.     unsigned long len;//鏈表長度 
  9. } list; 

雙向鏈表的實現

創建表頭

我們創建list表結構,首先需要判斷當前是否有可分配的空間來創建,使用zmalloc方法來分配空間,如果分配不了,則返回NULL,如果可以分配,則繼續。接著賦值list的頭節點head和尾節點tail為NULL,len為0,賦值相關函數為NULL。最后返回結果list。

  1. //創建一個表頭,返回值是鏈表結構的指針 
  2. list *listCreate(void) 
  3.     struct list *list; 
  4.     //嘗試分配空間 
  5.     if ((list = zmalloc(sizeof(*list))) == NULL
  6.         return NULL
  7.     //相關屬性賦值 
  8.     list->head = list->tail = NULL
  9.     list->len = 0; 
  10.     list->dup = NULL
  11.     list->free = NULL
  12.     list->match = NULL
  13.     //最終結果返回 
  14.     return list; 

清空表

傳入list的指針,首先定義當前節點current,使其指向頭指針,定義len,使其等于list的長度。接著進行循環,每次len減一,定義新節點next,始終指向當前節點current的下一個節點,如果有值,則釋放該節點,當前節點current后移,next節點同樣后移。直到len為0,釋放完所有節點,退出循環。最后賦值list的頭節點head和尾節點tail為NULL,len為0。

注意:這邊和SDS一樣,清空并不是直接刪除list,而是刪除其數據,外層的list結構仍然存在。這其實上是惰性刪除。

  1. void listEmpty(list *list) 
  2.     unsigned long len; 
  3.     //定義兩個節點指針currentnext 
  4.     listNode *current, *next
  5.     //當前節點指針current指向list的頭節點位置,即list的第一個數據 
  6.     current = list->head; 
  7.     //len為list的長度 
  8.     len = list->len; 
  9.     //開始循環,每次len減1 
  10.     while(len--) { 
  11.         //先讓下一個指針指向下一個節點,因為底下直接釋放當前節點,如果不在此處復制,底下就獲取不到了 
  12.         next = current->next
  13.         //釋放當前節點的值 
  14.         if (list->free) list->free(current->value); 
  15.         //釋放當前節點 
  16.         zfree(current); 
  17.         //當前節點等于剛才的下一個節點next,即開始往后移,開始下一輪循環 
  18.         current = next
  19.     } 
  20.     //釋放完給頭指針head,尾指針tail賦值為NULL 
  21.     list->head = list->tail = NULL
  22.     //len賦值0 
  23.     list->len = 0; 

添加元素到表頭

添加元素到表頭,首先新建一個新節點node,判斷是否有內存分配,如果有,則繼續,如果沒有,則返回NULL,退出方法。這邊新節點是用來存在輸入參數中的value的,所以需要內存。接著將新節點node的value值賦值為輸入參數value。最后需要調整list的頭指針,尾指針,原來第一個節點的指針情況(這邊看下圖,描述起來有點混亂,圖片一目了然)。最最后,就是list的len加1,返回list。

舉個例子,如果要在list中插入節點f,首先將節點的頭指針賦值為空(對應步驟1),然后將新節點的尾指針next指向第一個節點(對應步驟2),將第一個節點的prev指向新節點(對應步驟3),最后將list的頭指針head指向新節點(對應步驟4)。這邊需要注意的是,步驟2和步驟3需要在步驟4前面,不然會找到第一個節點。

 

具體代碼如下:

  1. //添加一個元素到表頭 
  2. list *listAddNodeHead(list *list, void *value) 
  3.     listNode *node; 
  4.  
  5.     if ((node = zmalloc(sizeof(*node))) == NULL
  6.         return NULL
  7.     node->value = value;//為當前節點賦值 
  8.     //如果當前list為空 
  9.     if (list->len == 0) { 
  10.         list->head = list->tail = node;//頭尾指針都指向該節點 
  11.         node->prev = node->next = NULL;//當前節點的頭尾指針都為null 
  12.     } else {//如果當前list不為空 
  13.         node->prev = NULL;//新節點的頭指針為null 
  14.         node->next = list->head;//新節點的尾指針指向原來的尾指針 
  15.         list->head->prev = node;//原來的第一個節點的頭指針指向新節點 
  16.         list->head = node;//鏈表的頭指針指向新節點 
  17.     } 
  18.     list->len++;//list長度+1 
  19.     return list; 

添加元素到表尾

添加元素到表尾,首先新建一個新節點node,判斷是否有內存分配,如果有,則繼續,如果沒有,則返回NULL,退出方法。這邊新節點是用來存在輸入參數中的value的,所以需要內存。接著將新節點node的value值賦值為輸入參數value。最后需要調整list的頭指針,尾指針,原來最后一個節點的指針情況(這邊看下圖,描述起來有點混亂,圖片一目了然)。最最后,就是list的len加1,返回list。

舉個例子,如果要在list中插入節點f,首先將節點的尾指針賦值為空(對應步驟1),然后將新節點的頭指針指向最后一個節點(對應步驟2),將最后一個節點的next指向新節點(對應步驟3),最后將list的尾指針tail指向新節點(對應步驟4)。

 

步驟如下:

  1. //添加元素到表尾 
  2. list *listAddNodeTail(list *list, void *value) 
  3.     //新建節點node 
  4.     listNode *node; 
  5.     //嘗試分配內存 
  6.     if ((node = zmalloc(sizeof(*node))) == NULL
  7.         return NULL
  8.     //為新節點node賦值 
  9.     node->value = value; 
  10.     //調整指針 
  11.     if (list->len == 0) { 
  12.         list->head = list->tail = node; 
  13.         node->prev = node->next = NULL
  14.     } else { 
  15.         node->prev = list->tail; 
  16.         node->next = NULL
  17.         list->tail->next = node; 
  18.         list->tail = node; 
  19.     } 
  20.     //len加1 
  21.     list->len++; 
  22.     return list; 

插入

為list的某個節點old_node的after(大于0為前面新增,小于0為后面新增)新增新值value,首先新建一個新節點node,判斷是否有內存分配,如果有,則繼續,如果沒有,則返回NULL,退出方法。這邊新節點是用來存在輸入參數中的value的,所以需要內存。接著根據after的值確定是在節點old_node的前面新增數據,還是在節點old_node的后面新增數據,具體的是指針的調整。最后len加1,返回list。

  1. //在list的某個位置old_node的after(前后)插入value值 
  2. list *listInsertNode(list *list, listNode *old_node, void *value, int after) { 
  3.     listNode *node; 
  4.  
  5.     if ((node = zmalloc(sizeof(*node))) == NULL
  6.         return NULL
  7.     node->value = value; 
  8.     if (after) {//大于0 
  9.         node->prev = old_node; 
  10.         node->next = old_node->next
  11.         if (list->tail == old_node) { 
  12.             list->tail = node; 
  13.         } 
  14.     } else {//小于0 
  15.         node->next = old_node; 
  16.         node->prev = old_node->prev; 
  17.         if (list->head == old_node) { 
  18.             list->head = node; 
  19.         } 
  20.     } 
  21.     if (node->prev != NULL) { 
  22.         node->prev->next = node; 
  23.     } 
  24.     if (node->next != NULL) { 
  25.         node->next->prev = node; 
  26.     } 
  27.     list->len++; 
  28.     return list; 

刪除

從list中刪除節點node,如果該節點的前面存在節點,使其前面一個節點的next指針指向node后面一個節點的地址,其實就是跳過了node節點,如果該節點的前面不存在節點,則將list的頭指針指向node的下一節點地址。同樣的,如果該節點的后面存在節點,邏輯一樣的。最后釋放要刪除的節點node內存,len減1。

  1. //從鏈表list中刪除某個節點node 
  2. void listDelNode(list *list, listNode *node) 
  3.     //如果該節點的前面存在節點 
  4.     if (node->prev) 
  5.         node->prev->next = node->next
  6.     else 
  7.         list->head = node->next
  8.     //如果該節點的前面存在節點 
  9.    if (node->next
  10.         node->next->prev = node->prev; 
  11.     else 
  12.         list->tail = node->prev; 
  13.     //釋放當前節點node的值 
  14.     if (list->free) list->free(node->value); 
  15.     //釋放內存 
  16.     zfree(node); 
  17.      //len-1 
  18.     list->len--; 

總結

該篇主要講了Redis的list數據類型的底層實現雙向鏈表adlist,先從list的一些API使用,引出雙向鏈表數據結構,進而結合源碼對雙向鏈表進行描述,包括節點listNode和list的頭指針和尾指針,最后針對list的往表頭插入元素,往表尾插入元素,刪除,修改等方法進行源碼解析,使其對雙向鏈表有更清晰的認識。

 

如果覺得寫得還行,麻煩給個贊👍,您的認可才是我寫作的動力!

 

責任編輯:武曉燕 來源: 學習Java的小姐姐
相關推薦

2024-04-26 00:02:00

Rust語言LinkedList

2022-03-24 08:51:48

Redis互聯網NoSQL

2022-04-07 08:37:05

鏈表技巧單鏈表

2022-12-20 07:39:46

2019-07-21 09:17:11

數據緩存架構

2023-12-26 07:33:45

Redis持久化COW

2022-03-13 18:27:09

Redis數據庫開源

2020-02-07 11:07:53

數組鏈表單鏈表

2024-08-19 13:46:00

2023-02-26 00:00:04

項目標簽體系

2025-04-07 08:20:00

ORMPython代碼

2021-01-06 05:31:13

線性表鏈表數據

2020-11-10 10:26:16

串口打印工具

2020-05-13 17:12:21

大數據分布式引擎

2020-01-22 16:50:32

區塊鏈技術智能

2020-05-20 22:37:42

HTTPSSSL雙向驗證

2024-05-30 08:05:17

2024-04-28 08:14:29

C#隊列Queue

2019-09-27 08:53:47

Redis數據C語言

2021-09-17 13:34:57

大數據Redis 應用
點贊
收藏

51CTO技術棧公眾號

黄色在线视频网站| 精品亚洲永久免费| 婷婷成人av| 亚洲一区二区三区四区的| 精品久久久久久综合日本 | 日本一区二区免费高清| 欧美日产国产精品| 免费看日b视频| 欧美拍拍视频| 国产精品香蕉一区二区三区| 欧美在线播放视频| 极品久久久久久| 亚洲国产合集| 日韩欧美黄色影院| 日本精品久久久久中文字幕| 黄色免费在线看| 91免费看`日韩一区二区| 国产一区二区丝袜| www成人在线| 99视频精品全国免费| 精品无人区太爽高潮在线播放 | 日本成人性视频| 牛牛影视精品影视| 国产suv精品一区二区883| 国产精品久久久久久久久免费看 | 国产欧美黑人| 欧美国产综合一区二区| 激情小说综合网| 国产美女免费视频| 日本va欧美va精品发布| 国内精品中文字幕| www.超碰在线观看| 欧美日韩中字| 亚洲九九九在线观看| 任你躁av一区二区三区| 亚洲天堂网站| 欧美性生活久久| 国产日韩一区二区在线观看| 不卡一本毛片| 亚洲精品国产精品乱码不99 | 国产精品亚洲无码| 久久这里只有精品一区二区| 3d成人h动漫网站入口| 波多野结衣天堂| 女生影院久久| 日本高清不卡在线观看| 免费看又黄又无码的网站| 最新国产在线拍揄自揄视频| 亚洲欧洲精品一区二区三区 | 在线观看黄av| 亚洲国产精品成人综合色在线婷婷 | 亚洲一区二区三区免费| 日韩一区二区影院| 国产亚洲色婷婷久久| 成人日韩视频| 欧美一区二区三区的| 青娱乐精品在线| 欧美成年网站| 日韩精品专区在线影院重磅| 男生和女生一起差差差视频| 日韩一区二区三区精品视频第3页| 这里只有精品电影| 亚洲欧美一区二区三区不卡| 青草伊人久久| 亚洲第一av网| 国产ts丝袜人妖系列视频| 日本一区福利在线| 亚洲欧美制服丝袜| 毛片aaaaaa| 99久久.com| 欧美成人精品一区二区三区| 久艹视频在线观看| 夜夜爽av福利精品导航| 日韩av123| 伊人久久国产精品| 国产一区二区三区免费观看| 成人欧美一区二区三区黑人免费| 天天爱天天干天天操| 2024国产精品| 亚洲欧美电影在线观看| 日本在线免费看| 亚洲一区二区三区影院| 1024精品视频| 日本在线中文字幕一区二区三区| 欧美日韩你懂的| 欧美xxxx黑人| 伊甸园亚洲一区| 久久久精品一区二区| 精品在线视频免费观看| 免费精品视频| 91免费欧美精品| 午夜av免费在线观看| 中文av字幕一区| 免费高清一区二区三区| 久久精品女人天堂av免费观看| 精品视频在线视频| 中文字幕视频观看| 成人精品影院| 欧美黄色性视频| 无码人妻丰满熟妇区五十路 | 影音先锋在线一区| 国产精品视频yy9099| 亚洲国产剧情在线观看| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩亚洲国产成人| 超碰国产一区| 欧美tk—视频vk| www久久久久久久| 在线视频观看日韩| 国产精品一二三视频| 人妻妺妺窝人体色www聚色窝| 亚洲国产精品成人久久综合一区 | 老妇喷水一区二区三区| 亚洲r级在线观看| 欧美孕妇孕交xxⅹ孕妇交| 亚洲婷婷在线视频| 国产情侣av自拍| 高潮按摩久久久久久av免费| 中文字幕欧美亚洲| 日韩精品一区二区三| 国产在线一区二区| 日韩中文字幕一区| 青青草视频在线免费直播| 欧美亚洲国产一区二区三区va| 日本精品一二三区| 日韩系列欧美系列| 日本精品视频在线| 日本精品久久久久久| 亚洲狼人国产精品| 在线黄色免费观看| 国产一区二区亚洲| 欧美一级成年大片在线观看| 亚洲欧美黄色片| 亚洲欧美日韩在线播放| 九色91popny| 国产成人精品三级高清久久91| 久久久久五月天| 精品国产va久久久久久久| 国产精品久久久久久久蜜臀| 激情婷婷综合网| 免费一区二区| 国产91免费观看| 裸体xxxx视频在线| 日本道精品一区二区三区| 亚洲久久久久久| 9国产精品视频| 好看的日韩精品| 爱啪视频在线观看视频免费| 亚洲国产精品va| 国产无码精品一区二区| 成人免费高清视频| 国产欧美日韩网站| 欧美人妖视频| 日本欧美精品在线| 国产在线一在线二| 欧洲一区在线观看| 开心激情五月网| 国产一区二区三区在线观看精品| 中国一级黄色录像| 试看120秒一区二区三区| 欧美韩国理论所午夜片917电影| 亚洲精品成av人片天堂无码| 亚洲自拍另类综合| 久久久午夜精品福利内容| 亚洲深夜福利| 日韩理论片在线观看| 国产精品黄色片| 俺去啦;欧美日韩| 99久久精品国产一区二区成人| 亚洲美女视频在线观看| 91超薄肉色丝袜交足高跟凉鞋| 亚洲美女视频在线免费观看| 欧美高清视频一区| 欧美啪啪网站| 欧美福利在线观看| 亚洲av片在线观看| 欧美老肥妇做.爰bbww| 日日骚一区二区三区| yourporn久久国产精品| 激情婷婷综合网| 永久91嫩草亚洲精品人人| 国产精品亚洲综合| 欧美xxxxxx| 久久亚洲精品中文字幕冲田杏梨 | 亚洲日韩第一页| 国产原创中文av| 亚洲成av人片一区二区三区| 无码一区二区三区在线| 国产麻豆成人传媒免费观看| 国产一区二区在线视频播放| 成人在线亚洲| 99在线免费观看视频| 中文字幕在线视频久| 日韩在线中文视频| 蜜臀久久精品久久久久| 欧美亚日韩国产aⅴ精品中极品| 人妻人人澡人人添人人爽| 99国产一区二区三精品乱码| 在线免费视频一区| 一本色道精品久久一区二区三区| 一区二区三区四区不卡| 久久久久观看| 亚洲aa中文字幕| 日韩av超清在线观看| 久久久久久久久久久91| 草碰在线视频| 亚洲国产精品va在线看黑人动漫| 91丨九色丨蝌蚪丨对白| 欧美日韩在线免费| 欧美精品一级片| 亚洲国产成人午夜在线一区| www.男人天堂| 国产成人亚洲综合a∨婷婷图片| 久久九九国产视频| 亚洲巨乳在线| 妺妺窝人体色www看人体| 欧美一二区在线观看| 精品一卡二卡三卡四卡日本乱码| 国产一区精品二区| 国产精品成人在线| 在线观看欧美日韩电影| 国模视频一区二区| 日韩经典av| 免费91在线视频| 欧美私人网站| 亚洲天堂成人在线视频| 性插视频在线观看| 精品国产乱码久久久久久1区2区| 国产色在线视频| 欧美日韩一区视频| 一级久久久久久| 欧美日韩中文字幕在线| 日韩欧美三级在线观看| 一区二区不卡在线播放| 欧美在线视频第一页| 国产精品国产自产拍在线| 国产美女免费无遮挡| 91碰在线视频| 北岛玲一区二区| 99久久99久久精品免费看蜜桃 | 国产精品流白浆在线观看| 91蜜桃网站免费观看| 精品一区二区三区四区五区 | 亚洲欧美另类小说| 黄色三级生活片| 亚洲国产精品黑人久久久 | 亚洲永久免费视频| 欧美日韩成人免费观看| 一区二区三区中文在线观看| 欧美日韩精品在线观看视频| 樱桃国产成人精品视频| 欧美日韩免费做爰视频| 亚洲成人免费av| 日韩视频免费观看高清| 欧美日韩亚洲一区二| 天天干天天操天天操| 欧美综合色免费| 6—12呦国产精品| 欧美一卡二卡在线| 亚洲第一成人av| 亚洲国产福利在线| 精品99又大又爽又硬少妇毛片| 亚洲小视频在线| 日本中文字幕在线视频| 欧美精品在线观看91| 成人在线免费观看黄色| 人妖精品videosex性欧美| 日韩制服一区| 91系列在线播放| 粉嫩av一区二区| 欧美性大战久久久久| 日韩大片在线| 日韩成人手机在线| 久久久亚洲人| 久久久久久综合网| 成人午夜看片网址| 中文字幕免费视频| 亚洲日本丝袜连裤袜办公室| 日本熟妇毛耸耸xxxxxx| 欧美性做爰猛烈叫床潮| 国产富婆一级全黄大片| 日韩av在线高清| 免费在线观看黄色| 久久久伊人欧美| 欧美日韩在线精品一区二区三区激情综合| 国产美女精品视频| 天堂av一区二区三区在线播放 | 91嫩草视频在线观看| 久久夜色电影| 亚洲一区二区三区加勒比| 午夜激情一区| 日韩视频免费在线播放| 激情图片小说一区| 成人h动漫精品一区| 国产精品你懂的| 欧美成人精品欧美一级乱黄| 欧美视频精品在线观看| 黄色av中文字幕| 日韩在线视频观看正片免费网站| 91福利在线免费| 国产在线精品播放| 美女一区二区在线观看| 免费观看中文字幕| 日韩精品国产精品| 国产在线不卡av| 亚洲天堂成人在线观看| 国产女主播喷水视频在线观看| 日韩一区二区三免费高清| 国产在线网站| 国内精品一区二区三区| 亚洲二区av| 日韩精品欧美在线| 国产亚洲激情| 国产xxx在线观看| 国产精品福利一区| 激情五月婷婷网| 日韩成人在线电影网| 免费毛片在线看片免费丝瓜视频| 国产精品爽爽爽| 亚洲尤物av| 日韩avxxx| 成人av网站免费观看| xxxx日本少妇| 欧美麻豆精品久久久久久| 精品亚洲综合| 情事1991在线| 台湾亚洲精品一区二区tv| 你懂的av在线| 99久久精品免费看| 18精品爽视频在线观看| 日韩一区二区三区四区| 黄色小网站在线观看| 国产又爽又黄的激情精品视频 | 97成人超碰视| 日韩精品――中文字幕| 精品福利二区三区| 欧美性受ⅹ╳╳╳黑人a性爽| 91在线观看免费观看| 91亚洲国产成人久久精品| 五月天激情视频在线观看| 国产亚洲一区二区三区在线观看| 一级黄色大片视频| 亚洲欧美变态国产另类| 黑人巨大亚洲一区二区久| 欧美一区观看| 快she精品国产999| 国产精品美女高潮无套| 欧美午夜影院一区| 91.xxx.高清在线| 国产在线999| 91tv精品福利国产在线观看| 香蕉视频xxxx| 亚洲一区自拍偷拍| 动漫av一区二区三区| 97精品在线视频| 日韩大片在线免费观看| 国语对白做受xxxxx在线中国| 久久精品综合网| 在线不卡免费视频| 欧美精品一区在线播放| 国产伦精品一区二区三区在线播放 | 欧美肥妇bbwbbw| 日韩欧美中文一区| 999精品网| 欧美日韩系列| 久久国产福利国产秒拍| 激情综合五月网| 亚洲激情自拍图| 成人在线免费av| 成人午夜视频免费观看| 99视频精品在线| 中文字幕第2页| 久久伊人91精品综合网站| 国产精品丝袜在线播放| 日本精品一区在线观看| 国产精品麻豆视频| 午夜美女福利视频| 78m国产成人精品视频| 日韩欧美一区二区三区免费看| 绯色av蜜臀vs少妇| 欧美午夜xxx| 黄色视屏免费在线观看| 久久伦理网站| 国产在线精品免费av| 精品成人av一区二区在线播放| 在线观看国产精品日韩av| 日韩在线成人| 草草草在线视频| 亚洲精品日产精品乱码不卡| 亚州精品国产精品乱码不99按摩| 国产欧美一区二区三区在线| 在线视频观看日韩| 国产精品suv一区二区88| 亚洲成人黄色网| 亚洲国产精选| 成 年 人 黄 色 大 片大 全| 最新中文字幕一区二区三区| 亚洲欧洲综合在线| 91香蕉亚洲精品| 日韩成人免费电影|