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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构_基础结构

發(fā)布時(shí)間:2024/1/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构_基础结构 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
數(shù)據(jù)結(jié)構(gòu)_基礎(chǔ)結(jié)構(gòu)

鏈表

鏈表是一種數(shù)據(jù)結(jié)構(gòu),相對(duì)于數(shù)組而言,插入和刪除的開銷比較小,而查找的代價(jià)較大.以下我們實(shí)現(xiàn)雙向鏈表:

public class MyList<T> {private Node<T> head;private Node<T> tail;private int size;//初始化頭結(jié)點(diǎn)和尾節(jié)點(diǎn)public MyList(){head=new Node<T>(null, null, tail);tail=new Node<T>(null, head, null);}//獲得大小public int size(){return size;}//增加方法public void add(T x){this.addBefore(tail, x);}public void addBefore(int index,T x){this.addBefore(this.getNode(index), x);}public void addBefore(Node<T> p,T x){Node<T> newNode=new Node<T>(x, p.prev, p);newNode.prev.next=newNode;p.prev=newNode;size++;}//查找方法 效率應(yīng)該高點(diǎn)public Node<T> getNode(int index){Node<T> p;if(index<size()/2){p=head.next;for(int i=0;i<index;i++){p=p.next;}}else{p=tail;for(int i=size();i>index;i--){p=p.prev;}}return p;}//刪除 public T remove(int index){return remove(this.getNode(index));}public T remove(Node<T> p){p.next.prev=p.prev;p.prev.next=p.next;size--;return p.data;}//修改public void set(int index,T newData){Node<T> p=this.getNode(index);p.data=newData;}//顯示全部public void show(){if(size()>0){Node<T> p=head.next;while(p!=tail){System.out.println(p.data);p=p.next;}}}//節(jié)點(diǎn)類private static class Node<T>{public T data;public Node<T> prev;public Node<T> next;public Node(T d,Node<T> p,Node<T> n){data=d;prev=p;next=n;}}}

在我寫的這個(gè)雙向鏈表中頭節(jié)點(diǎn)head和尾節(jié)點(diǎn)tail是空出來的,不存放任何數(shù)據(jù).若是要改造成雙向循環(huán)鏈表的話就不合適了,比如最后一個(gè)元素要next三下越過tail和head才循環(huán)到第一個(gè)元素.
于是稍作改造(注意空指針),雙向循環(huán)鏈表:

package com.fredal.structure;public class MyCList<T> {private Node<T> head;private Node<T> tail;private int size;// 初始化頭結(jié)點(diǎn)和尾節(jié)點(diǎn)public MyCList() {head = new Node<T>(null, tail, tail);tail = new Node<T>(null, head, head);// 解決空指針head.prev = tail;head.next = tail;tail.prev = head;tail.next = head;}// 獲得大小public int size() {return size;}// 增加方法public void add(T x) {if (head.data == null) {head.data = x;size++;} else if (tail.data == null) {tail.data = x;size++;} else {Node<T> p = this.addBefore(head, x);tail = p;}}public Node<T> addBefore(int index, T x) {return this.addBefore(this.getNode(index), x);}public Node<T> addBefore(Node<T> p, T x) {Node<T> newNode = new Node<T>(x, p.prev, p);newNode.prev.next = newNode;p.prev = newNode;size++;return newNode;}// 查找方法 效率應(yīng)該高點(diǎn)public Node<T> getNode(int index) {Node<T> p;if (index < size() / 2) {p = head;for (int i = 0; i < index; i++) {p = p.next;}} else {p = tail;for (int i = size() - 1; i > index; i--) {p = p.prev;}}return p;}// 刪除public T remove(int index) {return remove(this.getNode(index));}public T remove(Node<T> p) {p.next.prev = p.prev;p.prev.next = p.next;size--;if (p == head) {head = p.next;}if (p == tail) {tail = p.prev;}return p.data;}// 修改public void set(int index, T newData) {Node<T> p = this.getNode(index);p.data = newData;}// 顯示全部public void show() {if (size() > 0) {Node<T> p = head;do {System.out.println(p.data);p = p.next;} while (p != head);}}// 節(jié)點(diǎn)類private static class Node<T> {private T data;private Node<T> prev;private Node<T> next;public Node(T d, Node<T> p, Node<T> n) {data = d;prev = p;next = n;}}}

棧Stack是一個(gè)表,先進(jìn)后出,有兩種實(shí)現(xiàn)方式:由鏈表或者數(shù)組來實(shí)現(xiàn).這里我們選用數(shù)組實(shí)現(xiàn)做例子,比較簡單:

package com.fredal.structure;public class MyStack<T> {// Java 不支持泛型數(shù)組,如需使用,請(qǐng)使用Java提供的容器private Object[] stack;// 棧的默認(rèn)初始大小private static final int INIT_SIZE = 2;// 棧頂索引private int index;public MyStack() {stack = new Object[INIT_SIZE];index = -1;}/*** 構(gòu)造方法* * @param initSize* 棧的初始大小*/public MyStack(int initSize) {if (initSize < 0) {throw new IllegalArgumentException();}stack = new Object[initSize];index = -1;}/*** 出棧操作* * @return 棧頂對(duì)象*/public T pop() {if (!isEmpty()) {T temp = peek();stack[index--] = null;return temp;}return null;}/*** 入棧操作* * @param obj* 等待入棧的對(duì)象*/public void push(T obj) {if (isFull()) {Object[] temp = stack;// 擴(kuò)容操作,和arraylist的一樣,如果棧滿,則創(chuàng)建空間為當(dāng)前棧空間兩倍的棧stack = new Object[2 * stack.length];System.arraycopy(temp, 0, stack, 0, temp.length);}stack[++index] = obj;}/*** 查看棧頂對(duì)象* * @return 棧頂對(duì)象*/public T peek() {if (!isEmpty()) {return (T) stack[index];}return null;}/*** 查看棧是否為空* * @return 如果棧為空返回true,否則返回false*/public boolean isEmpty() {return index == -1;}/*** 查看棧是否滿* * @return 如果棧滿返回true,否則返回false*/public boolean isFull() {return index >= stack.length - 1;} }

應(yīng)用的比較多的一個(gè)是檢測(cè)平衡符號(hào),這個(gè)比較簡單,就是按順序push按順序pop看看是否相同.另外一個(gè)是逆波蘭表達(dá)式,寫一段代碼,包括中序表達(dá)式轉(zhuǎn)化為逆波蘭式,以及逆波蘭式的計(jì)算:

package com.fredal.structure;import java.util.ArrayList; import java.util.List; import java.util.Stack;public class Nbl {private static Stack s1 = new Stack();// 逆波蘭表達(dá)式的棧private static Stack s2 = new Stack();// 運(yùn)算棧//將字符串轉(zhuǎn)化成中序listpublic static List<String> format(String s) {List<String> ls = new ArrayList<String>();// 存儲(chǔ)中序表達(dá)式int i = 0;String str;char c;do {if ((c = s.charAt(i)) < 48 || (c = s.charAt(i)) > 57) {ls.add("" + c);i++;} else {str = "";while (i < s.length() && (c = s.charAt(i)) >= 48&& (c = s.charAt(i)) <= 57) {str += c;i++;}ls.add(str);}} while (i < s.length());return ls;}//將中序表達(dá)式轉(zhuǎn)化為逆波蘭式public static List<String> parse(List<String> ls) {List<String> lss = new ArrayList<String>();for (String ss : ls) {if (ss.matches("\\d+")) {lss.add(ss);// 不是運(yùn)算符就加入list} else if (ss.equals("(")) {s1.push(ss);//碰到"("直接進(jìn)棧} else if(ss.equals(")")){while(!s1.peek().equals("(")){//將直到"("的符號(hào)全彈出lss.add((String) s1.pop());//加入list}s1.pop();//彈出"("}else{while(s1.size()!=0&&getValue((String) s1.peek())>=getValue(ss)){//比它優(yōu)先級(jí)高的全彈出lss.add((String) s1.pop());}s1.push(ss);}}while(s1.size()!=0){//結(jié)束之后全部彈出lss.add((String) s1.pop()); }return lss;}//獲取運(yùn)算符優(yōu)先級(jí)private static int getValue(String s) {if (s.equals("+")) {return 1;} else if (s.equals("-")) {return 1;} else if (s.equals("*")) {return 2;} else if (s.equals("/")) {return 2;}return 0;}// 對(duì)逆波蘭表達(dá)式進(jìn)行求值public static int calculate(List<String> ls) {for (String s : ls) {if (s.matches("\\d+")) {s2.push(s);// 不是運(yùn)算符就入棧} else {int b = Integer.parseInt((String) s2.pop());int a = Integer.parseInt((String) s2.pop());if (s.equals("+")) {a = a + b;} else if (s.equals("-")) {a = a - b;} else if (s.equals("*")) {a = a * b;} else if (s.equals("/")) {a = a / b;}s2.push("" + a);}}return Integer.parseInt((String) s2.pop());} }

隊(duì)列

隊(duì)列(queue)也是表,使用隊(duì)列時(shí)插入在一端進(jìn)行而刪除在另一端進(jìn)行.
基本操作是enqueue入隊(duì),在表的末端插入元素.dequeue出隊(duì),刪除并返回表的開頭.
用數(shù)組實(shí)現(xiàn)隊(duì)列會(huì)有潛在問題,就是隊(duì)列滿了之后在入隊(duì)一次back的下標(biāo)會(huì)指向不存在的位置,解決這個(gè)問題我們用循環(huán)隊(duì)列的方式.

package com.fredal.structure;public class MyQueue<T> {private int INITIAL_SIZE=10;private int capacity;//數(shù)組長度private Object[] elementData;private int front=0;private int back=0;public MyQueue(){capacity=INITIAL_SIZE;elementData=new Object[capacity];}//以一個(gè)初始化元素來創(chuàng)建循環(huán)隊(duì)列public MyQueue(T element){this();elementData[0]=element;back++;}//以指定長度的數(shù)組來創(chuàng)建循環(huán)隊(duì)列 public MyQueue(T element,int initSize){ this.capacity=initSize; elementData=new Object[capacity]; elementData[0]=element; back++; } //判斷循環(huán)隊(duì)列是否為空public boolean isEmpty(){return back==front&&elementData[back]==null;}//獲取循環(huán)隊(duì)列的大小public int length(){if(isEmpty()){return 0;}else{return back>front?back-front:capacity-(front-back);} }//插入隊(duì)列public void add(T element){if(back==front&&elementData[front]!=null){throw new IndexOutOfBoundsException("隊(duì)列已滿");}elementData[back++]=element;//back指針到頭就循環(huán)back=(back==capacity)?0:back;}//移出隊(duì)列public T remove(){if(isEmpty()){throw new IndexOutOfBoundsException("隊(duì)列已空");}T oldValue=(T)elementData[front];elementData[front++]=null;//如果front到頭 就循環(huán)front=front==capacity?0:front;return oldValue;}//顯示public void show(){if(isEmpty()){System.out.println("[]");}else{if(front<back){StringBuilder sb=new StringBuilder("["); for(int i=front;i<back;i++){ sb.append(elementData[i].toString()+","); } int len=sb.length(); String s= sb.delete(len-1, len).append("]").toString(); System.out.println(s);}else{StringBuilder sb=new StringBuilder("["); for(int i=front;i<capacity;i++){ sb.append(elementData[i].toString()+","); } for(int i=0;i<back;i++){ sb.append(elementData[i].toString()+","); } int len=sb.length(); String s= sb.delete(len-1, len).append("]").toString(); System.out.println(s);}}} }

先說二叉樹,二叉樹表示每個(gè)節(jié)點(diǎn)都不能有多于兩個(gè)的兒子.二叉樹的一個(gè)重要應(yīng)用是二叉排序樹ADT:

package com.fredal.structure;public class MyTree<T extends Comparable<T>> {// 節(jié)點(diǎn)類private static class BNode<T> {T element;BNode<T> left;BNode<T> right;public BNode(T element) {this(element, null, null);}public BNode(T element, BNode<T> lt, BNode<T> rt) {this.element = element;left = lt;right = rt;}}// 插入節(jié)點(diǎn)之后public BNode<T> insert(T x, BNode<T> t) {if (t == null) {return new BNode<T>(x, null, null);}int result = x.compareTo(t.element);if (result < 0)t.left = insert(x, t.left);else if (result > 0)t.right = insert(x, t.right);return t;}// 刪除public BNode<T> remove(T x, BNode<T> t) {if (t == null)return t;int result = x.compareTo(t.element);if (result < 0)t.left = remove(x, t.left);else if (result > 0)t.right = remove(x, t.right);else if (t.left != null && t.right != null) {// 找到了 兩個(gè)孩子t.element = findMin(t.right).element;// 雖然是奇怪的刪除策略t.right = remove(t.element, t.right);} else// 找到了 一個(gè)孩子或沒有孩子t = (t.left != null) ? t.left : t.right;return t;}// 尋找最小值public BNode<T> findMin(BNode<T> t) {if (t == null)return null;else if (t.left == null)return t;return findMin(t.left);}// 尋找最大值public BNode<T> findMax(BNode<T> t) {if (t == null)return null;else if (t.right == null)return t;return findMax(t.right);}// 獲得樹的高度public int getHeight(BNode<T> t) {int a = 0;int b = 0;if (t.left != null)a = getHeight(t.left);if (t.right != null)b = getHeight(t.right);return (a > b ? a : b) + 1;}// 是否包含某個(gè)元素public boolean contains(T x, BNode<T> t) {if (t == null)return false;int result = x.compareTo(t.element);if (result < 0)return contains(x, t.left);else if (result > 0)return contains(x, t.right);elsereturn true;}// 顯示 中序遍歷了public void show(BNode<T> t) {if (t.left != null)show(t.left);System.out.println(t.element);if (t.right != null)show(t.right);} }

還有一個(gè)就是所謂的表達(dá)式樹,一個(gè)正常的表達(dá)式構(gòu)建的表達(dá)式樹如果采取中序遍歷就是得到正常的表達(dá)式,如果采取后序遍歷呢就會(huì)產(chǎn)生上一節(jié)說的那個(gè)逆波蘭表達(dá)式,也叫后綴表達(dá)式.
基本上這個(gè)樹的作用就是把后序表達(dá)式變成中序表達(dá)式,之前那段代碼逆作用..
用后綴表達(dá)式構(gòu)建樹,再中序遍歷之

package com.fredal.structure;import java.util.Stack;public class ExpTree<T> {// 節(jié)點(diǎn)類private static class BNode<T> {T element;BNode<T> left;BNode<T> right;public BNode(T element) {this(element, null, null);}public BNode(T element, BNode<T> lt, BNode<T> rt) {this.element = element;left = lt;right = rt;}}public BNode<Character> bulid(String exp){char c;BNode<Character> newNode,newLeft,newRight;Stack<BNode<Character>> stack=new Stack<BNode<Character>>();int i=0;int len=exp.length();while(i!=len){while(exp.charAt(i)==' '||exp.charAt(i)=='\t'){i++;}if(i==len) break;c=exp.charAt(i);i++;if(c=='+'||c=='-'||c=='*'||c=='/'){//碰到運(yùn)算符就把前兩個(gè)彈出來重新構(gòu)建一下樹再入棧newRight=stack.pop();newLeft=stack.pop(); newNode=new BNode<Character>(c, newLeft, newRight);stack.push(newNode);}else{newNode=new BNode<Character>(c);//不是運(yùn)算符直接入棧stack.push(newNode);}}if(!stack.isEmpty()){return stack.pop();//彈出整棵樹}else{return null;}}//中序輸出public void show(BNode<T> t){if(t!=null){show(t.left);System.out.print(t.element+" ");show(t.right);}}}

表達(dá)式樹確實(shí)是這樣的,中序遍歷也沒錯(cuò),不過要變成正常的表達(dá)式仍然是不夠的,還需要考慮優(yōu)先級(jí)去加括號(hào),偷懶方法當(dāng)然是全部加上括號(hào),這兒不寫了.
然后寫一下多叉樹的實(shí)現(xiàn)吧,這兒寫習(xí)慣了就給node外面加了一層包裝類,這樣添加的時(shí)候還是比較麻煩的,待優(yōu)化吧.

package com.fredal.structure;import java.util.ArrayList; import java.util.List;public class CTree<T> {// 節(jié)點(diǎn)類private static class CNode<T> {T element;CNode<T> parent;// 父節(jié)點(diǎn)List<CNode<T>> children = new ArrayList<CNode<T>>();// 孩子節(jié)點(diǎn)CNode<T> leftBrother;// 左邊第一個(gè)兄弟節(jié)點(diǎn)CNode<T> rightBrother;// 右邊第一個(gè)兄弟節(jié)點(diǎn)public CNode(T t, CNode<T> parent) {element = t;this.parent = parent;}}// 插入public CNode<T> insert(T x, CNode<T> t) {CNode<T> newNode = new CNode<T>(x, t);List<CNode<T>> children = t.children;if (children.size() == 0) {children.add(newNode);} else {CNode<T> lastNode = children.get(children.size() - 1);lastNode.rightBrother = newNode;newNode.leftBrother = lastNode;children.add(newNode);}return newNode;}// 得到根節(jié)點(diǎn)public CNode<T> getRoot(CNode<T> t) {while (t.parent != null) {t = t.parent;}return t;}// 得到父節(jié)點(diǎn)public CNode<T> getParent(CNode<T> t) {if (t.parent != null) {return t.parent;}return null;}// 得到子節(jié)點(diǎn)public List<CNode<T>> getChildren(CNode<T> t) {if (t.children != null) {return t.children;}return null;}// 左節(jié)點(diǎn)public CNode<T> getLeftBrother(CNode<T> t) {if (t.leftBrother != null) {return t.leftBrother;}return null;}// 右節(jié)點(diǎn)public CNode<T> getRightBrother(CNode<T> t) {if (t.rightBrother != null) {return t.rightBrother;}return null;}// 這個(gè)屬于先序遍歷public void show(CNode<T> t) {if (t != null) {System.out.print(t.element + " ");List<CNode<T>> children = t.children;for (int i = 0; i < children.size(); i++) {show(children.get(i));}}} }

散列

散列也叫哈希,會(huì)遇到散列沖突問題,解決沖突最常用的是分離鏈接法,簡單來說就是將散列到同一個(gè)值的所有元素都插入到一個(gè)鏈表中去,來實(shí)現(xiàn)吧.

package com.fredal.structure;import java.util.LinkedList; import java.util.List;public class MyHashTable<T> {private static final int DEFAULT_SIZE=100;private int size;private List<T>[] lists;public MyHashTable(int size){this.size=size;lists=new LinkedList[size];//初始化鏈表數(shù)組for (int i = 0; i < lists.length; i++) {lists[i]=new LinkedList<T>();}}public MyHashTable(){this(DEFAULT_SIZE);}private int myHash(T x){int hashVal=x.hashCode();hashVal%=lists.length;if(hashVal<0){hashVal+=lists.length;}return hashVal;}//是否包含 使用自帶的就好 ~public boolean contains(T x){List<T> list=lists[myHash(x)];return list.contains(x);}//插入方法public void insert(T x){List<T> list=lists[myHash(x)];if(!list.contains(x)){list.add(x);size++;}}//移除方法public void remove(T x){List<T> list=lists[myHash(x)];if(list.contains(x)){list.remove(x);size--;}} }

這里并沒有考慮再散列,因?yàn)閳?chǎng)景不復(fù)雜,再散列以后再談.
還有一種散列表叫探測(cè)散列表,也以后再說...

堆也叫優(yōu)先隊(duì)列,是允許至少下列兩種操作的數(shù)據(jù)結(jié)構(gòu),插入和刪除并返回最小值.插入(insert)相當(dāng)于enqueue(入隊(duì)),而刪除最小值(deleteMin)則等價(jià)于隊(duì)列運(yùn)算dequeue(出隊(duì)).
我們要講的叫二叉堆,除了是一顆完整二叉樹外還要保持其堆序性質(zhì).例如最小二叉堆即,最小元在根上,而任意節(jié)點(diǎn)都小于它的所有后裔.
我們通過代碼模擬二叉堆

package com.fredal.structure;public class MyHeap<T extends Comparable<? super T>> {private static final int DEFAULT_CAPACITY=10;private int currentSize;//堆元素?cái)?shù)量private T[] array;//堆數(shù)組public MyHeap(){this(DEFAULT_CAPACITY);}public MyHeap(int capacity){currentSize=0;array=(T[]) new Comparable[capacity+1];}//對(duì)已給定的數(shù)組建堆初始化public MyHeap(T [] items){currentSize=items.length;array=(T[])new Comparable[(currentSize+2)*11/10];int i=1;for(T item:items){array[i++]=item;}buildHeap();}private void buildHeap() {for(int i=currentSize/2;i>0;i--){percolateDown(i);//下濾}}//下濾 保持堆特性private void percolateDown(int i) {int child;T temp =array[i];for(;i*2<=currentSize;i=child){child=i*2;if(child!=currentSize&& array[child+1].compareTo(array[child])<0){child++;}if(array[child].compareTo(temp)<0){array[i]=array[child];}elsebreak;}array[i]=temp;}//插入操作public void insert(T x){if(currentSize==array.length-1){enlargeArray(array.length*2+1);}//上濾操作int i=++currentSize;for(array[0]=x;x.compareTo(array[i/2])<0;i/=2){array[i]=array[i/2];}array[i]=x;}//擴(kuò)容操作private void enlargeArray(int newSize){T[] old=array;array=(T[]) new Comparable[newSize];for(int i=0;i<old.length;i++){array[i]=old[i];}}//刪除最小值public T deleteMin(){if(currentSize==0){throw new RuntimeException();}T min=findMin();array[1]=array[currentSize--];//下濾percolateDown(1);return min;}//尋找最小值public T findMin() {if(currentSize==0){throw new RuntimeException();}return array[1];}//顯示public void show(){for(int i=1;i<=currentSize;i++){System.out.print(array[i]+" ");}}}

堆的應(yīng)用有許多,堆排序是最重要的之一,我們?cè)诤竺鏁?huì)講到.

鏈表

鏈表是一種數(shù)據(jù)結(jié)構(gòu),相對(duì)于數(shù)組而言,插入和刪除的開銷比較小,而查找的代價(jià)較大.以下我們實(shí)現(xiàn)雙向鏈表:

public class MyList<T> {private Node<T> head;private Node<T> tail;private int size;//初始化頭結(jié)點(diǎn)和尾節(jié)點(diǎn)public MyList(){head=new Node<T>(null, null, tail);tail=new Node<T>(null, head, null);}//獲得大小public int size(){return size;}//增加方法public void add(T x){this.addBefore(tail, x);}public void addBefore(int index,T x){this.addBefore(this.getNode(index), x);}public void addBefore(Node<T> p,T x){Node<T> newNode=new Node<T>(x, p.prev, p);newNode.prev.next=newNode;p.prev=newNode;size++;}//查找方法 效率應(yīng)該高點(diǎn)public Node<T> getNode(int index){Node<T> p;if(index<size()/2){p=head.next;for(int i=0;i<index;i++){p=p.next;}}else{p=tail;for(int i=size();i>index;i--){p=p.prev;}}return p;}//刪除 public T remove(int index){return remove(this.getNode(index));}public T remove(Node<T> p){p.next.prev=p.prev;p.prev.next=p.next;size--;return p.data;}//修改public void set(int index,T newData){Node<T> p=this.getNode(index);p.data=newData;}//顯示全部public void show(){if(size()>0){Node<T> p=head.next;while(p!=tail){System.out.println(p.data);p=p.next;}}}//節(jié)點(diǎn)類private static class Node<T>{public T data;public Node<T> prev;public Node<T> next;public Node(T d,Node<T> p,Node<T> n){data=d;prev=p;next=n;}}}

在我寫的這個(gè)雙向鏈表中頭節(jié)點(diǎn)head和尾節(jié)點(diǎn)tail是空出來的,不存放任何數(shù)據(jù).若是要改造成雙向循環(huán)鏈表的話就不合適了,比如最后一個(gè)元素要next三下越過tail和head才循環(huán)到第一個(gè)元素.
于是稍作改造(注意空指針),雙向循環(huán)鏈表:

package com.fredal.structure;public class MyCList<T> {private Node<T> head;private Node<T> tail;private int size;// 初始化頭結(jié)點(diǎn)和尾節(jié)點(diǎn)public MyCList() {head = new Node<T>(null, tail, tail);tail = new Node<T>(null, head, head);// 解決空指針head.prev = tail;head.next = tail;tail.prev = head;tail.next = head;}// 獲得大小public int size() {return size;}// 增加方法public void add(T x) {if (head.data == null) {head.data = x;size++;} else if (tail.data == null) {tail.data = x;size++;} else {Node<T> p = this.addBefore(head, x);tail = p;}}public Node<T> addBefore(int index, T x) {return this.addBefore(this.getNode(index), x);}public Node<T> addBefore(Node<T> p, T x) {Node<T> newNode = new Node<T>(x, p.prev, p);newNode.prev.next = newNode;p.prev = newNode;size++;return newNode;}// 查找方法 效率應(yīng)該高點(diǎn)public Node<T> getNode(int index) {Node<T> p;if (index < size() / 2) {p = head;for (int i = 0; i < index; i++) {p = p.next;}} else {p = tail;for (int i = size() - 1; i > index; i--) {p = p.prev;}}return p;}// 刪除public T remove(int index) {return remove(this.getNode(index));}public T remove(Node<T> p) {p.next.prev = p.prev;p.prev.next = p.next;size--;if (p == head) {head = p.next;}if (p == tail) {tail = p.prev;}return p.data;}// 修改public void set(int index, T newData) {Node<T> p = this.getNode(index);p.data = newData;}// 顯示全部public void show() {if (size() > 0) {Node<T> p = head;do {System.out.println(p.data);p = p.next;} while (p != head);}}// 節(jié)點(diǎn)類private static class Node<T> {private T data;private Node<T> prev;private Node<T> next;public Node(T d, Node<T> p, Node<T> n) {data = d;prev = p;next = n;}}}

棧Stack是一個(gè)表,先進(jìn)后出,有兩種實(shí)現(xiàn)方式:由鏈表或者數(shù)組來實(shí)現(xiàn).這里我們選用數(shù)組實(shí)現(xiàn)做例子,比較簡單:

package com.fredal.structure;public class MyStack<T> {// Java 不支持泛型數(shù)組,如需使用,請(qǐng)使用Java提供的容器private Object[] stack;// 棧的默認(rèn)初始大小private static final int INIT_SIZE = 2;// 棧頂索引private int index;public MyStack() {stack = new Object[INIT_SIZE];index = -1;}/*** 構(gòu)造方法* * @param initSize* 棧的初始大小*/public MyStack(int initSize) {if (initSize < 0) {throw new IllegalArgumentException();}stack = new Object[initSize];index = -1;}/*** 出棧操作* * @return 棧頂對(duì)象*/public T pop() {if (!isEmpty()) {T temp = peek();stack[index--] = null;return temp;}return null;}/*** 入棧操作* * @param obj* 等待入棧的對(duì)象*/public void push(T obj) {if (isFull()) {Object[] temp = stack;// 擴(kuò)容操作,和arraylist的一樣,如果棧滿,則創(chuàng)建空間為當(dāng)前棧空間兩倍的棧stack = new Object[2 * stack.length];System.arraycopy(temp, 0, stack, 0, temp.length);}stack[++index] = obj;}/*** 查看棧頂對(duì)象* * @return 棧頂對(duì)象*/public T peek() {if (!isEmpty()) {return (T) stack[index];}return null;}/*** 查看棧是否為空* * @return 如果棧為空返回true,否則返回false*/public boolean isEmpty() {return index == -1;}/*** 查看棧是否滿* * @return 如果棧滿返回true,否則返回false*/public boolean isFull() {return index >= stack.length - 1;} }

應(yīng)用的比較多的一個(gè)是檢測(cè)平衡符號(hào),這個(gè)比較簡單,就是按順序push按順序pop看看是否相同.另外一個(gè)是逆波蘭表達(dá)式,寫一段代碼,包括中序表達(dá)式轉(zhuǎn)化為逆波蘭式,以及逆波蘭式的計(jì)算:

package com.fredal.structure;import java.util.ArrayList; import java.util.List; import java.util.Stack;public class Nbl {private static Stack s1 = new Stack();// 逆波蘭表達(dá)式的棧private static Stack s2 = new Stack();// 運(yùn)算棧//將字符串轉(zhuǎn)化成中序listpublic static List<String> format(String s) {List<String> ls = new ArrayList<String>();// 存儲(chǔ)中序表達(dá)式int i = 0;String str;char c;do {if ((c = s.charAt(i)) < 48 || (c = s.charAt(i)) > 57) {ls.add("" + c);i++;} else {str = "";while (i < s.length() && (c = s.charAt(i)) >= 48&& (c = s.charAt(i)) <= 57) {str += c;i++;}ls.add(str);}} while (i < s.length());return ls;}//將中序表達(dá)式轉(zhuǎn)化為逆波蘭式public static List<String> parse(List<String> ls) {List<String> lss = new ArrayList<String>();for (String ss : ls) {if (ss.matches("\\d+")) {lss.add(ss);// 不是運(yùn)算符就加入list} else if (ss.equals("(")) {s1.push(ss);//碰到"("直接進(jìn)棧} else if(ss.equals(")")){while(!s1.peek().equals("(")){//將直到"("的符號(hào)全彈出lss.add((String) s1.pop());//加入list}s1.pop();//彈出"("}else{while(s1.size()!=0&&getValue((String) s1.peek())>=getValue(ss)){//比它優(yōu)先級(jí)高的全彈出lss.add((String) s1.pop());}s1.push(ss);}}while(s1.size()!=0){//結(jié)束之后全部彈出lss.add((String) s1.pop()); }return lss;}//獲取運(yùn)算符優(yōu)先級(jí)private static int getValue(String s) {if (s.equals("+")) {return 1;} else if (s.equals("-")) {return 1;} else if (s.equals("*")) {return 2;} else if (s.equals("/")) {return 2;}return 0;}// 對(duì)逆波蘭表達(dá)式進(jìn)行求值public static int calculate(List<String> ls) {for (String s : ls) {if (s.matches("\\d+")) {s2.push(s);// 不是運(yùn)算符就入棧} else {int b = Integer.parseInt((String) s2.pop());int a = Integer.parseInt((String) s2.pop());if (s.equals("+")) {a = a + b;} else if (s.equals("-")) {a = a - b;} else if (s.equals("*")) {a = a * b;} else if (s.equals("/")) {a = a / b;}s2.push("" + a);}}return Integer.parseInt((String) s2.pop());} }

隊(duì)列

隊(duì)列(queue)也是表,使用隊(duì)列時(shí)插入在一端進(jìn)行而刪除在另一端進(jìn)行.
基本操作是enqueue入隊(duì),在表的末端插入元素.dequeue出隊(duì),刪除并返回表的開頭.
用數(shù)組實(shí)現(xiàn)隊(duì)列會(huì)有潛在問題,就是隊(duì)列滿了之后在入隊(duì)一次back的下標(biāo)會(huì)指向不存在的位置,解決這個(gè)問題我們用循環(huán)隊(duì)列的方式.

package com.fredal.structure;public class MyQueue<T> {private int INITIAL_SIZE=10;private int capacity;//數(shù)組長度private Object[] elementData;private int front=0;private int back=0;public MyQueue(){capacity=INITIAL_SIZE;elementData=new Object[capacity];}//以一個(gè)初始化元素來創(chuàng)建循環(huán)隊(duì)列public MyQueue(T element){this();elementData[0]=element;back++;}//以指定長度的數(shù)組來創(chuàng)建循環(huán)隊(duì)列 public MyQueue(T element,int initSize){ this.capacity=initSize; elementData=new Object[capacity]; elementData[0]=element; back++; } //判斷循環(huán)隊(duì)列是否為空public boolean isEmpty(){return back==front&&elementData[back]==null;}//獲取循環(huán)隊(duì)列的大小public int length(){if(isEmpty()){return 0;}else{return back>front?back-front:capacity-(front-back);} }//插入隊(duì)列public void add(T element){if(back==front&&elementData[front]!=null){throw new IndexOutOfBoundsException("隊(duì)列已滿");}elementData[back++]=element;//back指針到頭就循環(huán)back=(back==capacity)?0:back;}//移出隊(duì)列public T remove(){if(isEmpty()){throw new IndexOutOfBoundsException("隊(duì)列已空");}T oldValue=(T)elementData[front];elementData[front++]=null;//如果front到頭 就循環(huán)front=front==capacity?0:front;return oldValue;}//顯示public void show(){if(isEmpty()){System.out.println("[]");}else{if(front<back){StringBuilder sb=new StringBuilder("["); for(int i=front;i<back;i++){ sb.append(elementData[i].toString()+","); } int len=sb.length(); String s= sb.delete(len-1, len).append("]").toString(); System.out.println(s);}else{StringBuilder sb=new StringBuilder("["); for(int i=front;i<capacity;i++){ sb.append(elementData[i].toString()+","); } for(int i=0;i<back;i++){ sb.append(elementData[i].toString()+","); } int len=sb.length(); String s= sb.delete(len-1, len).append("]").toString(); System.out.println(s);}}} }

先說二叉樹,二叉樹表示每個(gè)節(jié)點(diǎn)都不能有多于兩個(gè)的兒子.二叉樹的一個(gè)重要應(yīng)用是二叉排序樹ADT:

package com.fredal.structure;public class MyTree<T extends Comparable<T>> {// 節(jié)點(diǎn)類private static class BNode<T> {T element;BNode<T> left;BNode<T> right;public BNode(T element) {this(element, null, null);}public BNode(T element, BNode<T> lt, BNode<T> rt) {this.element = element;left = lt;right = rt;}}// 插入節(jié)點(diǎn)之后public BNode<T> insert(T x, BNode<T> t) {if (t == null) {return new BNode<T>(x, null, null);}int result = x.compareTo(t.element);if (result < 0)t.left = insert(x, t.left);else if (result > 0)t.right = insert(x, t.right);return t;}// 刪除public BNode<T> remove(T x, BNode<T> t) {if (t == null)return t;int result = x.compareTo(t.element);if (result < 0)t.left = remove(x, t.left);else if (result > 0)t.right = remove(x, t.right);else if (t.left != null && t.right != null) {// 找到了 兩個(gè)孩子t.element = findMin(t.right).element;// 雖然是奇怪的刪除策略t.right = remove(t.element, t.right);} else// 找到了 一個(gè)孩子或沒有孩子t = (t.left != null) ? t.left : t.right;return t;}// 尋找最小值public BNode<T> findMin(BNode<T> t) {if (t == null)return null;else if (t.left == null)return t;return findMin(t.left);}// 尋找最大值public BNode<T> findMax(BNode<T> t) {if (t == null)return null;else if (t.right == null)return t;return findMax(t.right);}// 獲得樹的高度public int getHeight(BNode<T> t) {int a = 0;int b = 0;if (t.left != null)a = getHeight(t.left);if (t.right != null)b = getHeight(t.right);return (a > b ? a : b) + 1;}// 是否包含某個(gè)元素public boolean contains(T x, BNode<T> t) {if (t == null)return false;int result = x.compareTo(t.element);if (result < 0)return contains(x, t.left);else if (result > 0)return contains(x, t.right);elsereturn true;}// 顯示 中序遍歷了public void show(BNode<T> t) {if (t.left != null)show(t.left);System.out.println(t.element);if (t.right != null)show(t.right);} }

還有一個(gè)就是所謂的表達(dá)式樹,一個(gè)正常的表達(dá)式構(gòu)建的表達(dá)式樹如果采取中序遍歷就是得到正常的表達(dá)式,如果采取后序遍歷呢就會(huì)產(chǎn)生上一節(jié)說的那個(gè)逆波蘭表達(dá)式,也叫后綴表達(dá)式.
基本上這個(gè)樹的作用就是把后序表達(dá)式變成中序表達(dá)式,之前那段代碼逆作用..
用后綴表達(dá)式構(gòu)建樹,再中序遍歷之

package com.fredal.structure;import java.util.Stack;public class ExpTree<T> {// 節(jié)點(diǎn)類private static class BNode<T> {T element;BNode<T> left;BNode<T> right;public BNode(T element) {this(element, null, null);}public BNode(T element, BNode<T> lt, BNode<T> rt) {this.element = element;left = lt;right = rt;}}public BNode<Character> bulid(String exp){char c;BNode<Character> newNode,newLeft,newRight;Stack<BNode<Character>> stack=new Stack<BNode<Character>>();int i=0;int len=exp.length();while(i!=len){while(exp.charAt(i)==' '||exp.charAt(i)=='\t'){i++;}if(i==len) break;c=exp.charAt(i);i++;if(c=='+'||c=='-'||c=='*'||c=='/'){//碰到運(yùn)算符就把前兩個(gè)彈出來重新構(gòu)建一下樹再入棧newRight=stack.pop();newLeft=stack.pop(); newNode=new BNode<Character>(c, newLeft, newRight);stack.push(newNode);}else{newNode=new BNode<Character>(c);//不是運(yùn)算符直接入棧stack.push(newNode);}}if(!stack.isEmpty()){return stack.pop();//彈出整棵樹}else{return null;}}//中序輸出public void show(BNode<T> t){if(t!=null){show(t.left);System.out.print(t.element+" ");show(t.right);}}}

表達(dá)式樹確實(shí)是這樣的,中序遍歷也沒錯(cuò),不過要變成正常的表達(dá)式仍然是不夠的,還需要考慮優(yōu)先級(jí)去加括號(hào),偷懶方法當(dāng)然是全部加上括號(hào),這兒不寫了.
然后寫一下多叉樹的實(shí)現(xiàn)吧,這兒寫習(xí)慣了就給node外面加了一層包裝類,這樣添加的時(shí)候還是比較麻煩的,待優(yōu)化吧.

package com.fredal.structure;import java.util.ArrayList; import java.util.List;public class CTree<T> {// 節(jié)點(diǎn)類private static class CNode<T> {T element;CNode<T> parent;// 父節(jié)點(diǎn)List<CNode<T>> children = new ArrayList<CNode<T>>();// 孩子節(jié)點(diǎn)CNode<T> leftBrother;// 左邊第一個(gè)兄弟節(jié)點(diǎn)CNode<T> rightBrother;// 右邊第一個(gè)兄弟節(jié)點(diǎn)public CNode(T t, CNode<T> parent) {element = t;this.parent = parent;}}// 插入public CNode<T> insert(T x, CNode<T> t) {CNode<T> newNode = new CNode<T>(x, t);List<CNode<T>> children = t.children;if (children.size() == 0) {children.add(newNode);} else {CNode<T> lastNode = children.get(children.size() - 1);lastNode.rightBrother = newNode;newNode.leftBrother = lastNode;children.add(newNode);}return newNode;}// 得到根節(jié)點(diǎn)public CNode<T> getRoot(CNode<T> t) {while (t.parent != null) {t = t.parent;}return t;}// 得到父節(jié)點(diǎn)public CNode<T> getParent(CNode<T> t) {if (t.parent != null) {return t.parent;}return null;}// 得到子節(jié)點(diǎn)public List<CNode<T>> getChildren(CNode<T> t) {if (t.children != null) {return t.children;}return null;}// 左節(jié)點(diǎn)public CNode<T> getLeftBrother(CNode<T> t) {if (t.leftBrother != null) {return t.leftBrother;}return null;}// 右節(jié)點(diǎn)public CNode<T> getRightBrother(CNode<T> t) {if (t.rightBrother != null) {return t.rightBrother;}return null;}// 這個(gè)屬于先序遍歷public void show(CNode<T> t) {if (t != null) {System.out.print(t.element + " ");List<CNode<T>> children = t.children;for (int i = 0; i < children.size(); i++) {show(children.get(i));}}} }

散列

散列也叫哈希,會(huì)遇到散列沖突問題,解決沖突最常用的是分離鏈接法,簡單來說就是將散列到同一個(gè)值的所有元素都插入到一個(gè)鏈表中去,來實(shí)現(xiàn)吧.

package com.fredal.structure;import java.util.LinkedList; import java.util.List;public class MyHashTable<T> {private static final int DEFAULT_SIZE=100;private int size;private List<T>[] lists;public MyHashTable(int size){this.size=size;lists=new LinkedList[size];//初始化鏈表數(shù)組for (int i = 0; i < lists.length; i++) {lists[i]=new LinkedList<T>();}}public MyHashTable(){this(DEFAULT_SIZE);}private int myHash(T x){int hashVal=x.hashCode();hashVal%=lists.length;if(hashVal<0){hashVal+=lists.length;}return hashVal;}//是否包含 使用自帶的就好 ~public boolean contains(T x){List<T> list=lists[myHash(x)];return list.contains(x);}//插入方法public void insert(T x){List<T> list=lists[myHash(x)];if(!list.contains(x)){list.add(x);size++;}}//移除方法public void remove(T x){List<T> list=lists[myHash(x)];if(list.contains(x)){list.remove(x);size--;}} }

這里并沒有考慮再散列,因?yàn)閳?chǎng)景不復(fù)雜,再散列以后再談.
還有一種散列表叫探測(cè)散列表,也以后再說...

堆也叫優(yōu)先隊(duì)列,是允許至少下列兩種操作的數(shù)據(jù)結(jié)構(gòu),插入和刪除并返回最小值.插入(insert)相當(dāng)于enqueue(入隊(duì)),而刪除最小值(deleteMin)則等價(jià)于隊(duì)列運(yùn)算dequeue(出隊(duì)).
我們要講的叫二叉堆,除了是一顆完整二叉樹外還要保持其堆序性質(zhì).例如最小二叉堆即,最小元在根上,而任意節(jié)點(diǎn)都小于它的所有后裔.
我們通過代碼模擬二叉堆

package com.fredal.structure;public class MyHeap<T extends Comparable<? super T>> {private static final int DEFAULT_CAPACITY=10;private int currentSize;//堆元素?cái)?shù)量private T[] array;//堆數(shù)組public MyHeap(){this(DEFAULT_CAPACITY);}public MyHeap(int capacity){currentSize=0;array=(T[]) new Comparable[capacity+1];}//對(duì)已給定的數(shù)組建堆初始化public MyHeap(T [] items){currentSize=items.length;array=(T[])new Comparable[(currentSize+2)*11/10];int i=1;for(T item:items){array[i++]=item;}buildHeap();}private void buildHeap() {for(int i=currentSize/2;i>0;i--){percolateDown(i);//下濾}}//下濾 保持堆特性private void percolateDown(int i) {int child;T temp =array[i];for(;i*2<=currentSize;i=child){child=i*2;if(child!=currentSize&& array[child+1].compareTo(array[child])<0){child++;}if(array[child].compareTo(temp)<0){array[i]=array[child];}elsebreak;}array[i]=temp;}//插入操作public void insert(T x){if(currentSize==array.length-1){enlargeArray(array.length*2+1);}//上濾操作int i=++currentSize;for(array[0]=x;x.compareTo(array[i/2])<0;i/=2){array[i]=array[i/2];}array[i]=x;}//擴(kuò)容操作private void enlargeArray(int newSize){T[] old=array;array=(T[]) new Comparable[newSize];for(int i=0;i<old.length;i++){array[i]=old[i];}}//刪除最小值public T deleteMin(){if(currentSize==0){throw new RuntimeException();}T min=findMin();array[1]=array[currentSize--];//下濾percolateDown(1);return min;}//尋找最小值public T findMin() {if(currentSize==0){throw new RuntimeException();}return array[1];}//顯示public void show(){for(int i=1;i<=currentSize;i++){System.out.print(array[i]+" ");}}}

堆的應(yīng)用有許多,堆排序是最重要的之一,我們?cè)诤竺鏁?huì)講到.
更多文章與相關(guān)下載請(qǐng)點(diǎn)擊(http://langgengxin.com/2016/01/29/Structure-2/)

posted on 2016-01-14 08:39 fredal 閱讀(...) 評(píng)論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/fredal/p/Structure_2.html

總結(jié)

以上是生活随笔為你收集整理的数据结构_基础结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

国产123av| 久久久精品久久 | 国产国产人免费人成免费视频 | 国产精品入口66mio女同 | 欧美狠狠操 | 夜夜躁天天躁很躁波 | 天天摸日日摸人人看 | 国产看片网站 | 99色精品视频 | www色综合| 91字幕| 免费精品国产 | 国产在线小视频 | 日本在线视频网址 | 成人在线播放av | 国产a级片免费观看 | 欧美在线资源 | 中文字幕网站视频在线 | 久久综合九色九九 | 丁香六月在线观看 | 天天天干天天天操 | 国产在线精品二区 | 在线日韩三级 | 久久综合久色欧美综合狠狠 | 一本一本久久aa综合精品 | 成人小视频在线观看免费 | 五月婷婷黄色网 | 99精品免费久久久久久日本 | 国产精品99视频 | 在线成人小视频 | 免费电影播放 | 99久久久国产精品免费观看 | 久久久久夜色 | 五月婷婷六月综合 | 色综合天天综合在线视频 | 国产一级视屏 | 九九99 | 国产在线精品国自产拍影院 | 91精品国产自产在线观看永久 | 香蕉久草在线 | 精品免费99久久 | 97色在线视频 | 国产精品久久人 | 婷婷免费在线视频 | 国产精品理论片在线播放 | 欧美久久久久久久久 | 久久精品国产免费看久久精品 | 六月婷操 | 国产.精品.日韩.另类.中文.在线.播放 | 免费看片日韩 | 综合色中文 | 亚在线播放中文视频 | 香蕉影院在线观看 | 99看视频在线观看 | 免费的国产精品 | 九九热精品在线 | 中文字幕资源在线观看 | 中文字幕色综合网 | 午夜男人影院 | 欧美日高清视频 | 毛片随便看 | 久久精品一区八戒影视 | www.夜夜夜| 国产xxxx做受性欧美88 | 人人搞人人搞 | 亚洲人精品午夜 | 国产午夜麻豆影院在线观看 | 亚洲精品资源 | 91精品一区二区三区蜜桃 | a√天堂中文在线 | 在线看片日韩 | 91视频网址入口 | 色综合久久久久综合体 | 日韩精品一区二区三区不卡 | 最新av网址大全 | 操操操av | 这里只有精彩视频 | 欧美激情精品久久久久久 | 在线观看av不卡 | 91探花在线视频 | 91热视频在线观看 | 麻豆综合网 | 1000部18岁以下禁看视频 | 美女国产 | www.天天色 | 日韩激情综合 | 在线国产一区二区三区 | 永久免费看av | 四虎永久免费在线观看 | 91久久国产露脸精品国产闺蜜 | 日本中文不卡 | 久久精品网站免费观看 | 天天精品视频 | 亚洲欧美国产日韩在线观看 | 西西4444www大胆视频 | 激情欧美日韩一区二区 | 天天天色 | 欧美片一区二区三区 | 久久激情日本aⅴ | 五月香视频在线观看 | 成人午夜免费剧场 | 天天翘av| 欧美一级片在线 | 五月婷婷久久综合 | 欧美黑吊大战白妞欧美 | 日韩精品首页 | 国产精品自产拍在线观看桃花 | 一级c片 | 色视频网站免费观看 | 五月天六月色 | 制服丝袜在线 | 日韩激情第一页 | 婷婷综合av | 国内精品久久久久影院日本资源 | 国产精品久久久久久久久蜜臀 | 久久久黄色免费网站 | 在线观看日本高清mv视频 | 亚洲久久视频 | 国产成人一区二区三区在线观看 | 在线免费黄色毛片 | 高清av免费看 | 一区二区三区国产欧美 | 天天摸夜夜操 | 天天爱天天干天天爽 | 欧美aaa一级 | 久久久av电影 | 中文字幕超清在线免费 | 在线播放视频一区 | 国产黄在线 | 免费福利在线观看 | av中文字幕免费在线观看 | 一个色综合网站 | 国产精品久久久久久欧美 | 欧美激情视频一区 | 亚洲成aⅴ人片久久青草影院 | 天天干,狠狠干 | 久久久国产一区二区三区 | 人人插人人爱 | 五月激情片| 欧美激情视频一二三区 | 四虎精品成人免费网站 | 就要干b | 国产精品视频app | 日日干夜夜草 | 国产精品门事件 | 亚洲mv大片欧洲mv大片免费 | 黄色免费电影网站 | 国产精品99久久久久的智能播放 | 亚洲国产一区二区精品专区 | 欧美一区中文字幕 | 久久免费视频国产 | 亚洲成人av片 | 黄色影院在线免费观看 | 久久亚洲福利视频 | 欧美视屏一区二区 | 97超碰中文字幕 | 激情综合久久 | 国产在线污 | 免费看一级特黄a大片 | 精品一区电影国产 | 美女黄频| 欧美日bb | 一区二区 久久 | 伊人天堂网 | 97av免费视频 | 欧美日韩在线播放一区 | 国内精品中文字幕 | 一区二区影院 | 香蕉视频导航 | 天天射天天操天天干 | 欧美亚洲一级片 | 久久久久久久久久电影 | 国产婷婷精品av在线 | 日韩国产高清在线 | 日韩中文字幕免费视频 | 99久久精品国产系列 | 精品网站999www| 中文字幕国内精品 | 国产精品久免费的黄网站 | 91资源在线免费观看 | 久久99偷拍视频 | 天天躁日日躁狠狠躁 | 高清不卡一区二区在线 | 久草在在线视频 | 国产一区二三区好的 | 欧美激情精品久久久久久变态 | 成人免费视频网 | 亚洲高清精品在线 | 91xav | 九草视频在线观看 | 日韩免费观看一区二区 | 国产亚洲va综合人人澡精品 | 日韩中字在线观看 | 欧美成人黄色 | 狠狠色狠狠色合久久伊人 | 亚洲精品视频在线看 | 免费成人在线视频网站 | 国产精品免费观看在线 | 日本高清免费中文字幕 | 国产区av在线 | 人人看人人 | 国产成人精品久久久 | 97人人澡人人爽人人模亚洲 | 在线观看视频h | 91一区啪爱嗯打偷拍欧美 | 欧美精品一区二区蜜臀亚洲 | 最新国产精品拍自在线播放 | 香蕉视频免费在线播放 | 欧美性免费 | 色吧久久 | 久久亚洲电影 | 丁香六月婷 | 2021国产在线视频 | 在线观看免费黄色 | 最新精品国产 | 又黄又网站 | 福利片免费看 | 黄色毛片在线观看 | 久久久久久久久久久久久久电影 | 免费成人av电影 | 日本中出在线观看 | 欧美日韩中文另类 | 中文字幕丝袜制服 | 在线网站黄 | 国产精品久久久久永久免费 | 99免费在线视频观看 | 91中文字幕网| 亚洲jizzjizz日本少妇 | 国产在线不卡视频 | www久久99| 97人人模人人爽人人少妇 | 欧美一区二区三区在线观看 | 91精品一区二区在线观看 | 麻豆91在线看 | 97视频中文字幕 | 日韩免费视频观看 | 欧美视频在线观看免费网址 | 久久少妇av | 国产福利不卡视频 | 日韩在线视频观看 | 国产精品久久精品国产 | 久久久久久久久久久网 | 免费三级网 | 成人a在线观看 | 97精品超碰一区二区三区 | 国产日本亚洲高清 | 精品在线免费观看 | 超碰国产在线 | 免费能看的黄色片 | 91精品爽啪蜜夜国产在线播放 | 日本精品视频一区二区 | 一区二区不卡视频在线观看 | 欧美日韩国产一区 | 正在播放亚洲精品 | 日韩伦理一区二区三区av在线 | 欧美日韩亚洲在线 | 91大神dom调教在线观看 | www在线观看视频 | 波多野结衣视频在线 | 91热视频在线观看 | 免费男女网站 | 国产精品网红直播 | 成人在线免费小视频 | 免费观看久久久 | 最新中文字幕视频 | 九色视频网址 | 国产在线传媒 | 国产精品毛片一区视频 | 中文字幕黄色 | 精品国产一区二区三区在线观看 | 国产精品日韩欧美一区二区 | 人人狠 | 亚洲在线视频网站 | 久久影院中文字幕 | www.av中文字幕.com | 久久婷婷影视 | 丁香激情综合久久伊人久久 | 日本资源中文字幕在线 | h动漫中文字幕 | а天堂中文最新一区二区三区 | 国产九九热视频 | 五月婷av| 午夜精品福利影院 | 99久久www免费 | 日韩免费观看一区二区 | 国产精品尤物 | 四月婷婷在线观看 | 国产成人精品国内自产拍免费看 | 国产一区二区午夜 | 一级黄色大片在线观看 | 久久人人爽人人爽人人 | 在线观看av网 | 精品欧美一区二区精品久久 | 日韩欧美成 | 日韩久久精品一区二区 | 一区二区精品久久 | 日韩av资源在线观看 | 亚洲精品永久免费视频 | 久久,天天综合 | 天天色 天天 | 久草视频免费 | 国产视频 久久久 | a视频免费| 在线观看免费国产小视频 | 99热精品国产一区二区在线观看 | 婷色在线 | 激情综合网五月激情 | 一级淫片在线观看 | 五月婷婷一区 | 五月天婷婷视频 | 国内久久视频 | 激情丁香5月 | 久久久久99精品国产片 | 最近中文字幕免费大全 | 欧美一级片在线观看视频 | 99在线观看免费视频精品观看 | 一级做a视频 | 免费在线黄色av | 色综合久久悠悠 | 91精品黄色 | 精品一二区 | 视频福利在线观看 | 欧美超碰在线 | 午夜精品久久久99热福利 | 久久综合久久久 | 日本黄色免费观看 | 久久在线免费观看 | 国产精品一区久久久久 | 久久视频在线观看中文字幕 | 婷婷丁香色综合狠狠色 | 在线观看激情av | 国产精品福利无圣光在线一区 | 久久久 精品| 亚洲国产精品成人综合 | 五月婷婷中文 | 伊人射| 久久精品79国产精品 | 国产中文字幕视频在线观看 | av中文字幕在线看 | 99在线观看视频网站 | 国产不卡av在线播放 | 久久高清片 | 欧美男同网站 | 久久天天操| 久久久久国产成人精品亚洲午夜 | 嫩草91影院 | 国产高清视频在线观看 | www.久草.com | 成人午夜影院在线观看 | 人人干人人草 | 欧美精品久久久久久 | 成人午夜片av在线看 | 亚洲欧美日韩一二三区 | 九月婷婷综合网 | 97精品欧美91久久久久久 | 怡红院成人在线 | 国产视频1 | 成人黄色大片在线观看 | 日韩精品中文字幕在线 | 日韩精品一区不卡 | 亚洲视频播放 | 成人免费看片网址 | 精品久久久久久久久久久久久久久久久久 | 国产成人三级在线 | 天天舔天天搞 | 免费看的黄色的网站 | 麻花豆传媒mv在线观看 | 久久久成人精品 | 国产精品成人免费一区久久羞羞 | 国产精品一区二区三区99 | 国产精品热视频 | 亚洲人成影院在线 | 91看片在线观看 | 一区二区视频在线看 | 亚洲精品视频在线观看免费视频 | 久精品一区 | 九九导航 | 日韩一级片大全 | 激情在线五月天 | 国产亚洲无 | 九九免费在线看完整版 | 在线免费观看视频 | 国产中文字幕视频 | 久久1区| 久久免费av电影 | 久久在线免费观看 | 中文字幕网站 | 天天操网| 在线精品视频免费观看 | 亚洲一区二区视频 | www.日韩免费 | 五月婷婷丁香综合 | 天天操夜夜干 | 天天操天天是 | 亚洲一区二区三区miaa149 | 亚洲第一区在线观看 | 四虎国产精品成人免费影视 | 国产97色 | 成人av一级片 | 美女久久久久久久 | 国产 色| 激情欧美在线观看 | 久久国产精品一区二区 | 天天色天天射综合网 | 国产精品麻豆视频 | 在线免费视频 你懂得 | 久久不见久久见免费影院 | 日韩毛片一区 | 最新av在线播放 | 色吊丝在线永久观看最新版本 | 免费观看全黄做爰大片国产 | 在线看av的网址 | 久久婷婷丁香 | 免费观看黄色12片一级视频 | 亚洲天堂网视频 | 中文字幕日本电影 | 欧美aa在线 | 99久久精品免费看国产四区 | 日本中文字幕电影在线免费观看 | 日韩特黄一级欧美毛片特黄 | 中文字幕在线一区二区三区 | 一区二区免费不卡在线 | 精品国产精品国产偷麻豆 | 婷婷久久一区二区三区 | 日韩精品中文字幕一区二区 | 久久国产亚洲精品 | 久久优 | 国产香蕉97碰碰久久人人 | 4438全国亚洲精品观看视频 | 韩日av一区二区 | 伊人婷婷色 | 亚洲精品乱码久久久久久蜜桃91 | 欧美一区二区在线免费看 | 天天干夜夜操视频 | 国产精品久久99综合免费观看尤物 | 91欧美在线| 日韩欧美在线影院 | 日韩久久精品一区二区三区 | 欧美在线a视频 | 一区二区三区高清在线观看 | 日韩亚洲在线视频 | 免费网站色 | 91精品一区二区三区久久久久久 | 国产色区 | 婷婷六月在线 | 午夜影视一区 | 91色吧 | 国内精品久久久久久久影视麻豆 | 日韩精品久久久久久中文字幕8 | 日韩色在线 | 天天干,夜夜操 | 伊人五月天婷婷 | 日本字幕网 | 国产精久久久 | 热re99久久精品国产99热 | 夜添久久精品亚洲国产精品 | 六月丁香激情综合色啪小说 | 奇米影视8888在线观看大全免费 | 波多野结衣电影一区 | 国产成人av电影在线观看 | 亚洲午夜久久久久久久久电影网 | 天天插天天操天天干 | 欧美日韩国产亚洲乱码字幕 | 在线播放你懂 | 久久免费视频观看 | 九九久久国产精品 | 国产福利精品一区二区 | 欧美小视频在线观看 | 成人三级黄色 | 国内小视频在线观看 | 99视频精品在线 | 99re8这里有精品热视频免费 | 免费一级片在线观看 | 亚洲精品国产区 | 美女网站在线观看 | 一本一本久久a久久精品综合小说 | 久久天堂亚洲 | 91中文字幕在线 | 中文字幕在线观看视频一区二区三区 | 久久99精品国产麻豆宅宅 | 国产成人一区二区三区影院在线 | 婷婷六月激情 | 天天天操操操 | 探花视频在线观看 | 2024国产在线 | 成人亚洲网 | 久久综合久久久久88 | 五月激情av| 狠狠躁日日躁夜夜躁av | 日韩精品一区二区三区在线播放 | 国产精品一区专区欧美日韩 | 日韩av午夜在线观看 | 精品欧美小视频在线观看 | 成人黄大片视频在线观看 | 亚洲激情在线观看 | 日本超碰在线 | 午夜电影中文字幕 | 国产一区福利在线 | 韩国av免费在线观看 | 精品久久久久久久久久久久久久久久久久 | 天天射天天爽 | 麻豆 videos | 婷婷丁香狠狠爱 | 网站免费黄 | 中文一二区 | av动态图片 | 国产精品一区二区三区观看 | 黄色tv视频 | 国产精品毛片一区视频播不卡 | 六月婷婷网 | 国产精品久久久久久久久久久杏吧 | av黄色在线播放 | 欧美精品v国产精品 | 在线激情影院一区 | 免费a级毛片在线看 | 三三级黄色片之日韩 | 天天干天天操天天操 | 国产色女人 | 亚洲理论在线 | 亚洲天堂va | 日韩,中文字幕 | 国产在线观看一区 | 国产精品不卡一区 | 色婷婷综合久久久 | 日韩欧美在线免费 | 天天操天天射天天爽 | 日日碰狠狠躁久久躁综合网 | 丁香五月亚洲综合在线 | 91九色蝌蚪视频 | 欧美精品视 | 黄色小说视频网站 | 最近中文字幕免费大全 | 99国产一区二区三精品乱码 | 特级西西444www大精品视频免费看 | 国内精品久久久久影院优 | 午夜久久福利视频 | 97成人资源站 | 青青草视频精品 | 国产精品成久久久久 | 激情欧美一区二区免费视频 | 日日干网 | 插久久 | 高清不卡免费视频 | 欧美日韩国产一区 | 色老板在线 | 日韩欧美国产成人 | 日韩成人在线一区二区 | 欧美日韩高清一区二区 国产亚洲免费看 | 亚洲高清视频在线 | 成年人在线看片 | 免费在线观看视频一区 | 综合久久综合久久 | 四虎在线观看精品视频 | 99久久99视频只有精品 | 国产精品久久久久久久久久直播 | 国产视频在线一区二区 | www.五月婷婷 | 精品毛片一区二区免费看 | 97人人人人 | 精品亚洲男同gayvideo网站 | 天天操天天操天天操 | 中文字幕在线色 | 亚洲天天做 | 91在线入口 | 成人理论在线观看 | 国产原创在线视频 | 中文亚洲欧美日韩 | 日韩av不卡在线观看 | 国产黑丝一区二区 | 国内精品视频在线播放 | 13日本xxxxxⅹxxx20 | 精品国产一区二区三区不卡 | 精品福利网站 | 中文字幕麻豆 | 91成人网页版 | 久久婷婷国产 | 国产一区自拍视频 | 精品久久久久久久久久岛国gif | 久久久久免费 | 中文字幕国产视频 | 91网站免费观看 | 日韩av高清在线观看 | 国产麻豆视频在线观看 | 亚洲精品视频大全 | 久久tv视频 | 99视频精品视频高清免费 | 日韩毛片在线免费观看 | 成人免费在线播放 | 91传媒在线| 日韩手机视频 | 久久新视频 | 黄色在线看网站 | 伊人伊成久久人综合网站 | 蜜桃视频日韩 | 在线欧美小视频 | 成人午夜片av在线看 | 久久久久麻豆v国产 | 国产一区二区在线视频观看 | 一区二区三区精品在线 | 制服丝袜在线 | 蜜桃视频在线观看一区 | 99视频国产在线 | 国产精品久久在线 | 在线观看免费91 | 亚洲影视九九影院在线观看 | 久久天天躁狠狠躁亚洲综合公司 | 成年人免费看 | 日本黄色黄网站 | 不卡的av | 99热99| 日本高清免费中文字幕 | 久久免费播放 | 国产一级高清视频 | 国产精品一区在线观看你懂的 | 中文在线8新资源库 | 欧美a免费| 一级黄色毛片 | 成人久久18免费网站麻豆 | 一区二区三区免费在线播放 | 黄色av大片 | 91精品久久久久久 | 四虎永久国产精品 | 成x99人av在线www | 久久久久久久久久久影院 | 日本69hd| 在线黄网站 | 国产一线二线三线性视频 | 久久99电影 | 国产日韩欧美精品在线观看 | 欧美精品在线观看一区 | 日韩在线网 | 成人午夜黄色影院 | 精品国产免费久久 | 91精品国产99久久久久久久 | 亚洲精品久久久久999中文字幕 | 视频成人 | 亚洲国产视频网站 | 最近久乱中文字幕 | 黄色特一级片 | 色播亚洲婷婷 | 中文字幕资源网 | 91精品在线视频观看 | 亚洲专区 国产精品 | 日韩网站在线播放 | 色婷婷色 | 狠狠色丁香婷综合久久 | 日本久久视频 | 亚洲精品玖玖玖av在线看 | 日本久久久久久科技有限公司 | 视频在线在亚洲 | 中文av一区二区 | 亚洲电影久久久 | 亚洲最大免费成人网 | 欧美一区二区三区激情视频 | 国产一区二区三区黄 | 丁香婷婷网 | 九九日九九操 | 国产色资源 | 天天操天天综合网 | 亚洲国内精品 | 亚州性色| 中文字幕中文中文字幕 | 日韩精品不卡在线 | 免费看黄在线看 | 在线观看一区视频 | 久久涩涩网站 | 在线最新av | 久久成人精品电影 | 99视频黄 | 伊人午夜视频 | 天堂av官网 | 国产二区视频在线观看 | 久久久国产一区 | 成人h在线观看 | 91精品久久香蕉国产线看观看 | 国产在线国偷精品产拍 | 美女免费视频一区二区 | 美女久久 | 91色欧美| 国产免费亚洲 | 久久黄色免费观看 | 色噜噜在线观看 | 国产区久久 | 日韩黄色在线 | 婷婷在线免费视频 | 人人看看人人 | 992tv在线观看网站 | 成人av免费在线 | 亚洲免费永久精品国产 | 久草在线免费播放 | 国内毛片毛片 | 亚洲高清91 | 91精品伦理| 色爽网站 | 国产精品免费观看在线 | 九九免费视频 | 日日夜夜人人天天 | 久久观看最新视频 | 国产精品一区二区在线观看 | av免费在线播放 | 国产精品麻豆一区二区三区 | 亚洲精品视频在线看 | 亚洲涩涩网 | 九九视频这里只有精品 | 色多视频在线观看 | 国产视频2区 | www.亚洲在线 | 日韩电影在线视频 | 超碰免费97| 中文日韩在线 | 国产人成看黄久久久久久久久 | 国产专区视频在线观看 | 久久久久久久久久电影 | 最新久久免费视频 | 伊人天天操 | 欧美日韩高清不卡 | 日韩高清不卡一区二区三区 | 国产精品99久久免费观看 | 国产 日韩 在线 亚洲 字幕 中文 | 香蕉蜜桃视频 | 97精品在线视频 | 亚洲午夜精品久久久久久久久久久久 | 日韩免费在线观看网站 | 天天曰视频 | 视频1区2区| 国产精品一区二区三区免费看 | 麻豆小视频在线观看 | 日韩影视大全 | 一级黄色免费网站 | 一区二区三区影院 | 欧美激情在线网站 | 婷婷精品在线 | 美女福利视频网 | 国产综合精品一区二区三区 | 91一区啪爱嗯打偷拍欧美 | 成年人在线观看网站 | 久草在线资源视频 | 日韩中文字幕免费在线播放 | 日韩在线观看第一页 | 五月激情久久 | 蜜桃av久久久亚洲精品 | 少妇搡bbbb搡bbb搡aa | 亚洲精品乱码久久久久久蜜桃91 | 亚洲国产成人精品在线观看 | 日本特黄一级片 | av在线免费观看黄 | 人人爽人人爽人人爽人人爽 | 毛片一区二区 | 日韩电影黄色 | 在线免费黄网站 | 91丨九色丨蝌蚪丰满 | 麻豆视频www | 午夜视频在线观看一区二区三区 | 亚洲黑丝少妇 | 九九热免费观看 | 中国一级片免费看 | 狠狠操精品 | 亚洲九九九在线观看 | 国产成人免费av电影 | 911免费视频 | 日韩在线一二三区 | 久久精品男人的天堂 | 麻豆一区在线观看 | 久久手机免费视频 | 日韩高清在线一区 | 欧美日韩国产欧美 | 亚洲成熟女人毛片在线 | 亚洲黄在线观看 | 婷婷色综合色 | 国产精品理论视频 | 欧美韩国在线 | 亚洲欧美国产视频 | 久久国产免费 | 国产成人777777 | 欧美日韩国产精品一区二区 | 中文字幕一区二区三区乱码不卡 | 日韩一级成人av | 色在线高清 | 在线视频1卡二卡三卡 | 69精品久久 | 99精品免费久久久久久久久日本 | 久久久久久久久久网站 | 香蕉视频亚洲 | 91.dizhi永久地址最新 | 久久精品这里热有精品 | 99久久国产免费,99久久国产免费大片 | 天天综合亚洲 | 日韩在线视频免费观看 | 国产在线国偷精品产拍免费yy | 玖玖精品在线 | 成人av片在线观看 | 成年人精品 | 欧美特一级 | 69精品在线观看 | 亚洲三区在线 | 国产热re99久久6国产精品 | 久国产在线播放 | 日韩综合视频在线观看 | 黄色国产高清 | 久久99久国产精品黄毛片入口 | 国产一区网址 | 天天综合人人 | 久久在视频 | 免费色视频网址 | 中文字幕免费高 | 欧美激情精品久久 | 国产无套精品久久久久久 | 超碰在线1 | 色综合天天综合在线视频 | 超碰97人人爱 | 精品久久久网 | 亚洲精品www | 成人网在线免费视频 | 国产精品免费一区二区三区 | 亚洲视频 中文字幕 | 久久久精品视频网站 | 国产h在线播放 | 四虎国产精品免费观看视频优播 | 91精品久久久久久 | 人人草在线观看 | 欧美人zozo| 日韩av一区二区三区在线观看 | 成年人视频在线观看免费 | 日韩毛片在线一区二区毛片 | 日韩欧美成人网 | 日本午夜在线观看 | 国产精品久久久久久久久久久久午夜 | 婷婷亚洲综合五月天小说 | 制服丝袜成人在线 | 色婷婷色 | www.av在线.com | av看片在线 | 伊人亚洲综合网 | 午夜影院日本 | 亚洲精品国产欧美在线观看 | 国产视频1 | 欧美一级免费 | 国产一区二区在线影院 | 亚洲综合成人专区片 | 亚洲精品视频网站在线观看 | 一级片免费观看 | 少妇视频在线播放 | 久久久久免费 | 久久这里只精品 | 久久国产精品99久久久久久进口 | 亚洲 欧洲 国产 日本 综合 | 激情五月婷婷激情 | 91在线播放综合 | 欧美成人精品欧美一级乱 | 中文av免费| 欧美最爽乱淫视频播放 | 视频91| 一区二区三区中文字幕在线观看 | 91x色| 国产女做a爱免费视频 | av中文字幕免费在线观看 | 中文字幕专区高清在线观看 | 国产精品一区二区无线 | 国产精品永久免费在线 | 免费日韩电影 | 激情大尺度视频 | 亚洲精品高清在线观看 | 91tv国产成人福利 | 亚洲综合射 | 黄色com | 欧美一级高清片 | 久久亚洲精品国产亚洲老地址 | 黄色三级网站在线观看 | 国产亚洲婷婷 | 国产高清在线免费视频 | 91热爆视频 | 国产亚洲精品久久久久久久久久久久 | 中文字幕在线观看播放 | 日韩视频免费 | 国产一区二区久久 | 亚洲 中文字幕av | 精品久久久久久综合日本 | 久久黄色片子 | 国产又黄又爽无遮挡 | 免费在线看成人av | 免费国产黄线在线观看视频 | 国内小视频在线观看 | 色五月成人 | 欧美成人精品在线 | 欧美日韩国产二区三区 | av午夜电影 | 久久久久久毛片精品免费不卡 | 中文字幕在线观看网址 | 亚洲精品视频网址 | 日韩午夜在线观看 | 国产精品永久 | av官网| 四虎成人精品永久免费av九九 | aav在线 | 97超碰资源总站 | 久久视频免费看 | 在线观看视频日韩 | 欧美福利在线播放 | 日日干美女 | 9ⅰ精品久久久久久久久中文字幕 | 国产不卡一二三区 | 国产中文字幕国产 | 成人精品国产免费网站 | 久久天天躁狠狠躁亚洲综合公司 | 欧美激情综合网 | 国产精品女主播一区二区三区 | 久久久精品一区二区三区 | 91在线资源| 午夜在线看 | 日狠狠 | 亚洲国产中文字幕在线视频综合 | 成人h视频 | 成人av在线网 | 精品欧美一区二区三区久久久 | 91精品国产成人 | 国产一区二区三区免费在线观看 | 久久久久久久久久久久久久免费看 | www.xxxx变态.com | 特级西西444www高清大视频 | 五月婷社区 | 国产五月婷婷 | 中文字幕久久精品 | 国产精品久久久久久超碰 | 国产视频在线观看一区 | 色播五月婷婷 | 97国产精品亚洲精品 | 中文字幕成人av | 97成人在线 | 久久免费视频在线观看30 | 欧美激情综合色综合啪啪五月 | 99精品免费久久久久久久久日本 | 久久国产日韩 | 美女视频久久黄 | 国产午夜精品一区 | 成人免费色 | 国产96在线 | 黄色www免费| 99成人免费视频 | 成人小视频在线 | 日韩精品免费在线观看视频 | www.天天色.com | 国产国产人免费人成免费视频 | 久久久黄视频 | 超碰人在线| 亚洲精品国产免费 | 国产很黄很色的视频 | 天天综合五月天 | 91在线看黄 | 精品在线亚洲视频 | 黄色精品在线看 | 最近最新中文字幕视频 | 国产成人精品女人久久久 | 国产精品欧美久久 | 婷婷午夜 | 色婷婷久久一区二区 | 9797在线看片亚洲精品 | 日韩精品一区二区在线视频 | 在线视频99 | 免费福利视频网 | 最近在线中文字幕 | 五月天婷婷在线观看视频 | 免费观看www小视频的软件 | 91视频在线免费下载 | 免费观看成年人视频 | 外国av网| 久久久久久高潮国产精品视 | 中文字幕在线观看免费高清完整版 | 婷婷精品进入 | 四虎成人精品永久免费av | 在线播放91 | 91视频高清免费 | 国产精品18久久久久久久网站 | 天海冀一区二区三区 | 日韩动漫免费观看高清完整版在线观看 | 久草免费色站 | 国产精品入口a级 | 免费成人在线观看 | 亚洲黄色网络 | 久久免费视频这里只有精品 | 国产精品美女免费视频 | 国产精品三级视频 | 国产精品视频区 | 亚洲欧美成人 | www.五月天色 | 在线观看深夜视频 | 欧美中文字幕久久 | 一级一级一片免费 | 日韩av男人的天堂 | 日韩黄视频 | 国产高清免费 | 综合久久网 | 国产成人一区二区三区在线观看 | 伊人手机在线 | 亚洲专区路线二 | 激情综合交 | 国产香蕉久久精品综合网 | 久草在线免费电影 | 欧美日韩亚洲国产一区 |