亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

深入解析C++的循環鏈表與雙向鏈表設計的API實現

2020-05-23 14:06:51
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++的循環鏈表與雙向鏈表設計的API實現,文中的示例對于鏈表結點的操作起到了很好的說明作用,需要的朋友可以參考下
 

循環鏈表設計與API實現
基本概念
循環鏈表的定義:將單鏈表中最后一個數據元素的next指針指向第一個元素

C++,循環鏈表,雙向鏈表

循環鏈表擁有單鏈表的所有操作

  • 創建鏈表
  • 銷毀鏈表
  • 獲取鏈表長度
  • 清空鏈表
  • 獲取第pos個元素操作
  • 插入元素到位置pos
  • 刪除位置pos處的元素

新增功能:游標的定義

在循環鏈表中可以定義一個“當前”指針,這個指針通常稱為游標,可以通過這個游標來遍歷鏈表中的所有元素。

C++,循環鏈表,雙向鏈表

循環鏈表新操作
將游標重置指向鏈表中的第一個數據元素

CircleListNode* CircleList_Reset(CircleList* list);

獲取當前游標指向的數據元素

CircleListNode* CircleList_Current(CircleList* list);

將游標移動指向到鏈表中的下一個數據元素

CircleListNode* CircleList_Next(CircleList* list);

直接指定刪除鏈表中的某個數據元素 

CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node); // 根據元素的值 刪除 元素 pk根據元素的位置 刪除 元素

最后加了一個循環鏈表的應用:求解約瑟夫問題
約瑟夫問題-循環鏈表典型應用
n 個人圍成一個圓圈,首先第 1 個人從 1 開始一個人一個人順時針報數,報到第 m 個人,令其出列。然后再從下一 個人開始從 1 順時針報數,報到第 m 個人,再令其出列,…,如此下去,求出列順序。

C++,循環鏈表,雙向鏈表

代碼:

// circlelist.h // 循環鏈表API聲明  #ifndef _CIRCLELIST_H_ #define _CIRCLELIST_H_  typedef void CircleList;  typedef struct _tag_CircleListNode {   struct _tag_CircleListNode *next; }CircleListNode;  // 創建鏈表 CircleList* CircleList_Create();  // 銷毀鏈表 void CircleList_Destroy(CircleList* list);  // 清空鏈表 void CircleList_Clear(CircleList* list);  // 獲取鏈表的長度 int CircleList_Length(CircleList* list);  // 在pos位置插入結點node int CircleList_Insert(CircleList* list,CircleListNode* node, int pos);  // 獲取pos位置的結點 CircleListNode* CircleList_Get(CircleList* list, int pos);  // 刪除pos位置的結點 CircleListNode* CircleList_Delete(CircleList* list, int pos);  // 根據結點的值進行數據刪除 CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);  // 重置游標 CircleListNode* CircleList_Reset(CircleList* list);  // 獲取當前游標所指結點 CircleListNode* CircleList_Current(CircleList* list);  // 將原始游標所指結點返回給上層,然后讓游標移到下一個結點 CircleListNode* CircleList_Next(CircleList* list);  #endif 
// circlelist.cpp // 循環鏈表API實現  #include <iostream> #include <cstdio> #include "circlelist.h"  typedef struct _tag_CircleList {   CircleListNode header;   CircleListNode *silder;   int length; }TCircleList;  // 創建鏈表 CircleList* CircleList_Create() {   TCircleList *ret = (TCircleList *)malloc(sizeof(TCircleList));   if (ret == NULL) {     return NULL;   }    // 初始化   ret->header.next = NULL;   ret->silder = NULL;   ret->length = 0;    return ret; }  // 銷毀鏈表 void CircleList_Destroy(CircleList* list) {   if (list == NULL) {     return;   }   free(list);   return; }  // 清空鏈表 void CircleList_Clear(CircleList* list) {   if (list == NULL) {     return;   }   TCircleList *tList = (TCircleList *)list;   tList->header.next = NULL;   tList->silder = NULL;   tList->length = 0;    return; }  // 獲取鏈表的長度 int CircleList_Length(CircleList* list) {   if (list == NULL) {     return -1;   }   TCircleList *tList = (TCircleList *)list;   return tList->length; }  // 在pos位置插入結點node int CircleList_Insert(CircleList* list, CircleListNode* node, int pos) {   if (list == NULL || node == NULL || pos < 0) {     return -1;   }    TCircleList *tList = (TCircleList *)list;    CircleListNode *cur = (CircleListNode *)tList;    for (int i = 0; i < pos; ++i) {     cur = cur->next;   }    node->next = cur->next;   cur->next = node;    // 如果是第一次插入   if (tList->length == 0) {     tList->silder = node;   }    ++tList->length; // 記得長度加1    // 如果是頭插法   if (cur == (CircleListNode *)tList) {     // 獲取最后一個元素     CircleListNode *last = CircleList_Get(tList, tList->length - 1);     last->next = cur->next;   }    return 0; }  // 獲取pos位置的結點 CircleListNode* CircleList_Get(CircleList* list, int pos) {   // 因為是循環鏈表,所以這里不需要排除pos>length的情況   if (list == NULL || pos < 0) {     return NULL;   }    TCircleList *tList = (TCircleList *)list;   CircleListNode *cur = (CircleListNode *)tList;    for (int i = 0; i < pos; ++i) {     cur = cur->next;   }    return cur->next; }  // 刪除pos位置的結點 CircleListNode* CircleList_Delete(CircleList* list, int pos) {   TCircleList *tList = (TCircleList *)list;   CircleListNode *ret = NULL;    if (tList != NULL && pos >= 0 && tList->length > 0) {     CircleListNode *cur = (CircleListNode *)tList;     for (int i = 0; i < pos; ++i) {       cur = cur->next;     }      // 若刪除頭結點,需要求出尾結點     CircleListNode *last = NULL;     if (cur == (CircleListNode *)tList) {       last = CircleList_Get(tList, tList->length - 1);     }      ret = cur->next;     cur->next = ret->next;      --tList->length;      // 若刪除頭結點     if (last != NULL) {       tList->header.next = ret->next;       last->next = ret->next;     }      // 若刪除的元素為游標所指的元素     if (tList->silder == ret) {       tList->silder = ret->next;     }      // 若刪除元素后鏈表長度為0     if (tList->length == 0) {       tList->header.next = NULL;       tList->silder = NULL;     }   }    return ret; }  // 根據結點的值進行數據刪除 CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node) {   TCircleList *tList = (TCircleList *)list;   CircleListNode *ret = NULL;    if (list != NULL && node != NULL) {     CircleListNode *cur = (CircleListNode *)tList;     int i = 0;     for (i = 0; i < tList->length; ++i) {       if (cur->next == node) {         ret = cur->next;         break;       }        cur = cur->next;     }      // 如果找到     if (ret != NULL) {       CircleList_Delete(tList, i);     }   }    return ret; }  // 重置游標 CircleListNode* CircleList_Reset(CircleList* list) {   TCircleList *tList = (TCircleList *)list;   CircleListNode* ret = NULL;    if (list != NULL) {     tList->silder = tList->header.next;     ret = tList->silder;   }    return NULL; }  // 獲取當前游標所指結點 CircleListNode* CircleList_Current(CircleList* list) {   TCircleList *tList = (TCircleList *)list;   CircleListNode* ret = NULL;   if (list != NULL) {     ret = tList->silder;   }    return ret; }  // 將原始游標所指結點返回給上層,然后讓游標移到下一個結點 CircleListNode* CircleList_Next(CircleList* list) {   TCircleList *tList = (TCircleList *)list;   CircleListNode* ret = NULL;   if (list != NULL && tList->silder != NULL) {     ret = tList->silder;     tList->silder = ret->next;   }   return ret; } 

joseph.h  

// 用循環鏈表API求解約瑟夫問題  #include <cstdio> #include "circlelist.h"  const int maxp = 8;  struct Person {   CircleListNode circlenode;   int id; };  void joseph() {   Person s[maxp];   for (int i = 0; i < maxp; ++i) {     s[i].id = i + 1;   }    CircleList *list = NULL;   list = CircleList_Create();    // 插入元素   for (int i = 0; i < maxp; ++i) {     // 尾插法     int ret = CircleList_Insert(list, (CircleListNode *)&s[i], CircleList_Length(list));     if (ret < 0) {       printf("function CircleList_Insert err: %d/n", ret);     }   }    // 遍歷鏈表   for (int i = 0; i < CircleList_Length(list); ++i) {     Person *tmp = (Person *)CircleList_Get(list, i);     if (tmp == NULL) {       printf("function CircleList_Get err./n");     }     printf("age: %d/n", tmp->id);   }    // 求解約瑟夫問題   while (CircleList_Length(list) > 0)   {     Person* pv = NULL;     for (int i = 1; i < 3; i++)     {       CircleList_Next(list);     }     pv = (Person*)CircleList_Current(list);     printf("%d ", pv->id);     CircleList_DeleteNode(list, (CircleListNode *)pv); //根據結點的值,進行結點元素的刪除   }   printf("/n");    CircleList_Destroy(list);  } 

main.cpp  

// 循環鏈表測試程序  #include <iostream> #include <cstdio> #include "circlelist.h" #include "joseph.h"  const int maxn = 5;  struct Student {   CircleListNode circlenode;   char name[32];   int age; };  void play01() {   Student s[maxn];   for (int i = 0; i < maxn; ++i) {     s[i].age = i + 1;   }    CircleList *list = NULL;    list = CircleList_Create(); // 創建鏈表    // 插入元素   for (int i = 0; i < maxn; ++i) {     // 尾插法     int ret = CircleList_Insert(list, (CircleListNode *)&s[i], CircleList_Length(list));     if (ret < 0) {       printf("function CircleList_Insert err: %d/n", ret);     }   }    // 遍歷鏈表   // 這里遍歷打印兩邊,可以證明這是一個循環鏈表   for (int i = 0; i < 2 * CircleList_Length(list); ++i) {     Student *tmp = (Student *)CircleList_Get(list, i);     if (tmp == NULL) {       printf("function CircleList_Get err./n");     }     printf("age: %d/n", tmp->age);   }    // 刪除結點,通過結點位置   while (CircleList_Length(list)) {     Student *tmp = (Student *)CircleList_Delete(list, CircleList_Length(list) - 1);     if (tmp == NULL) {       printf("function CircleList_Delete err./n");     }     printf("age: %d/n", tmp->age);   }    // 銷毀鏈表   CircleList_Destroy(list);  }  int main() {   play01(); // 為了測試數據的生命周期,所以另寫一個函數調用運行   joseph();    return 0; } 


雙向鏈表設計與API實現
為什么需要雙向鏈表?

  • 單鏈表的結點都只有一個指向下一個結點的指針
  • 單鏈表的數據元素無法直接訪問其前驅元素
  • 逆序訪問單鏈表中的元素是極其耗時的操作!

雙向鏈表的定義

在單鏈表的結點中增加一個指向其前驅的pre指針

C++,循環鏈表,雙向鏈表

雙向鏈表擁有單鏈表的所有操作

  • 創建鏈表
  • 銷毀鏈表
  • 獲取鏈表長度
  • 清空鏈表
  • 獲取第pos個元素操作
  • 插入元素到位置pos
  • 刪除位置pos處的元素

插入操作

C++,循環鏈表,雙向鏈表

插入操作異常處理
插入第一個元素異常處理
在0號位置處插入元素;
刪除操作

C++,循環鏈表,雙向鏈表

雙向鏈表的新操作

  • 獲取當前游標指向的數據元素
  • 將游標重置指向鏈表中的第一個數據元素
  • 將游標移動指向到鏈表中的下一個數據元素
  • 將游標移動指向到鏈表中的上一個數據元素
  • 直接指定刪除鏈表中的某個數據元素

雙向鏈表重要技術場景

C++,循環鏈表,雙向鏈表

循環鏈表插入結點技術場景

C++,循環鏈表,雙向鏈表

循環鏈表刪除結點技術場景

C++,循環鏈表,雙向鏈表

優點:雙向鏈表在單鏈表的基礎上增加了指向前驅的指針
功能上雙向鏈表可以完全取代單鏈表的使用
雙向鏈表的Next,Pre和Current操作可以高效的遍歷鏈表中的所有元素
缺點:代碼復雜

代碼示例:
 dlinklist.h  

// 雙向鏈表API聲明  #ifndef _DLINKLIST_H_ #define _DLINKLIST_H_  typedef void DLinkList;  typedef struct _tag_DLinkListNode {   _tag_DLinkListNode *next;   _tag_DLinkListNode *pre; }DLinkListNode;  // 創建鏈表 DLinkList* DLinkList_Create();  // 銷毀鏈表 void DLinkList_Destroy(DLinkList *list);  // 清空鏈表 void DLinkList_Clear(DLinkList *list);  // 獲取鏈表長度 int DLinkList_Length(DLinkList *list);  // 在pos位置,插入結點node int DLinkList_Insert(DLinkList *list, DLinkListNode *node, int pos);  // 獲取pos位置的結點,返回給上層 DLinkListNode* DLinkList_Get(DLinkList *list, int pos);  // 刪除pos位置的結點 DLinkListNode* DLinkList_Delete(DLinkList *list, int pos);  // 刪除值為node的結點 DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node);  // 重置游標 DLinkListNode* DLinkList_Reset(DLinkList* list);  // 獲取當前游標所指的結點 DLinkListNode* DLinkList_Current(DLinkList* list);  // 獲取游標當前所指結點,然后讓游標指向下一個結點 DLinkListNode* DLinkList_Next(DLinkList* list);  // 獲取游標當前所指結點,然后讓游標指向前一個結點 DLinkListNode* DLinkList_Pre(DLinkList* list);   #endif 


dlinklist.cpp  

// 循環鏈表API實現  #include <cstdio> #include <malloc.h> #include "dlinklist.h"  typedef struct _tag_DLinkList {   DLinkListNode header;   DLinkListNode *slider;   int length; }TDLinkList;  // 創建鏈表 DLinkList* DLinkList_Create() {   TDLinkList *ret = (TDLinkList *)malloc(sizeof(TDLinkList));      if (ret != NULL) {     ret->header.next = NULL;     ret->header.pre = NULL;     ret->slider = NULL;     ret->length = 0;   }    return ret; }  // 銷毀鏈表 void DLinkList_Destroy(DLinkList *list) {   if (list != NULL) {     free(list);   }    return; }  // 清空鏈表 void DLinkList_Clear(DLinkList *list) {   TDLinkList *tList = (TDLinkList *)list;    if (tList != NULL) {     tList->header.next = NULL;     tList->header.pre = NULL;     tList->slider = NULL;     tList->length = 0;   }      return; }  // 獲取鏈表長度 int DLinkList_Length(DLinkList *list) {   TDLinkList *tList = (TDLinkList *)list;   int ret = -1;    if (tList != NULL) {     ret = tList->length;   }    return ret; }  // 在pos位置,插入結點node int DLinkList_Insert(DLinkList *list, DLinkListNode *node, int pos) {   TDLinkList *tList = (TDLinkList *)list;   int ret = -1, i = 0;    if (list != NULL && node != NULL && pos >= 0)   {     ret = 0;      DLinkListNode *cur = (DLinkListNode *)tList;     DLinkListNode *next = NULL;      for (i = 0; i < pos && cur->next != NULL; ++i) {       cur = cur->next;     }      next = cur->next;      cur->next = node;     node->next = next;      // 當鏈表插入第一個結點時需要進行特殊處理     if (next != NULL) {       next->pre = node;     }     node->pre = cur;      if (tList->length == 0)  {       tList->slider = node; // 當鏈表插入第一個元素處理游標     }      // 若在0位置插入,需要特殊處理,新來的結點next前pre指向NULL     if (cur == (DLinkListNode *)tList) {       node->pre = NULL;     }     ++tList->length;   }    return ret; }  // 獲取pos位置的結點,返回給上層 DLinkListNode* DLinkList_Get(DLinkList *list, int pos) {   TDLinkList *tList = (TDLinkList *)list;   DLinkListNode* ret = NULL;   int i = 0;      if (list != NULL && pos >= 0 && pos < tList->length) {     DLinkListNode *cur = (DLinkListNode *)tList;      for (i = 0; i < pos; ++i) {       cur = cur->next;     }      ret = cur->next;   }    return ret; }  // 刪除pos位置的結點 DLinkListNode* DLinkList_Delete(DLinkList *list, int pos) {   TDLinkList *tList = (TDLinkList *)list;   DLinkListNode* ret = NULL;   int i = 0;    if (tList != NULL && pos >= 0) {     DLinkListNode *cur = (DLinkListNode *)tList;     DLinkListNode *next = NULL;      for (i = 0; i < pos && cur->next != NULL; ++i) {       cur = cur->next;     }      ret = cur->next;     next = ret->next;      cur->next = next;      if (next != NULL) {       next->pre = cur;        if (cur == (DLinkListNode *)tList) { // 第0個位置,需要特殊處理         next->pre = NULL;       }     }      if (tList->slider == ret) {       tList->slider = next;     }      --tList->length;   }    return ret; }  // 刪除值為node的結點 DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node) {   TDLinkList *tList = (TDLinkList *)list;   DLinkListNode* ret = NULL;   int i = 0;    if (tList != NULL) {     DLinkListNode *cur = (DLinkListNode *)tList;      for (i = 0; i < DLinkList_Length(tList); ++i) {       if (cur->next == node) {         ret = cur->next;         break;       }        cur = cur->next;     }      if (!ret) {       DLinkList_Delete(tList, i);     }   }    return ret; }  // 重置游標 DLinkListNode* DLinkList_Reset(DLinkList* list) {   TDLinkList *tList = (TDLinkList *)list;   DLinkListNode* ret = NULL;      if (tList != NULL) {     tList->slider = tList->header.next;     ret = tList->slider;   }    return ret; }  // 獲取當前游標所指的結點 DLinkListNode* DLinkList_Current(DLinkList* list) {   TDLinkList *tList = (TDLinkList *)list;   DLinkListNode* ret = NULL;    if (tList != NULL) {     ret = tList->slider;   }    return ret; }  // 獲取游標當前所指結點,然后讓游標指向下一個結點 DLinkListNode* DLinkList_Next(DLinkList* list) {   TDLinkList *tList = (TDLinkList *)list;   DLinkListNode* ret = NULL;    if (tList != NULL && tList->slider != NULL) {     ret = tList->slider;     tList->slider = ret->next;   }    return ret; }  // 獲取游標當前所指結點,然后讓游標指向前一個結點 DLinkListNode* DLinkList_Pre(DLinkList* list) {   TDLinkList *tList = (TDLinkList *)list;   DLinkListNode* ret = NULL;    if (tList != NULL && tList->slider != NULL) {     ret = tList->slider;     tList->slider = ret->pre;   }    return ret; } 


main.cpp  

// 循環線表測試程序  #include <cstdio> #include "dlinklist.h"  const int maxn = 5;  struct Student {   DLinkListNode node;   int age; };  void play() {   Student s[maxn];   for (int i = 0; i < maxn; ++i) {     s[i].age = i + 21;   }    DLinkList *list = NULL;   list = DLinkList_Create(); // 創建鏈表    // 插入結點   for (int i = 0; i < maxn; ++i) {     int ret = DLinkList_Insert(list, (DLinkListNode *)&s[i], DLinkList_Length(list));     if (ret < 0) {       return;       printf("function DLinkList_Insert err./n");     }   }    // 遍歷鏈表   for (int i = 0; i < DLinkList_Length(list); ++i) {     Student *tmp = (Student *)DLinkList_Get(list, i);     if (tmp == NULL) {       printf("function DLinkList_Get err./n");       return;     }     printf("age: %d/n", tmp->age);   }    DLinkList_Delete(list, DLinkList_Length(list) - 1); // 刪除尾結點   DLinkList_Delete(list, 0); // 刪除頭結點    // 用游標遍歷鏈表   for (int i = 0; i < DLinkList_Length(list); ++i) {     Student *tmp = (Student *)DLinkList_Next(list);     if (tmp == NULL) {       printf("function DLinkList_Next err./n");       return;     }     printf("age: %d/n", tmp->age);   }    printf("/n");    DLinkList_Reset(list);   DLinkList_Next(list);    Student *tmp = (Student *)DLinkList_Current(list);   if (tmp == NULL) {     printf("function DLinkList_Current err./n");     return;   }   printf("age: %d/n", tmp->age);    DLinkList_DeleteNode(list, (DLinkListNode*)tmp);   tmp = (Student *)DLinkList_Current(list);   if (tmp == NULL) {     printf("function DLinkList_Current err./n");     return;   }   printf("age: %d/n", tmp->age);   printf("length: %d/n", DLinkList_Length(list));    DLinkList_Pre(list);   tmp = (Student *)DLinkList_Current(list);   if (tmp == NULL) {     printf("function DLinkList_Current err./n");     return;   }   printf("age: %d/n", tmp->age);    printf("length: %d/n", DLinkList_Length(list));   DLinkList_Destroy(list);    return; }  int main() {   play();    return 0; } 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品亚洲元码| 久久99国产精品自在自在app| 精品国产999| 欧美日韩国产影院| 成人av在线亚洲| 亚洲第一精品自拍| 亚洲精品电影在线观看| 欧美亚洲另类制服自拍| 欧美成人精品三级在线观看| 欧美激情手机在线视频| 日韩精品在线视频| 亚洲一级免费视频| 91久久久久久| 国产精品视频免费在线观看| 欧美日韩精品在线| 亚洲伊人成综合成人网| 国产一区二区三区在线免费观看| 国产欧美韩国高清| 日韩精品视频在线观看网址| 国内精品久久久久| 国产亚洲精品久久久久动| 亚洲人成网站在线播| 久久伊人精品视频| 91在线观看免费高清完整版在线观看| 亚洲欧美成人网| 久久人人爽亚洲精品天堂| 亚洲欧美另类人妖| 精品国产欧美一区二区五十路| 欧美精品激情在线观看| 欧美激情啊啊啊| 日韩高清电影好看的电视剧电影| 国产成人激情视频| 亚洲欧美国产精品久久久久久久| 精品国产精品自拍| 久久精品国产v日韩v亚洲| 欧美电影在线免费观看网站| 久久久91精品国产一区不卡| 国产精品嫩草影院一区二区| 96精品久久久久中文字幕| 久久精品国产一区二区电影| 国产精品igao视频| 国产一区二区三区在线免费观看| 久久精品国产一区二区三区| 亚洲综合中文字幕在线观看| 欧美性生活大片免费观看网址| 美女视频久久黄| 久久久久国产精品免费网站| 日韩视频免费观看| 国产成人精品视频| 久久久久久久久久久亚洲| 欧美精品www在线观看| 色噜噜狠狠色综合网图区| 91福利视频在线观看| 日韩精品视频观看| 久久综合久中文字幕青草| 日本a级片电影一区二区| 日韩欧美中文字幕在线播放| 久久久这里只有精品视频| 成人黄色在线播放| 日本久久久久亚洲中字幕| 九九热r在线视频精品| 日韩av在线直播| 美女av一区二区三区| 日韩av网站大全| 亚洲精品中文字幕有码专区| 欧美成人国产va精品日本一级| 久久97久久97精品免视看| 亚洲www视频| 国产成人精品久久亚洲高清不卡| 国产91网红主播在线观看| 欧美午夜影院在线视频| 欧美日韩中文字幕在线视频| 亚洲男人天堂视频| 久久精品最新地址| 国产成人免费av电影| 亚洲自拍在线观看| 亚洲曰本av电影| 欧美巨大黑人极品精男| 91久久国产综合久久91精品网站| 久久精品国产成人精品| 中文字幕日韩欧美精品在线观看| 亚洲美女又黄又爽在线观看| 久久久久久久久久av| 精品久久久久久久久久国产| 性色av香蕉一区二区| 久热爱精品视频线路一| 中文字幕无线精品亚洲乱码一区| 日韩视频免费看| 亚洲xxxx视频| 久久国产精品首页| 国产在线98福利播放视频| 久久艳片www.17c.com| 亚洲xxxxx电影| 91色p视频在线| 成人黄色av免费在线观看| 亚洲女人被黑人巨大进入al| 欧洲一区二区视频| 成人性教育视频在线观看| 国产成人福利夜色影视| 久久久久久国产精品| www欧美日韩| 亚洲国产一区自拍| 欧美成人中文字幕| 国产精品777| 亚洲欧美国产制服动漫| 青青草原一区二区| 北条麻妃在线一区二区| 亚洲欧美制服丝袜| 亚洲美女性视频| 久久精品国产成人| 亚洲第一视频网| 91精品视频免费| 成人精品在线观看| 久久久久久亚洲精品| 欧美性xxxx极品hd欧美风情| 国内揄拍国内精品| 国产精品成人免费电影| www高清在线视频日韩欧美| 91极品女神在线| 91在线直播亚洲| 精品亚洲一区二区三区在线观看| 日本一区二区在线免费播放| 国产欧美一区二区三区四区| 欧美日韩黄色大片| 亚洲女人天堂av| 97不卡在线视频| 亚洲片av在线| 精品国产91久久久久久老师| 欧美电影免费观看电视剧大全| 91精品国产综合久久男男| 国产在线拍揄自揄视频不卡99| 精品国产乱码久久久久久天美| 日韩国产高清污视频在线观看| 国产精品中文字幕在线观看| 欧美丝袜美女中出在线| 欧美日韩综合视频| 亚洲国产精品成人va在线观看| 中文字幕在线成人| 欧美国产精品va在线观看| 欧美一级大片在线观看| 欧美精品一本久久男人的天堂| 精品国产91久久久久久| 精品福利视频导航| 欧美激情综合色综合啪啪五月| 欧美性猛交xxxx免费看| 国产精品免费看久久久香蕉| 久久久www成人免费精品| 欧美性xxxxxxx| 中文字幕亚洲天堂| 国内精品小视频| 久久香蕉精品香蕉| 欧美自拍大量在线观看| 欧美日韩一区二区免费视频| 国产在线精品成人一区二区三区| 中文字幕一区电影| 国产精品尤物福利片在线观看| 91亚洲va在线va天堂va国| 日韩国产激情在线| 国色天香2019中文字幕在线观看| 精品成人乱色一区二区| 97在线视频免费| 国产日韩在线观看av| 欧美激情亚洲视频| 国产日韩中文在线|