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

首頁 > 編程 > C > 正文

使用C語言實現vector動態數組的實例分享

2020-01-26 14:36:37
字體:
來源:轉載
供稿:網友

下面是做項目時實現的一個動態數組,先后加入了好幾個之后的項目,下面曬下代碼。

頭文件:

# ifndef __CVECTOR_H__ # define __CVECTOR_H__ # define MIN_LEN 256 # define CVEFAILED -1 # define CVESUCCESS 0 # define CVEPUSHBACK 1 # define CVEPOPBACK 2 # define CVEINSERT  3 # define CVERM    4 # define EXPANED_VAL 1 # define REDUSED_VAL 2  typedef void *citerator; typedef struct _cvector *cvector;  # ifdef _cplusplus # define EXTERN_ extern "C" # else # define EXTERN_ extern # endif  EXTERN_ cvector  cvector_create  (const size_t size              ); EXTERN_ void   cvector_destroy (const cvector cv              ); EXTERN_ size_t  cvector_length  (const cvector cv              ); EXTERN_ int    cvector_pushback (const cvector cv, void *memb        ); EXTERN_ int    cvector_popback (const cvector cv, void *memb        ); EXTERN_ size_t  cvector_iter_at (const cvector cv, citerator iter      ); EXTERN_ int    cvector_iter_val (const cvector cv, citerator iter, void *memb); EXTERN_ citerator cvector_begin  (const cvector cv              ); EXTERN_ citerator cvector_end   (const cvector cv              ); EXTERN_ citerator cvector_next   (const cvector cv, citerator iter      ); EXTERN_ int    cvector_val_at  (const cvector cv, size_t index, void *memb ); EXTERN_ int    cvector_insert  (const cvector cv, citerator iter, void *memb); EXTERN_ int    cvector_insert_at(const cvector cv, size_t index, void *memb ); EXTERN_ int    cvector_rm    (const cvector cv, citerator iter      ); EXTERN_ int    cvector_rm_at  (const cvector cv, size_t index       );   /* for test */ EXTERN_ void   cv_info     (const cvector cv              ); EXTERN_ void   cv_print     (const cvector cv              ); #endif /* EOF file cvector.h */ 


C文件:

# include <stdio.h> # include <stdlib.h> # include <string.h> # include <unistd.h> # define MIN_LEN 256 # define CVEFAILED -1 # define CVESUCCESS 0 # define CVEPUSHBACK 1 # define CVEPOPBACK 2 # define CVEINSERT  3 # define CVERM    4 # define EXPANED_VAL 1 # define REDUSED_VAL 2  typedef void *citerator; typedef struct _cvector  {      void *cv_pdata;   size_t cv_len, cv_tot_len, cv_size; } *cvector;  # define CWARNING_ITER(cv, iter, file, func, line) /   do {/     if ((cvector_begin(cv) > iter) || (cvector_end(cv) <= iter)) {/       fprintf(stderr, "var(" #iter ") warng out of range, "/           "at file:%s func:%s line:%d!!/n", file, func, line);/       return CVEFAILED;/     }/   } while (0)  # ifdef _cplusplus # define EXTERN_ extern "C" # else # define EXTERN_ extern # endif  EXTERN_ cvector  cvector_create  (const size_t size              ); EXTERN_ void   cvector_destroy (const cvector cv              ); EXTERN_ size_t  cvector_length  (const cvector cv              ); EXTERN_ int    cvector_pushback (const cvector cv, void *memb        ); EXTERN_ int    cvector_popback (const cvector cv, void *memb        ); EXTERN_ size_t  cvector_iter_at (const cvector cv, citerator iter      ); EXTERN_ int    cvector_iter_val (const cvector cv, citerator iter, void *memb); EXTERN_ citerator cvector_begin  (const cvector cv              ); EXTERN_ citerator cvector_end   (const cvector cv              ); EXTERN_ citerator cvector_next   (const cvector cv, citerator iter      ); EXTERN_ int    cvector_val_at  (const cvector cv, size_t index, void *memb ); EXTERN_ int    cvector_insert  (const cvector cv, citerator iter, void *memb); EXTERN_ int    cvector_insert_at(const cvector cv, size_t index, void *memb ); EXTERN_ int    cvector_rm    (const cvector cv, citerator iter      ); EXTERN_ int    cvector_rm_at  (const cvector cv, size_t index       );  /* for test */ EXTERN_ void   cv_info     (const cvector cv              ); EXTERN_ void   cv_print     (const cvector cv              );  cvector cvector_create(const size_t size) {   cvector cv = (cvector)malloc(sizeof (struct _cvector));    if (!cv) return NULL;    cv->cv_pdata = malloc(MIN_LEN * size);    if (!cv->cv_pdata)    {     free(cv);     return NULL;   }    cv->cv_size = size;   cv->cv_tot_len = MIN_LEN;   cv->cv_len = 0;    return cv; }  void cvector_destroy(const cvector cv) {   free(cv->cv_pdata);   free(cv);   return; }  size_t cvector_length(const cvector cv) {   return cv->cv_len; }  int cvector_pushback(const cvector cv, void *memb) {   if (cv->cv_len >= cv->cv_tot_len)    {     void *pd_sav = cv->cv_pdata;     cv->cv_tot_len <<= EXPANED_VAL;     cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);      if (!cv->cv_pdata)      {       cv->cv_pdata = pd_sav;       cv->cv_tot_len >>= EXPANED_VAL;       return CVEPUSHBACK;     }   }    memcpy(cv->cv_pdata + cv->cv_len * cv->cv_size, memb, cv->cv_size);   cv->cv_len++;    return CVESUCCESS; }  int cvector_popback(const cvector cv, void *memb) {   if (cv->cv_len <= 0) return CVEPOPBACK;    cv->cv_len--;   memcpy(memb, cv->cv_pdata + cv->cv_len * cv->cv_size, cv->cv_size);    if ((cv->cv_tot_len >= (MIN_LEN << REDUSED_VAL))        && (cv->cv_len <= (cv->cv_tot_len >> REDUSED_VAL)))    {     void *pd_sav = cv->cv_pdata;     cv->cv_tot_len >>= EXPANED_VAL;     cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);      if (!cv->cv_pdata)      {       cv->cv_tot_len <<= EXPANED_VAL;       cv->cv_pdata = pd_sav;       return CVEPOPBACK;     }   }    return CVESUCCESS; }  size_t cvector_iter_at(const cvector cv, citerator iter) {   CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);   return (iter - cv->cv_pdata) / cv->cv_size; }  int cvector_iter_val(const cvector cv, citerator iter, void *memb) {   CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);   memcpy(memb, iter, cv->cv_size);   return 0; }  citerator cvector_begin(const cvector cv) {   return cv->cv_pdata; }  citerator cvector_end(const cvector cv) {   return cv->cv_pdata + (cv->cv_size * cv->cv_len); }  static inline void cvmemove_foreward(const cvector cv, void *from, void *to) {   size_t size = cv->cv_size;   void *p;   for (p = to; p >= from; p -= size) memcpy(p + size, p, size);   return; }  static inline void cvmemove_backward(const cvector cv, void *from, void *to) {   memcpy(from, from + cv->cv_size, to - from);   return; }  int cvector_insert(const cvector cv, citerator iter, void *memb) {   CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);    if (cv->cv_len >= cv->cv_tot_len)    {     void *pd_sav = cv->cv_pdata;     cv->cv_tot_len <<= EXPANED_VAL;     cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);      if (!cv->cv_pdata)      {       cv->cv_pdata = pd_sav;       cv->cv_tot_len >>= EXPANED_VAL;       return CVEINSERT;     }   }    cvmemove_foreward(cv, iter, cv->cv_pdata + cv->cv_len * cv->cv_size);   memcpy(iter, memb, cv->cv_size);   cv->cv_len++;    return CVESUCCESS; }  int cvector_insert_at(const cvector cv, size_t index, void *memb) {   citerator iter;    if (index >= cv->cv_tot_len)    {     cv->cv_len = index + 1;     while (cv->cv_len >= cv->cv_tot_len) cv->cv_tot_len <<= EXPANED_VAL;     cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);     iter = cv->cv_pdata + cv->cv_size * index;     memcpy(iter, memb, cv->cv_size);   }   else    {     iter = cv->cv_pdata + cv->cv_size * index;     cvector_insert(cv, iter, memb);   }    return 0; }  citerator cvector_next(const cvector cv, citerator iter) {   return iter + cv->cv_size; }  int cvector_val(const cvector cv, citerator iter, void *memb) {   memcpy(memb, iter, cv->cv_size);   return 0; }  int cvector_val_at(const cvector cv, size_t index, void *memb) {   memcpy(memb, cv->cv_pdata + index * cv->cv_size, cv->cv_size);   return 0; }  int cvector_rm(const cvector cv, citerator iter) {   citerator from;   citerator end;   CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);   from = iter;   end = cvector_end(cv);   memcpy(from, from + cv->cv_size, end - from);   cv->cv_len--;    if ((cv->cv_tot_len >= (MIN_LEN << REDUSED_VAL))       && (cv->cv_len <= (cv->cv_tot_len >> REDUSED_VAL)))    {     void *pd_sav = cv->cv_pdata;     cv->cv_tot_len >>= EXPANED_VAL;     cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);      if (!cv->cv_pdata)      {       cv->cv_tot_len <<= EXPANED_VAL;       cv->cv_pdata = pd_sav;       return CVERM;     }   }    return CVESUCCESS; }  int cvector_rm_at(const cvector cv, size_t index) {   citerator iter;   iter = cv->cv_pdata + cv->cv_size * index;   CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);   return cvector_rm(cv, iter); }  void cv_info(const cvector cv) {   printf("/n/ntot :%s : %d/n", __func__, cv->cv_tot_len);   printf("len :%s : %d/n",   __func__, cv->cv_len);   printf("size:%s : %d/n/n",  __func__, cv->cv_size);   return; }  void cv_print(const cvector cv) {   int num;   citerator iter;    if (cvector_length(cv) == 0)     fprintf(stderr, "file:%s func:%s line:%d error, null length cvector!!/n", __FILE__, __func__, __LINE__);    for (iter = cvector_begin(cv);        iter != cvector_end(cv);       iter = cvector_next(cv, iter))    {     cvector_iter_val(cv, iter, &num);     printf("var:%d at:%d/n", num, cvector_iter_at(cv, iter));   }    return; } 

改進版
上面那份代碼是在Linux下寫的,如果是在Windows的Visul C++環境下編譯似乎會出些問題,所以特別做了個改進版:
下面是更新后的代碼:

cvector.h

# ifndef __CVECTOR_H__ # define __CVECTOR_H__  # include <stdio.h>  # include <stdlib.h>  # include <string.h>   # define MIN_LEN 256 # define CVEFAILED -1 # define CVESUCCESS 0 # define CVEPUSHBACK 1 # define CVEPOPBACK 2 # define CVEINSERT  3 # define CVERM    4 # define EXPANED_VAL 1 # define REDUSED_VAL 2  typedef void *citerator; typedef struct _cvector *cvector;  # ifdef __cplusplus extern "C" { # endif    cvector  cvector_create  (const size_t size              );   void   cvector_destroy (const cvector cv              );   size_t  cvector_length  (const cvector cv              );   int    cvector_pushback (const cvector cv, void *memb        );   int    cvector_popback (const cvector cv, void *memb        );   size_t  cvector_iter_at (const cvector cv, citerator iter      );   int    cvector_iter_val (const cvector cv, citerator iter, void *memb);   citerator cvector_begin  (const cvector cv              );   citerator cvector_end   (const cvector cv              );   citerator cvector_next   (const cvector cv, citerator iter      );   int    cvector_val_at  (const cvector cv, size_t index, void *memb );   int    cvector_insert  (const cvector cv, citerator iter, void *memb);   int    cvector_insert_at(const cvector cv, size_t index, void *memb );   int    cvector_rm    (const cvector cv, citerator iter      );   int    cvector_rm_at  (const cvector cv, size_t index       );    /* for test */   void   cv_info     (const cvector cv              );   void   cv_print     (const cvector cv              );  # ifdef __cplusplus } # endif  #endif /* EOF file cvector.h */ 

cvector.c

#include "cvector.h"  #ifndef __gnu_linux__ #define __func__ "unknown" #define inline __forceinline #endif  # define CWARNING_ITER(cv, iter, file, func, line) /   do {/   if ((cvector_begin(cv) > iter) || (cvector_end(cv) <= iter)) {/   fprintf(stderr, "var(" #iter ") warng out of range, "/   "at file:%s func:%s line:%d!!/n", file, func, line);/   return CVEFAILED;/   }/   } while (0)  struct _cvector {   void *cv_pdata;   size_t cv_len, cv_tot_len, cv_size; };  cvector cvector_create(const size_t size) {   cvector cv = (cvector)malloc(sizeof (struct _cvector));    if (!cv) return NULL;    cv->cv_pdata = malloc(MIN_LEN * size);    if (!cv->cv_pdata)   {     free(cv);     return NULL;   }    cv->cv_size = size;   cv->cv_tot_len = MIN_LEN;   cv->cv_len = 0;    return cv; }   void cvector_destroy(const cvector cv)  {    free(cv->cv_pdata);    free(cv);    return;  }   size_t cvector_length(const cvector cv)  {    return cv->cv_len;  }   int cvector_pushback(const cvector cv, void *memb)  {    if (cv->cv_len >= cv->cv_tot_len)     {      void *pd_sav = cv->cv_pdata;      cv->cv_tot_len <<= EXPANED_VAL;      cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);       if (!cv->cv_pdata)       {        cv->cv_pdata = pd_sav;        cv->cv_tot_len >>= EXPANED_VAL;        return CVEPUSHBACK;      }    }     memcpy((char *)cv->cv_pdata + cv->cv_len * cv->cv_size, memb, cv->cv_size);    cv->cv_len++;     return CVESUCCESS;  }   int cvector_popback(const cvector cv, void *memb)  {    if (cv->cv_len <= 0) return CVEPOPBACK;     cv->cv_len--;    memcpy(memb, (char *)cv->cv_pdata + cv->cv_len * cv->cv_size, cv->cv_size);     if ((cv->cv_tot_len >= (MIN_LEN << REDUSED_VAL))       && (cv->cv_len <= (cv->cv_tot_len >> REDUSED_VAL)))     {      void *pd_sav = cv->cv_pdata;      cv->cv_tot_len >>= EXPANED_VAL;      cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);       if (!cv->cv_pdata)       {        cv->cv_tot_len <<= EXPANED_VAL;        cv->cv_pdata = pd_sav;        return CVEPOPBACK;      }    }     return CVESUCCESS;  }   size_t cvector_iter_at(const cvector cv, citerator iter)  {    CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);    return ((char *)iter - (char *)cv->cv_pdata) / cv->cv_size;  }   int cvector_iter_val(const cvector cv, citerator iter, void *memb)  {    CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);    memcpy(memb, iter, cv->cv_size);    return 0;  }   citerator cvector_begin(const cvector cv)  {    return cv->cv_pdata;  }   citerator cvector_end(const cvector cv)  {    return (char *)cv->cv_pdata + (cv->cv_size * cv->cv_len);  }   static inline void cvmemove_foreward(const cvector cv, void *from, void *to)  {    size_t size = cv->cv_size;    char *p;    for (p = (char *)to; p >= (char *)from; p -= size) memcpy(p + size, p, size);    return;  }   static inline void cvmemove_backward(const cvector cv, void *from, void *to)  {    memcpy(from, (char *)from + cv->cv_size, (char *)to - (char *)from);    return;  }   int cvector_insert(const cvector cv, citerator iter, void *memb)  {    CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);     if (cv->cv_len >= cv->cv_tot_len)     {      void *pd_sav = cv->cv_pdata;      cv->cv_tot_len <<= EXPANED_VAL;      cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);       if (!cv->cv_pdata)       {        cv->cv_pdata = pd_sav;        cv->cv_tot_len >>= EXPANED_VAL;        return CVEINSERT;      }    }     cvmemove_foreward(cv, iter, (char *)cv->cv_pdata + cv->cv_len * cv->cv_size);    memcpy(iter, memb, cv->cv_size);    cv->cv_len++;     return CVESUCCESS;  }   int cvector_insert_at(const cvector cv, size_t index, void *memb)  {    citerator iter;     if (index >= cv->cv_tot_len)     {      cv->cv_len = index + 1;      while (cv->cv_len >= cv->cv_tot_len) cv->cv_tot_len <<= EXPANED_VAL;      cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);      iter = (char *)cv->cv_pdata + cv->cv_size * index;      memcpy(iter, memb, cv->cv_size);    }    else     {      iter = (char *)cv->cv_pdata + cv->cv_size * index;      cvector_insert(cv, iter, memb);    }     return 0;  }   citerator cvector_next(const cvector cv, citerator iter)  {    return (char *)iter + cv->cv_size;  }   int cvector_val(const cvector cv, citerator iter, void *memb)  {    memcpy(memb, iter, cv->cv_size);    return 0;  }   int cvector_val_at(const cvector cv, size_t index, void *memb)  {    memcpy(memb, (char *)cv->cv_pdata + index * cv->cv_size, cv->cv_size);    return 0;  }   int cvector_rm(const cvector cv, citerator iter)  {    citerator from;    citerator end;    CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);    from = iter;    end = cvector_end(cv);    memcpy(from, (char *)from + cv->cv_size, (char *)end - (char *)from);    cv->cv_len--;     if ((cv->cv_tot_len >= (MIN_LEN << REDUSED_VAL))      && (cv->cv_len <= (cv->cv_tot_len >> REDUSED_VAL)))     {      void *pd_sav = cv->cv_pdata;      cv->cv_tot_len >>= EXPANED_VAL;      cv->cv_pdata = realloc(cv->cv_pdata, cv->cv_tot_len * cv->cv_size);       if (!cv->cv_pdata)       {        cv->cv_tot_len <<= EXPANED_VAL;        cv->cv_pdata = pd_sav;        return CVERM;      }    }     return CVESUCCESS;  }   int cvector_rm_at(const cvector cv, size_t index)  {    citerator iter;    iter = (char *)cv->cv_pdata + cv->cv_size * index;    CWARNING_ITER(cv, iter, __FILE__, __func__, __LINE__);    return cvector_rm(cv, iter);  }   void cv_info(const cvector cv)  {    printf("/n/ntot :%s : %d/n", __func__, cv->cv_tot_len);    printf("len :%s : %d/n",   __func__, cv->cv_len);    printf("size:%s : %d/n/n",  __func__, cv->cv_size);    return;  }   void cv_print(const cvector cv)  {    int num;    citerator iter;     if (cvector_length(cv) == 0)      fprintf(stderr, "file:%s func:%s line:%d error, null length cvector!!/n", __FILE__, __func__, __LINE__);     for (iter = cvector_begin(cv);       iter != cvector_end(cv);      iter = cvector_next(cv, iter))     {      cvector_iter_val(cv, iter, &num);      printf("var:%d at:%d/n", num, cvector_iter_at(cv, iter));    }     return;  }  

main.cpp

#include "cvector.h"  int main() {   int i = 1;   cvector cv = cvector_create(sizeof(int));   cvector_pushback(cv, &i);   cvector_pushback(cv, &i);   cvector_pushback(cv, &i);   cvector_pushback(cv, &i);   cv_print(cv);   cvector_destroy(cv);   return 0; } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日本在线视频中文字字幕| 欧美精品aaa| 久久精品99久久久香蕉| 91麻豆桃色免费看| 日韩精品在线观看一区二区| 久久亚洲精品毛片| 日韩在线观看免费| 97在线视频免费看| 国产精品一区二区三区久久| 久久99久久久久久久噜噜| 亚洲综合在线做性| 亚洲另类欧美自拍| …久久精品99久久香蕉国产| 日韩欧美在线视频免费观看| 高清在线视频日韩欧美| 成人免费福利视频| 日韩视频精品在线| 色偷偷偷亚洲综合网另类| 日韩精品在线播放| 精品视频www| www.久久久久久.com| 久久精品久久久久| 俺去了亚洲欧美日韩| 国产精品爱久久久久久久| 国产精品久久在线观看| 国产成人激情小视频| 亚洲aa中文字幕| 欧美日韩国产999| 国产成+人+综合+亚洲欧美丁香花| 美女啪啪无遮挡免费久久网站| 成人国产亚洲精品a区天堂华泰| 亚洲男人天堂手机在线| 欧美亚洲伦理www| 欧美日韩亚洲网| 国产精品久久久久高潮| 久久激情五月丁香伊人| 欧美贵妇videos办公室| 久久久久久久久久国产精品| 久久亚洲综合国产精品99麻豆精品福利| 欧美日韩亚洲激情| 久久韩剧网电视剧| 91日韩在线播放| 色综合老司机第九色激情| 欧美日韩第一视频| 欧美影院成年免费版| 日韩高清人体午夜| 欧美一级片久久久久久久| 亚洲午夜未删减在线观看| 亚洲天堂av在线免费观看| 国产精品精品视频一区二区三区| 国产成人jvid在线播放| 亚洲一区999| 欧美黑人国产人伦爽爽爽| 亚洲美女久久久| 高潮白浆女日韩av免费看| 91在线直播亚洲| 久久久久久亚洲精品不卡| 欧美性黄网官网| 精品中文字幕久久久久久| 尤物九九久久国产精品的分类| 亚洲一级黄色av| 国产成人一区二区三区电影| 亚洲自拍偷拍福利| 日韩av三级在线观看| 性欧美办公室18xxxxhd| 一区二区三区视频在线| 欧美第一黄网免费网站| 日韩在线观看免费| 久久亚洲国产成人| 亚洲欧美资源在线| 欧美精品中文字幕一区| 亚洲男人第一av网站| 日韩精品高清在线观看| 91社影院在线观看| 日韩精品小视频| 亚洲网站在线播放| 欧美一级免费看| 欧美一区二区视频97| 91国产精品91| 中文字幕亚洲欧美| 国产午夜一区二区| 日韩黄在线观看| 国产一区二区精品丝袜| 国产精品欧美日韩久久| 久久成人人人人精品欧| 国产裸体写真av一区二区| 亚洲图片欧美日产| 欧美激情亚洲精品| 日韩成人高清在线| 欧美日韩国产精品一区二区三区四区| 亚洲国内精品在线| 日韩av黄色在线观看| 精品久久香蕉国产线看观看亚洲| 亚洲欧美变态国产另类| 成人福利视频网| 懂色av中文一区二区三区天美| 国产精品美女午夜av| 国产精品久久色| 日韩中文字幕久久| 欧美大片网站在线观看| 18久久久久久| 亚洲免费电影在线观看| 国产精品视频999| 欧美性xxxx极品hd欧美风情| 欧美午夜xxx| 日本久久91av| 国产日韩综合一区二区性色av| 97超碰国产精品女人人人爽| 国产精品极品尤物在线观看| 狠狠色狠色综合曰曰| 久久久国产精品x99av| 欧美性极品xxxx娇小| 亚洲精品一区在线观看香蕉| 日韩精品中文字幕在线观看| 亚洲天堂网站在线观看视频| 欧美老女人bb| 亚洲图片在区色| 日韩欧美在线免费| 中文字幕精品久久久久| 国产精品一区二区久久久久| 波霸ol色综合久久| 青青草国产精品一区二区| 国产亚洲激情视频在线| 欧美激情综合色综合啪啪五月| 亚洲男人天堂2024| 亚洲无线码在线一区观看| 久久综合九色九九| 日韩高清中文字幕| 亚洲午夜未满十八勿入免费观看全集| 日韩视频免费大全中文字幕| 国外成人在线播放| 日韩av手机在线观看| 日韩第一页在线| 日韩中文字幕久久| 亚洲全黄一级网站| 亚洲韩国日本中文字幕| 亚洲欧美在线看| 国产在线拍偷自揄拍精品| 深夜成人在线观看| 亚洲国产欧美一区二区丝袜黑人| 亚洲国产美女久久久久| 亚洲欧美综合区自拍另类| 欧美激情精品久久久久久大尺度| 久久久99久久精品女同性| 中文字幕视频一区二区在线有码| 欧美一区二区三区……| 国产精品天天狠天天看| 久久久之久亚州精品露出| 日韩av在线免费播放| 日韩成人xxxx| 亚洲免费电影一区| 精品久久香蕉国产线看观看亚洲| 欧美大码xxxx| 国语自产精品视频在免费| 欧美激情a∨在线视频播放| 91国产精品电影| 久久韩国免费视频| 成人xvideos免费视频| 国产精品久久久久久影视| 久久6精品影院| 欧洲永久精品大片ww免费漫画| 日韩欧美在线视频日韩欧美在线视频| 久久精品精品电影网| 亚洲影影院av|