《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 業界動態 > C語言的那些小秘密之鏈表

C語言的那些小秘密之鏈表

2015-05-29

  大多數的讀者在學習編程語言的時候都不喜歡那些枯燥的文字描述,包括我自己在開始學習編程的時候也是這樣,對于代碼的熱情遠遠高于文字,所以我在我寫東西的時候也不喜歡用枯燥的文字描述來向讀者講解,更喜歡用代碼加上適當的文字描述的方式進行講解,因為有些東西可能用枯燥的文字描述半天還不如實實在在的給讀者呈現出一段簡單的代碼,讓讀者理解得更加的透徹些。但是并不是說文字描述就沒用,文字描述也很重要,只是絕大部分讀者都更加的希望直接達到最終的效果,都想跳過那些中間的步驟。接下來我們接著上一篇博客《C語言的那些小秘密之鏈表(三)》的內容繼續講解linux內核雙向循環鏈表。[cpp] view plaincopystatic inline int list_empty(const struct list_head *head)

  {

  return head->next == head;

  }

  static inline int list_empty_careful(const struct list_head *head)

  {

  struct list_head *next = head->next;

  return (next == head) && (next == head->prev);

  }

 

  運行結果為:

  [html] view plaincopyroot@ubuntu:/home/paixu/dlist_node# ./a

  student num: 5 student name: Stu5

  student num: 4 student name: Stu4

  student num: 3 student name: Stu3

  student num: 2 student name: Stu2

  student num: 1 student name: Stu1

  使用list_empty()檢測,鏈表非空

  使用list_empty_careful()檢測,鏈表非空

  看看代碼就知道如何使用了,接下來看看鏈表的合成。

  [html] view plaincopystatic inline void __list_splice(struct list_head *list,

  struct list_head *head)

  {

  struct list_head *first = list->next;

  struct list_head *last = list->prev;

  struct list_head *at = head->next;

  first->prev = head;

  head->next = first;

  last->next = at;

  at->prev = last;

  }

  

  在這種情況下會丟棄list所指向的頭結點,因為兩個鏈表有兩個頭結點,所以我們必須要去掉其中一個頭結點。只要list非空鏈,head無任何限制,該函數就能實現鏈表的合并。

  [cpp] view plaincopystatic inline void list_splice_init(struct list_head *list,

  struct list_head *head)

  {

  if (!list_empty(list)) {

  __list_splice(list, head);

  INIT_LIST_HEAD(list);

  }

  }

  以上函數的功能是將一個鏈表list的有效信息合并到另外一個鏈表head后,重新初始化被去掉的空的鏈表頭。這樣的描述可能不是太好理解,接下來看看一段代碼。

  [html] view plaincopy#include

  #include

  #include "list.h"

  typedef struct _stu

  {

  char name[20];

  int num;

  struct list_head list;

  }stu;

  int main()

  {

  stu *pstu,*pstu2;

  stu *tmp_stu;

  struct list_head stu_list,stu_list2;

  struct list_head *pos;

  int i = 0;

  INIT_LIST_HEAD(&stu_list);

  INIT_LIST_HEAD(&stu_list2);

  pstu = malloc(sizeof(stu)*3);

  pstu2 = malloc(sizeof(stu)*3);

  for(i=0;i<3;i++)

  {

  sprintf(pstu[i].name,"Stu%d",i+1);

  sprintf(pstu2[i].name,"Stu%d",i+4);

  pstu[i].num = i+1;

  pstu2[i].num = i+4;

  list_add( &(pstu[i].list), &stu_list);

  list_add( &(pstu2[i].list), &stu_list2);

  }

  printf("stu_list 鏈表\n");

  list_for_each(pos,&stu_list)

  {

  tmp_stu = list_entry(pos, stu, list);

  printf("student num: %d\tstudent name: %s\n",tmp_stu->num,tmp_stu->name);

  }

  printf("stu_list2 鏈表\n");

  list_for_each(pos,&stu_list2)

  {

  tmp_stu = list_entry(pos, stu, list);

  printf("student num: %d\tstudent name: %s\n",tmp_stu->num,tmp_stu->name);

  }

  printf("stu_list鏈表和stu_list2 鏈表合并以后\n");

  list_splice(&stu_list2,&stu_list);

  list_for_each(pos,&stu_list)

  {

  tmp_stu = list_entry(pos, stu, list);

  printf("student num: %d\tstudent name: %s\n",tmp_stu->num,tmp_stu->name);

  }

  free(pstu);

  return 0;

  }

  運行結果為:

  [html] view plaincopyroot@ubuntu:/home/paixu/dlist_node# ./a

  stu_list 鏈表

  student num: 3 student name: Stu3

  student num: 2 student name: Stu2

  student num: 1 student name: Stu1

  stu_list2 鏈表

  student num: 6 student name: Stu6

  student num: 5 student name: Stu5

  student num: 4 student name: Stu4

  stu_list鏈表和stu_list2 鏈表合并以后

  student num: 6 student name: Stu6

  student num: 5 student name: Stu5

  student num: 4 student name: Stu4

  student num: 3 student name: Stu3

  student num: 2 student name: Stu2

  student num: 1 student name: Stu1

  有了直觀的代碼和運行結果,理解起來也更加的容易了。

  有了上面的這些操作,但是我們還一直沒有講到我們最終所關心的宿主結構,那么接下來我們一起來看看我們該如何取出宿主結構的指針呢?這也是我認為linux內核雙向循環鏈表實現最為巧妙的地方了。

  [cpp] view plaincopy#define list_entry(ptr, type, member) \

  ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

  看看上面的代碼,發現一個很熟悉的身影(unsigned long)(&((type *)0)->member)),這個我在前一篇博客《C語言的那些小秘密之字節對齊》中已經講解過了,多以在此就不再做過多的講解,如果有不明白的讀者可以回過去看看講解再回過來閱讀。通過(unsigned long)(&((type *)0)->member))我們得出了成員變量member的偏移量,而ptr為指向member的指針,因為指針類型不同的原因,所以我們再次要先進行(char*)的轉換之后再進行計算。所以我們用ptr減去member的偏移量就得到了宿主結構體的指針,這就是一個非常巧妙的地方,這也就使得linux內核雙向循環鏈表能夠區別于傳統鏈表的關鍵所在。可能看到這兒的時候讀者已經感覺非常的枯燥了,但是別放棄,堅持看完,因為雖然這樣的講解枯燥了點,但是非常有用。所以堅持堅持吧!

  [cpp] view plaincopy#define list_for_each(pos, head) \

  for (pos = (head)->next; prefetch(pos->next), pos != (head); \

  pos = pos->next)

  #define __list_for_each(pos, head) \

  for (pos = (head)->next; pos != (head); pos = pos->next)

  #define list_for_each_prev(pos, head) \

  for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \

  pos = pos->prev)

  遍歷是雙循環鏈表的基本操作,head為頭節點,遍歷過程中首先從(head)->next開始,當pos==head時退出,故head節點并沒有訪問,這和鏈表的結構設計有關,通常頭節點都不含有其它有效信息,因此可以把頭節點作為雙向鏈表遍歷一遍的檢測標志來使用。在list_for_each宏中讀者可能發現一個比較陌生的面孔,我們在此就不將prefetch展開了講解了,有興趣的讀者可以自己查看下它的實現,其功能是預取內存的內容,也就是程序告訴CPU哪些內容可能馬上用到,CPU預先其取出內存操作數,然后將其送入高速緩存,用于優化,是的執行速度更快。接下來的__list_for_each()宏和list_for_each_prev()宏就不在此做一一的講解了,和list_for_each()宏類似。 就是遍歷的方向有所改變或者不使用預取。

  通過上面的講解和前面那么多的代碼,相信讀者這個時候對于list_for_each()已經不再感到陌生了。上面的但三個遍歷鏈表的宏都類似,繼續往下看。

  [cpp] view plaincopy#define list_for_each_safe(pos, n, head) \

  for (pos = (head)->next, n = pos->next; pos != (head); \

  pos = n, n = pos->next)

  以上list_for_each_safe()宏也同樣是用于遍歷的,不同的是里邊多出了一個n暫存pos下一個節點的地址,避免了因為pos節點被釋放而造成的斷鏈,這也就體現出了safe。也就是說你可以遍歷完當前節點后將其刪除,同時可以接著訪問下一個節點,遍歷完畢后就只剩下一個頭節點。當然這有一個最為典型的應用,那就是我們在多進程編程時候,多個進程等待在同一個等待隊列上,若事件發生時喚醒所有進程,則可以喚醒后將其依次從等待隊列中刪除。

  [html] view plaincopy#include

  #include

  #include "list.h"

  typedef struct _stu

  {

  char name[20];

  int num;

  struct list_head list;

  }stu;

  int main()

  {

  stu *pstu;

  stu *tmp_stu;

  struct list_head stu_list;

  struct list_head *pos,*n;

  int i = 0;

  INIT_LIST_HEAD(&stu_list);

  pstu = malloc(sizeof(stu)*3);

  for(i=0;i<3;i++)

  {

  sprintf(pstu[i].name,"Stu%d",i+1);

  pstu[i].num = i+1;

  list_add( &(pstu[i].list), &stu_list);

  }

  printf("通過list_for_each_safe()遍歷使用list_del(pos)刪除結點前\n");

  list_for_each_safe(pos, n, &stu_list)

  {

  tmp_stu = list_entry(pos, stu, list);

  printf("student num: %d\tstudent name: %s\n",tmp_stu->num,tmp_stu->name);

  list_del(pos);

  }

  printf("通過list_for_each()遍歷使用list_del(pos)刪除結點后\n");

  list_for_each(pos,&stu_list)

  {

  tmp_stu = list_entry(pos, stu, list);

  printf("student num: %d\tstudent name: %s\n",tmp_stu->num,tmp_stu->name);

  }

  free(pstu);

  return 0;

  }

  運行結果為:

  [html] view plaincopyroot@ubuntu:/home/paixu/dlist_node# ./a

  通過list_for_each_safe()遍歷使用list_del(pos)刪除結點前

  student num: 3 student name: Stu3

  student num: 2 student name: Stu2

  student num: 1 student name: Stu1

  通過list_for_each()遍歷使用list_del(pos)刪除結點后

  讀者可以結合運行結果再去閱讀上面的文字描述部分。

  如果只提供對list_head結構的遍歷操作是遠遠不夠的,我們希望實現的是對宿主結構的遍歷,即在遍歷時直接獲得當前鏈表節點所在的宿主結構項,而不是每次要同時調用list_for_each()和list_entry()。為此Linux特地提供了list_for_each_entry()宏來實現

  [cpp] view plaincopy#define list_for_each_entry(pos, head, member) \

  for (pos = list_entry((head)->next, typeof(*pos), member); \

  prefetch(pos->member.next), &pos->member != (head); \

  pos = list_entry(pos->member.next, typeof(*pos), member))

  第一個參數為傳入的遍歷指針,指向宿主數據結構,第二個參數為鏈表頭,為list_head結構,第三個參數為list_head結構在宿主結構中的成員名。有時候做過多的講解反而沒有看看代碼的效果好,我們還是用段代碼來說明下吧。

  [html] view plaincopy#include

  #include

  #include "list.h"

  typedef struct _stu

  {

  char name[20];

  int num;

  struct list_head list;

  }stu;

  int main()

  {

  stu *pstu;

  stu *tmp_stu;

  struct list_head stu_list;

  struct list_head *pos,*n;

  int i = 0;

  INIT_LIST_HEAD(&stu_list);

  pstu = malloc(sizeof(stu)*3);

  for(i=0;i<3;i++)

  {

  sprintf(pstu[i].name,"Stu%d",i+1);

  pstu[i].num = i+1;

  list_add( &(pstu[i].list), &stu_list);

  }

  list_for_each_entry(tmp_stu, &stu_list, list)

  printf("student num: %d\tstudent name: %s\n",tmp_stu->num,tmp_stu->name);

  free(pstu);

  return 0;

  }

  運行結果為:

  [html] view plaincopyroot@ubuntu:/home/paixu/dlist_node# ./a

  student num: 3 student name: Stu3

  student num: 2 student name: Stu2

  student num: 1 student name: Stu1

  如果讀者一開始對于文字描述感到陌生的話,那么就再次結合代碼去閱讀。

  接下來再來看看最后幾個。

  [html] view plaincopy#define list_for_each_entry_reverse(pos, head, member) \

  for (pos = list_entry((head)->prev, typeof(*pos), member); \

  prefetch(pos->member.prev), &pos->member != (head); \

  pos = list_entry(pos->member.prev, typeof(*pos), member))

  #define list_prepare_entry(pos, head, member) \

  ((pos) ? : list_entry(head, typeof(*pos), member))

  #define list_for_each_entry_continue(pos, head, member) \

  for (pos = list_entry(pos->member.next, typeof(*pos), member); \

  prefetch(pos->member.next), &pos->member != (head); \

  pos = list_entry(pos->member.next, typeof(*pos), member))

  #define list_for_each_entry_safe(pos, n, head, member) \

  for (pos = list_entry((head)->next, typeof(*pos), member), \

  n = list_entry(pos->member.next, typeof(*pos), member); \

  &pos->member != (head); \

  pos = n, n = list_entry(n->member.next, typeof(*n), member))

  以上幾個與list_for_each_entry類似,只是其中略有差別,list_prepare_entry()中含有prefetch(),它的作用在上面已經講解,有什么疑惑可以返回去閱讀下,在此不再做過多的講解;list_for_each_entry_continue()和list_for_each_entry()的區別主要是list_for_each_entry_continue()可以不從鏈表頭開始遍歷,而是從已知的某個pos結點的下一個結點開始遍歷。在某些時候如果不是從頭結點開始遍歷,那么為了保證pos的初始值有效,必須使用list_prepare_entry()。其含義就是如果pos非空,那么pos的值就為其本身,如果pos為空,那么就從鏈表頭強制擴展一個虛pos指針,讀者自己分析list_prepare_entry()的實現就明白了。list_for_each_entry_safe()要求調用者另外提供一個與pos同類型的指針n,在for循環中暫存pos下一個節點的宿主結構體的地址,避免因pos節點被釋放而造成的斷鏈。

  到此我們linux內核雙向循環鏈表的旅程就結束了,下一篇我們將開始一個新的旅程。由于本人水平有限,博客中的不妥或錯誤之處在所難免,殷切希望讀者批評指正。同時也歡迎讀者共同探討相關的內容,如果樂意交流的話請留下你寶貴的意見。


本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 久久久天天 | 日韩成人在线看 | 一级黄色免费毛片 | 国产乱淫av一区二区三区 | 高潮videossex高潮 | 免费精品午夜 | 亚洲美女在线观看 | 欧美乱妇视频 | 国产又黄又大又粗的视频 | 欧美不卡网 | 精品国产精品一区二区夜夜嗨 | 色伊人亚洲综合网站 | 高h禁伦餐桌上的肉伦 | 中文字幕在线观看视频地址二 | 亚洲国产精品人人做人人爱 | 日夜夜操 | 国产日批视频在线观看 | 91禁外国网站 | 精品视频999 | 国产99久久久国产精品~~牛 | 国产成人无码av在线播放dvd | 亚洲伊人精品酒店 | 亚洲三级毛片 | 亚洲国产aⅴ成人精品无吗 欧洲熟妇色xxxx欧美老妇多毛网站 | 国产精品一区在线 | 国产毛片精品国产一区二区三区 | 中文字幕亚洲日本 | 青青草国产在线观看 | 黄色小视频免费 | 黄色1级片| 亚洲国产成人精品片在线观看 | 人人玩人人弄人人曰 | 久久香蕉国产线看观看猫咪av | 性――交――性――乱 | 免费精品 | 乳霸冲田杏梨中文字幕担心学生的 | 久久综合九九 | 欧美日韩国产精品综合 | 第一福利在线 | 性欧美videos高清精品 | 国产精品久久久久久无毒不卡 | 久久久久久久久久久福利 | 午夜精品亚洲一区二区三区嫩草 | 日本a在线天堂 | 粉嫩av一区二区三区粉 | 夜夜爱夜夜做夜夜爽 | 999国产| 99精品久久久久久久婷婷 | 曰本女人与公拘交酡 | 欧美a级网站 | 城中村泄火88av | 国产不卡在线播放 | 色就是色亚洲色图 | 99久久免费精品国产免费高清 | 99热久久是国产免费66 | 97se狠狠狠狠狼鲁亚洲综合色 | 91综合久久 | 欧美成人精品a∨在线观看 香蕉av福利精品导航 | 成人午夜精品一区二区三区 | 山村淫强伦寡妇 | 成人亚洲精品久久久久 | 欧美视频精品 | 男女草比视频 | 午夜裸体性播放 | 国产日产欧产精品精品app | 国产偷伦在线 | 男人天堂tv| 久久久久九九九 | 调教重口xx区一精品网站 | 欧美日韩无| 亚洲女人天堂色在线7777 | 亚洲精品久久久久久国产精华液 | 久久精品丝袜高跟鞋 | 成人精品亚洲 | 精品色图| 蜜桃av久久久亚洲精品 | 日韩av片在线 | 日产精品久久久一区二区福利 | 国产污污视频 | 国产av一区二区三区 | 欧美一区二区三区影院 | 鲁丝片一区二区三区 | 超碰97久久 | av免费一区| 在线看片免费人成视频播 | 日本激情吻胸吃奶呻吟视频 | 青草av在线 | 久久久久久久国产精品影院 | 久久精品www人人爽人人 | 亚洲欧美一区二区三区四区五区 | 久久av免费看 | 最新中文无码字字幕在线 | 中文幕无线码中文字夫妻 | 欧美日韩六区 | 老司机免费在线视频 | 永久久久久久久 | 国产性受xxxx黑人xyx性爽 | 黄色av网站在线看 | 亚洲一区精品在线观看 | 日韩精品一区二区三区第95 | 女人被狂躁c到高潮喷水一区二区 | 性69交片免费看 | 免费麻豆视频 | 久久久精品国产免费观看一区二区 | 亚洲国产福利 | 日韩v片 | 日韩经典在线 | 男阳茎进女阳道视频大全 | 日本中文在线视频 | 国产66av| 四色永久访问网站 | 麻豆文化传媒精品一区观看 | 永久免费毛片在线播放 | 午夜精品久久久久久久蜜桃 | 美女毛片在线 | 欧美色老头又长又大 | 国产天天操| 一区二区三区日本久久九 | 亚洲熟女乱色一区二区三区 | 91插插插插插插插 | 日韩久久精品一区二区三区 | 一区二区三区四区免费 | 国产男女无套免费网站 | 日韩精品不卡在线 | 男女男精品视频站 | 欧美h网站 | 亚洲色一区二区三区四区 | 国产精品国产三级国产专区51区 | 波多野结衣一区二区 | 最新av中文字幕 | 娇小激情hdxxxx学生住处 | 免费看黄色的网站 | 国产精品无码一区二区三区免费 | 亚洲精品中文字幕久久久久 | 狠狠狠色丁香婷婷综合久久88 | 国产亚洲精品女人久久久久久 | 真实的国产乱xxxx在线 | 国产精品一区二区三 | 欧美日韩国产传媒 | 欧美一卡二卡三卡四卡视频区 | 成年激情网 | 国产区图片区一区二区三区 | 久久精品亚洲精品国产色婷 | 久久99精品久久久久子伦 | 香蕉视频ap | 秋霞无码一区二区 | 综合网色 | 天天免费看av | 欧美精品一区二区蜜臀亚洲 | 少妇高潮一区二区三区 | 一交一性一色一伦一区二 | 少妇一级淫免费观看 | 久久久久人妻一区精品性色av | 亚洲精品国产精品乱码视色 | 欧美午夜理伦三级在线观看 | 天天色天天射综合网 | 狠狠色丁香久久婷婷综合五月 | 久久久久国产精品熟女影院 | 国产精品乱码一区二区三区四川人 | 免费av手机在线观看 | 亚洲成色www8888 | 亚洲国产午夜精品理论片 | 少妇愉情理伦片丰满丰满午夜 | 深夜爽爽动态图无遮无挡 | 国产日本一区二区三区 | 日本免费视频 | 国产aaa级片 | 日韩视频第一页 | 911国产在线| 性xxxx| 国产无套精品一区二区三区 | √最新版天堂资源网在线 | 一本一道久久a久久精品综合蜜臀 | 插久久| 国产农村妇女露脸对白视频 | 日韩黄色大全 | 麻豆国产露脸在线观看 | 国产嫩草影院在线观看88 | 99精品久久毛片a片 在线亚洲高清揄拍自拍一品区 | 曰木性按摩xxⅹxxx视频 | 女女同性女同一区二区三区av | 国产无人区卡一卡二卡三网站 | 紧身裙女教师三上悠亚红杏 | 日韩视频在线观看二区 | av在线免费观看不卡 | 大肉大捧一进一出视频 | 久久网中文字幕 | 综合国产精品 | 国产精品ⅴ无码大片在线看 | 国产又爽又粗又猛的视频 | 一本到视频 | 香蕉国产 | 狠狠色综合色综合网站久久 | 免费无码又黄又爽又刺激 | 欧美在线免费视频 | 污网站免费看 | 深夜福利影院 | 久草在线免费福利 | 在线成人av| 国产精品99久久久久久久久久 | 欧美黄色片视频 | 综合网色 | 国产又色又爽又刺激在线播放 | 国产成人精品亚洲午夜麻豆 | 五月婷婷免费视频 | av无码久久久久不卡蜜桃 | 青青啪啪 | 欧洲黄视频 | 久久久天堂国产精品女人 | 爽妇网av | 日本精品在线看 | 国产午夜视频 | 国产欧美熟妇另类久久久 | 人人插人人 | 国产视频久久久久久久 | 日本一区二区在线视频 | 国产av成人一区二区三区 | 尤物av无码色av无码 | 天天欧美 | 久久中文精品 | 成人黄色在线观看视频 | 中文字幕一区二区在线播放 | 爱情岛亚洲论坛入口福利 | 日本爽快片100色毛片视频 | ass亚洲日本嫩体私拍ass | 美女胸又黄又水 | av美女在线| 久久久亚洲色 | 午夜不卡av免费 | 色综合久久中文娱乐网 | 中文字幕va一区二区三区 | 中文字幕av第一页 | 美女av在线免费观看 | 干一干操一操 | 极品白嫩少妇无套内谢 | 亚洲精品国品乱码久久久久 | 日韩精品91偷拍在线观看 | 精品国产露脸精彩对白 | 久久久久亚洲精品 | 少妇视频一区二区三区 | 嫩草视频在线播放 | 麻豆乱码国产一区二区三区 | 性猛交xxxx | 潘金莲性xxxxhd | 日韩女优在线观看 | 青青久草网| 亚洲一二三四专区 | 国产精品久久久久久久久借妻 | 人人妻人人澡人人爽不卡视频 | 亚洲18在线看污www麻豆 | 外国a级片| 91 pro国产 | 91精品在线免费观看 | 国产新婚夫妇白天做个爱 | 亚洲最新av | 国产极品免费 | av午夜影院 | 成人性能视频在线 | 中国黄色一及片 | 国产成人精品网站 | 男人的天堂色偷偷 | 人善交另类亚洲重口另类 | 大地资源网第二页免费观看 | 伊人久久91 | 日本一区二区黄色 | 精品国产乱码久久久久久婷婷 | 黄色a级一级片 | 久久久精品久久久 | 国产强被迫伦姧在线观看无码 | 亚洲国产精品色拍网站 | 美女高潮视频在线观看 | www中文字幕av | 亚洲gv2023 | 国产超碰在线 | 国产伦理一区二区 | 在线a亚洲视频播放在线观看 | 性瘾荡乳h古代 | 免费观看又色又爽又黄的传媒 | 日本色综合网 | 精品无码人妻一区二区三区不卡 | 人人妻人人藻人人爽欧美一区 | 啪啪啪毛片| 婷婷综合另类小说色区 | 国产精品一区二区三区在线看 | 国产精品18久久久久久vr | 黑丝av在线| 国产午夜精品福利视频 | 不卡一区二区三区四区 | 国产成人精品日本亚洲999 | 午夜爱精品免费视频一区二区 | 国产美女牲交视频 | 国产精品天天av精麻传媒 | 久操视频免费观看 | 日韩伦人妻无码 | 亚洲网站在线 | 国产情侣作爱视频免费观看 | 国产精品偷拍 | yyyy11111少妇无码影院 | 亚洲另类xxxx| 亚洲无马砖区2021 | 欧美色图综合网 | 国产美女视频国产视视频 | 色婷婷久久久亚洲一区二区三区 | 一边添奶一边摸pp爽快视频 | 久久久久琪琪去精品色无码 | 亚洲高清网| 伊人色综合久久天天五月婷 | 帮老师解开蕾丝奶罩吸乳网站 | 无码熟妇αⅴ人妻又粗又大 | 肉丝美足丝袜一区二区三区四 | 强奷乱码中文字幕 | 天堂网a | 欧美日本韩国 | 黑人巨大精品欧美一区二区, | 日本高清va在线播放 | 999久久久无码国产精品 | 欧美性猛交乱大交丰满 | 亚洲在线不卡 | 欧美视频在线不卡 | 国产69精品久久久久9999不卡免费 | 国产精品乱码久久久久久久久 | 成人毛片在线播放 | wwwxx国产| 视频在线亚洲 | 国产无线一二三四区手机 | 性色av无码久久一区二区三区 | av一本久道久久综合久久鬼色 | 欧美成人性生活 | 69xx欧美| 手机天堂av | 日本xxxxx片免费观看19 | 精品视频免费观看 | 久久精品色 | 亚洲免费视频观看 | 一二三国产777avav | 毛片网站在线播放 | 国产三级在线免费观看 | 国产一级淫片a | 亚洲综合色丁香婷婷六月图片 | 亚洲一久久久久久久久 | 精品视频在线观看一区二区 | 在线免费日本 | 欧美黄色大片视频 | 荡女精品导航 | 国产亚洲精品一区二区三区 | 亚洲v欧美| 四虎永久在线精品免费网址 | 亚洲国产成人一区 | 国产69精品久久久久人妻刘玥 | 亚洲va中文字幕 | 午夜激情在线免费观看 | 日韩一级片中文字幕 | 不卡精品视频 | 91在线精品秘密一区二区 | 美丽的熟妇中文字幕 | 欧美国产日韩久久mv | 久久波多野结衣 | 爱豆国产剧免费观看大全剧集 | 亚洲色av天天天天天天 | 狠狠操一区 | 性国产xxxx乳高跟 | 国产视频二区三区 | 中文无码一区二区不卡αv 精品少妇人妻av免费久久洗澡 | 色婷婷在线观看视频 | 成年人在线免费 | av资源免费观看 | 精品国产欧美一区二区 | 欧美情爱视频 | 三级4级全黄在线 | 明日叶三叶 | 亚洲人体av | 香蕉视频在线观看网站 | 另类视频在线观看+1080p | 激情内射日本一区二区三区 | 日本一级二级三级久久久 | 91精品婷婷国产综合久久性色 | 国产三级自拍视频 | 三上悠亚日韩精品二区 | 亚洲精品乱码一区二区三区 | www.欧美成人| 宅男666在线永久免费观看 | 91亚洲精品国偷拍自产 | 久久久欧美精品sm网站 | 亚洲免费三级 | 香蕉爱爱视频 | 狠狠色综合欧美激情 | 亚洲熟妇av日韩熟妇在线 | 嫩草视频免费观看 | 99国产精品欧美久久久久的广告 | 日本xxxxx高清 | 成年人免费看视频 | 99色综合网 | 狠狠人妻久久久久久综合 | 91精品国产自产91精品 | 亚洲精品萌白酱一区 | 亚洲成人一二三 | 日韩免费视频一区 | 亚洲成a人片在线观看天堂无码 | 国产精品igao视频网网址 | 亚洲视频天天射 | 久久亚洲色www成人 av免费网站在线观看 | 四虎永久在线精品免费网站 | 日本高清视频wwww色 | 少妇做爰免费视频网站图片 | 一本一本久久a久久精品综合麻豆 | 日本a级片视频 | 国产人妖在线视频 | 鸭子tv国产在线永久播放 | 91在线视频导航 | 欧美资源 | av亚洲产国偷v产偷v自拍软件 | 国产精品毛片a∨一区二区三区 | 亚洲综合激情网 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 国产在线观看免费 | 男女啪啪猛烈无遮挡猛进猛出 | 国产女王调脚奴免费视频 | 377久久日韩精品免费 | 天堂男人网 | 翔田千里一区二区 | 日本一级理论片在线大全 | 日韩美女视频一区二区 | 色五月色开心色婷婷色丁香 | 国产精品 欧美精品 | 亚洲精品自产拍在线观看 | 成熟丰满熟妇av无码区 | 女同一区二区三区 | 99国产精品久久久蜜芽 | 无码一区二区三区视频 | 18禁裸乳无遮挡啪啪无码免费 | 亚洲精品无码久久久 | 香蕉视频成人在线 | 九九在线视频免费观看精彩 | 免费看的一级片 | 国产欧美熟妇另类久久久 | 日本三级久久久 | 日韩精品无 | 欧美 唯美 清纯 偷拍 | 精品少妇88mav | 天天aaaaxxxx躁日日躁 | 欧美日韩成人一区二区在线观看 | 一区二区三区四区五区在线视频 | 亚洲韩欧美第25集完整版 | 国产乱人对白 | 婷婷成人亚洲综合国产xv88 | 久久精品导航 | 末成年娇小性色xxxxx | 欧美成人milf| 久久久久无码精品国产 | 国产毛片一区二区三区 | 国产福利视频在线 | 国产人妻aⅴ色偷 | 亚洲欧美日韩久久精品 | 婷婷五月深深久久精品 | 欧美性生交xxxxxdddd | 国产无遮挡又黄又爽在线观看 | 18成人片黄网站www | 涩五月婷婷 | 欧美日韩国产在线一区 | 成人第一页 | 粉嫩粉嫩一区二区三区在线播放 | 色偷偷888欧美精品久久久 | 日产久久久久久 | 性高潮久久久久久 | 久久久久久免费免费精品软件 | 欧美在线资源 | 国产黄色免费在线观看 | 337p亚洲精品色噜噜狠狠 | 日本欧美一区二区三区在线播放 | 伊人婷婷色 | 99久久婷婷国产精品综合 | 无遮挡19禁啪啪成人黄软件 | 天天色婷婷 | 国产精品揄拍100视频 | 白嫩少妇喷水正在播放 | 久久99日 | 欧美h网站| 337p粉嫩大胆色噜噜噜 | 日日夜夜狠狠操 | 永久免费看片在线播放 | 欧美xxxx狂喷水 | 全部免费的毛片在线看 | 捆绑白丝粉色jk震动捧喷白浆 | 国产精品视频在线观看 | 亚洲精品久久久乳夜夜欧美 | www.天天干.com| 夜鲁鲁鲁夜夜综合视频欧美 | 免费国产高清 | 亚洲欧美成人综合 | 亚洲加勒比久久88色综合 | 少妇高潮流白浆在线观看 | 天天热天天干 | 国产一级做a爰片久久毛片99 | 婷婷色伊人 | 欧美极品少妇无套实战 | 夜夜春亚洲嫩草影院 | 蜜桃久久av一区 | 国产实拍会所女技师在线观看 | 日本一区二区欧美 | 粗大猛烈进出高潮视频大全 | 色欲天天婬色婬香综合网 | 欧美日韩中文 | 在线理论片 | 精品国产一区二区三区国产馆杂枝 | 69视频污 | 国产精品爱久久久久久久电影蜜臀 | 亚洲综合影院 | 天堂va欧美va亚洲va老司机 | 成人mv在线观看 | 欧美日韩99| 99色99| 亚洲 精品 主播 自拍 | 日本乱轮视频 | 亚洲精品欧美综合二区 | 色欲综合视频天天天 | 黄桃av无码免费一区二区三区 | 国内精品久久久久久久97牛牛 | 亚洲国产成人精品无色码 | 成年丰满熟妇午夜免费视频 | 欧美精品在线视频观看 | a级片在线免费观看 | av一区二区在线播放 | 欧美日韩在线一区二区 | 免费asmr色诱娇喘呻吟外国 | 91艹| 国产精品视频色拍拍 | 一本大道久久卡一卡二卡三乱码 | 中文字幕av在线免费观看 | 成人视频在线观看 | 欧美在线一级 | 国产美女精品一区二区三区 | 拍真实国产伦偷精品 | 亚洲午夜无码久久yy6080 | 青青青青青手机视频在线观看视频 | 成人影片在线 | 国产av无码专区亚洲a√ | 激情在线观看视频 | 国产又色又爽又黄的免费软件 | 中国老女人内谢69xxxx | 成人做爰高潮片免费视频 | 国产精品麻豆欧美日韩ww | 寂寞少妇让水电工爽hd | 青青操在线观看视频 | 色屁屁xxxxⅹ免费视频 | 亚洲精品国精品久久99热一 | 99精品在线播放 | 天天爽夜夜爽夜夜爽精品视频 | 欧美一区二区激情视频 | 麻豆av免费在线观看 | 亚洲欧美国产精品专区久久 | 成人综合婷婷国产精品久久 | 国产男女猛烈无遮挡免费视频 | 波多野结衣一区二区三区高清av | 在线播放小视频 | 97国产资源 | 天天综合久久综合 | 麻豆区1免费 | 人人干在线视频 | 久草资源在线视频 | 亚洲一区二区无码影院 | 欧美色狠| 亚洲欧洲日本无在线码 | 自拍在线视频 | 懂色av色香蕉一区二区蜜桃 | 成人高潮片免费视 | 天干夜夜爽爽日日日日 | 久久久午夜视频 | 再深点灬舒服灬太大了快点91 | 91午夜精品亚洲一区二区三区 | 亚洲成人一区二区在线观看 | 欧美 日本 国产 | 娇喘顶撞深初h1v1 | 不卡av免费在线观看 | 波多野结衣视频在线 | 日本熟女毛茸茸 | 一区在线看 | 可以免费看av的网址 | 久久久噜噜噜 | 成人精品视频一区二区 | 精品一卡2卡三卡4卡免费网站 | 亚洲视频h | 尤物久久 | 国产盗摄x88av| 日本黄色录相 | 精品偷自拍另类在线观看 | 毛片网站在线观看视频 | 亚洲亚洲人成综合网络 | 国产在线播放一区二区三区 | 久久精品日产第一区二区 | 四虎影视www在线播放 | japanese av在线| 中文字幕人成乱码熟女app | 亚洲一区精品视频 | 精品av无码国产一区二区 | 国产激情视频网站 | 九九伊人八戒 | 青青草激情| 中文字幕亚洲欧美 | 久久精品日 | 就要爱爱tv| 黑丝一区二区三区 | 欧美交受高潮1 | 天堂av国产夫妇精品自在线 | 中国少妇裸体bbbbb | 91亚洲人人在字幕国产 | 国产免费无码一区二区三区 | 男人的天堂日韩 | 玖玖玖视频 | 国产自偷 | 成人性生交大片免费 | 操一操干一干 | 亚洲第一页综合 | 亚洲高清精品视频 | 中文视频在线观看 | 三级中文字幕 |