色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

堆的實(shí)現(xiàn)思路

科技綠洲 ? 來源:指尖動聽知識庫 ? 作者:指尖動聽知識庫 ? 2023-11-24 16:02 ? 次閱讀

什么是堆?

  • 堆是一種 基于樹結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu),它是一棵二叉樹 ,具有以下兩個特點(diǎn):
  • 堆是一個完全二叉樹,即除了最后一層,其他層都是滿的,最后一層從左到右填滿。
  • 堆中每個節(jié)點(diǎn)都滿足堆的特性,即父節(jié)點(diǎn)的值要么等于或者大于(小于)子節(jié)點(diǎn)的值。

1.1 堆的分類

堆一般分為兩類: 大堆和小堆

  • 大堆中,父節(jié)點(diǎn)的值大于或等于子節(jié)點(diǎn)的值,
  • 小堆中,父節(jié)點(diǎn)的值小于或等于子節(jié)點(diǎn)的值。

堆的主要應(yīng)用是在排序和優(yōu)先隊列中。

以下分別為兩個堆(左大堆,右小堆):

圖片


Part2 堆的實(shí)現(xiàn)思路

2.1 使用什么實(shí)現(xiàn)?

圖片

邏輯結(jié)構(gòu)如上, 然而這僅僅是我們想像出來的而已,而實(shí)際上的堆的物理結(jié)構(gòu)是一個完全二叉樹 通常是 用數(shù)組實(shí)現(xiàn)的 。如下:

圖片

對此,這就要引申出一個問題?我們該如何分辨父節(jié)點(diǎn)以及子節(jié)點(diǎn)呢?如下:

2.2 怎么分辨父節(jié)點(diǎn)以及子節(jié)點(diǎn)?

通常我們的數(shù)組下標(biāo)為“0”處即為根節(jié)點(diǎn),也就是說我們一定知道一個父節(jié)點(diǎn)!并且我們也有“計算公式”來計算父節(jié)點(diǎn)以及子節(jié)點(diǎn)。(先記住,后面實(shí)現(xiàn)有用!!!)也就是說我們也可以通過公式從每一個位置計算父節(jié)點(diǎn)以及子節(jié)點(diǎn)!如下:

圖片

圖片

圖片

2.3 總體實(shí)現(xiàn)思路

先建立一個結(jié)構(gòu)體,由于堆的結(jié)構(gòu)實(shí)際上是一顆完全二叉樹,因此我們的 結(jié)構(gòu)跟二叉樹一樣即可! 接著,想想我們的堆需要實(shí)現(xiàn)的功能? 構(gòu)建、銷毀、插入、刪除、取堆頂?shù)臄?shù)據(jù)、取數(shù)據(jù)個數(shù)、判空 。(⊙o⊙)…基本的就這些吧哈~

接著按照 定義函數(shù)接口->實(shí)現(xiàn)各個函數(shù)功能->測試測試->收工(-_^) o(  ̄▽ ̄ )ブ

Part3** 堆的實(shí)現(xiàn)**

3.1 結(jié)構(gòu)體以及接口的實(shí)現(xiàn)

typedefint HPDataType;

typedefstruct Heap
{
	HPDataType* _a;
	int _size;
	int _capacity;
}Heap;

// 堆的構(gòu)建
void HeapCreate(Heap* hp, HPDataType* a, int n);
// 堆的銷毀
void HeapDestory(Heap* hp);
// 堆的插入
void HeapPush(Heap* hp, HPDataType x);
// 堆的刪除
void HeapPop(Heap* hp);
// 取堆頂?shù)臄?shù)據(jù)
HPDataType HeapTop(Heap* hp);
// 堆的數(shù)據(jù)個數(shù)
int HeapSize(Heap* hp);
// 堆的判空
int HeapEmpty(Heap* hp);

3.2 堆的兩種建堆方式

在實(shí)現(xiàn)以上的接口之前,我們必須要知道堆的兩種建堆方式!!!

并且僅僅通過調(diào)整建堆方式的<和>符號,我們就可以輕易控制大小堆,具體看代碼注釋!

建堆有兩種方式,分別是 自底向上建堆以及自頂向下建堆。 具體簡介如下:

  1. 自底向上建堆:自底向上建堆是指按照原始數(shù)組順序依次插入元素,然后對每個插入的元素執(zhí)行向上調(diào)整的操作,使得堆的性質(zhì)保持不變。這種方法需要對每個元素都進(jìn)行調(diào)整操作,時間復(fù)雜度為 O(nlogn)。
  2. 自頂向下建堆:自頂向下建堆是指從堆頂開始,對每個節(jié)點(diǎn)執(zhí)行向下調(diào)整操作,使得堆的性質(zhì)保持不變。這種方法需要從根節(jié)點(diǎn)開始遞歸向下調(diào)整,時間復(fù)雜度為 O(n)。因此,自頂向下建堆的效率比自底向上建堆要高。

以上兩種建堆方式,實(shí)際上是基于兩種調(diào)整方法,接下來將詳細(xì)介紹:

向上調(diào)整方法

堆的向上調(diào)整方法將新插入的節(jié)點(diǎn)從下往上逐層比較,如果當(dāng)前節(jié)點(diǎn)比其父節(jié)點(diǎn)大(或小,根據(jù)是大根堆還是小根堆),則交換這兩個節(jié)點(diǎn)。一直向上比較,直到不需要交換為止。這樣可以保證堆的性質(zhì)不變。

具體步驟如下:

  • 將新插入的節(jié)點(diǎn)插入到堆的最后一位。
  • 獲取該節(jié)點(diǎn)的父節(jié)點(diǎn)的位置,比較該節(jié)點(diǎn)與其父節(jié)點(diǎn)的大小關(guān)系。
  • 如果該節(jié)點(diǎn)比其父節(jié)點(diǎn)大(或小,根據(jù)是大根堆還是小根堆),則交換這兩個節(jié)點(diǎn)。
  • 重復(fù)步驟2-3,直到不需要交換為止,堆的向上調(diào)整完成。
  • 堆的向上調(diào)整的時間復(fù)雜度為O(logn),其中n為堆的大小。

一圖讓你了解~:

圖片

實(shí)現(xiàn)如下:

void swap(HPDataType* s1, HPDataType* s2)
{
	HPDataType temp = *s1;
	*s1 = *s2;
	*s2 = temp;
}

void Adjustup(HPDataType* a, int child)//向上調(diào)整
{
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[child] > a[parent])//建大堆,小堆則< 
		{
			swap(&a[child], &a[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}

	}
}
向下調(diào)整方法

堆的向下調(diào)整方法是指將某個節(jié)點(diǎn)的值下放至其子節(jié)點(diǎn)中,以維護(hù)堆的性質(zhì)的過程。

假設(shè)當(dāng)前節(jié)點(diǎn)為 i,其左子節(jié)點(diǎn)為 2i+1,右子節(jié)點(diǎn)為 2i+2,堆的大小為 n

則向下調(diào)整的步驟如下

  • 從當(dāng)前節(jié)點(diǎn) i 開始,將其與其左右子節(jié)點(diǎn)中較小或較大的節(jié)點(diǎn)比較,找出其中最小或最大的節(jié)點(diǎn) j。
  • 如果節(jié)點(diǎn) i 小于等于(或大于等于,取決于是最小堆還是最大堆)節(jié)點(diǎn) j,則說明它已經(jīng)滿足堆的性質(zhì),調(diào)整結(jié)束;否則,將節(jié)點(diǎn) i 與節(jié)點(diǎn) j 交換位置,并將當(dāng)前節(jié)點(diǎn) i 更新為 j。
  • 重復(fù)執(zhí)行步驟 1 和步驟 2,直到節(jié)點(diǎn) i 沒有子節(jié)點(diǎn)或已經(jīng)滿足堆的性質(zhì)。

一圖讓你了解~:

圖片

實(shí)現(xiàn)如下:

void swap(HPDataType* s1, HPDataType* s2)
{
	HPDataType temp = *s1;
	*s1 = *s2;
	*s2 = temp;
}

void Adjustdown(HPDataType* a, int n, int parent)//向下調(diào)整
{
	int child = parent * 2 + 1;

	while (child < n)
	{
		if (child + 1 < n && a[child + 1] > a[child])//找出兩個孩子中較大的那個,此為大堆,如果要實(shí)現(xiàn)小堆則 改 >
		{
			++child;
		}

		if (a[child] > a[parent])//此為大堆,如果要實(shí)現(xiàn)小堆則 改 >
		{
			swap(&a[child], &a[parent]);

			parent = child;
			child = parent * 2 + 1;

		}
		else
		{
			break;
		}
	}
}

3.3 堆的構(gòu)建

void HeapCreate(Heap* hp, HPDataType* a, int n)
{
	assert(hp);
	assert(a);

	hp- >_a = (HPDataType*)malloc(sizeof(HPDataType) * n);
	if (!hp- >_a)
	{
		perror("malloc fail");
		exit(-1);
	}

	hp- >_capacity = hp- >_size = n;

	//將a中的元素全部轉(zhuǎn)移到堆中
	memcpy(hp- >_a, a, sizeof(HPDataType) * n);

	//建堆
	for (int i = 1; i < n; i++)
	{
		Adjustup(hp- >_a, i);//按向上調(diào)整,此建立大堆
	}

}

本文的構(gòu)建方法是 通過傳遞一個數(shù)組以及傳遞一個數(shù)組大小來構(gòu)建的 ,里面包括了堆結(jié)構(gòu)體的初始化操作,基本的建堆方式則是通過向上調(diào)整方法建堆。


3.4 堆的銷毀

void HeapDestory(Heap* hp)
{
	assert(hp);
	free(hp- >_a);
	hp- >_a = NULL;

	hp- >_capacity = hp- >_size = 0;
}

就正常的銷毀操作?大家應(yīng)該都懂(確信) (o°ω°o)


3.5 堆的插入

void HeapPush(Heap* hp, HPDataType x)
{
	assert(hp);

	if (hp- >_capacity == hp- >_size)//擴(kuò)容
	{
		int newcapacity = hp- >_capacity == 0 ? 4 : hp- >_capacity * 2;
		HPDataType* new = (HPDataType*)realloc(hp- >_a, sizeof(HPDataType) * newcapacity);
		if (!new)
		{
			perror("realloc fail");
			exit(-1);
		}

		hp- >_a = new;
		hp- >_capacity = newcapacity;
	}

	hp- >_a[hp- >_size++] = x;

	Adjustup(hp- >_a, hp- >_size - 1);

}

實(shí)現(xiàn)是對于堆的空間進(jìn)行判斷,不夠則是擴(kuò)容操作,當(dāng)然也有初始化的意思,接著是通過向上調(diào)整的方式插入操作。


3.6 堆的刪除(較重要)

void HeapPop(Heap* hp)//先將最后一個數(shù)與堆頂交換,然后再讓size--,再進(jìn)行向下調(diào)整
{
	assert(hp);

	swap(&hp- >_a[0], &hp- >_a[hp- >_size - 1]);
	hp- >_size--;

	Adjustdown(hp- >_a, hp- >_size, 0);

}

進(jìn)行刪除操作,我們當(dāng)然是刪除堆頂啦,這個刪除操作先將最后一個數(shù)與堆頂交換,然后再讓size--,再進(jìn)行向下調(diào)整。

一圖讓你了解~:

圖片


3.7 取堆頂?shù)臄?shù)據(jù)

HPDataType HeapTop(Heap* hp)//取堆頂
{
	assert(hp);
	assert(hp- >_size > 0);

	return hp- >_a[0];
}

3.8 堆的數(shù)據(jù)個數(shù)

int HeapSize(Heap* hp)//堆大小
{
	assert(hp);

	return hp- >_size;
}

3.9 堆的判空

int HeapEmpty(Heap* hp)//判堆空
{
	assert(hp);

	return hp- >_size==0;
}

Part4 總體代碼

4.1pile.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 01
#include< stdio.h >
#include< stdlib.h >
#include< string.h >
#include< assert.h >

typedefint HPDataType;

typedefstruct Heap
{
	HPDataType* _a;
	int _size;
	int _capacity;
}Heap;

// 堆的構(gòu)建
void HeapCreate(Heap* hp, HPDataType* a, int n);
// 堆的銷毀
void HeapDestory(Heap* hp);
// 堆的插入
void HeapPush(Heap* hp, HPDataType x);
// 堆的刪除
void HeapPop(Heap* hp);
// 取堆頂?shù)臄?shù)據(jù)
HPDataType HeapTop(Heap* hp);
// 堆的數(shù)據(jù)個數(shù)
int HeapSize(Heap* hp);
// 堆的判空
int HeapEmpty(Heap* hp);

4.2pile.c

#include"pile.h"


void swap(HPDataType* s1, HPDataType* s2)
{
	HPDataType temp = *s1;
	*s1 = *s2;
	*s2 = temp;
}

void Adjustup(HPDataType* a, int child)//向上調(diào)整
{
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[child] > a[parent])//建大堆,小堆則< 
		{
			swap(&a[child], &a[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}

	}
}

void Adjustdown(HPDataType* a, int n, int parent)//向下調(diào)整
{
	int child = parent * 2 + 1;

	while (child < n)
	{
		if (child + 1 < n && a[child + 1] > a[child])//找出兩個孩子中較大的那個,此為大堆,如果要實(shí)現(xiàn)小堆則 改 >
		{
			++child;
		}

		if (a[child] > a[parent])//此為大堆,如果要實(shí)現(xiàn)小堆則 改 >
		{
			swap(&a[child], &a[parent]);

			parent = child;
			child = parent * 2 + 1;

		}
		else
		{
			break;
		}
	}
}


void HeapCreate(Heap* hp, HPDataType* a, int n)
{
	assert(hp);
	assert(a);

	hp- >_a = (HPDataType*)malloc(sizeof(HPDataType) * n);
	if (!hp- >_a)
	{
		perror("malloc fail");
		exit(-1);
	}

	hp- >_capacity = hp- >_size = n;

	//將a中的元素全部轉(zhuǎn)移到堆中
	memcpy(hp- >_a, a, sizeof(HPDataType) * n);

	//建堆
	for (int i = 1; i < n; i++)
	{
		Adjustup(hp- >_a, i);//按向上調(diào)整,此建立大堆
	}

}

void HeapDestory(Heap* hp)
{
	assert(hp);
	free(hp- >_a);
	hp- >_a = NULL;

	hp- >_capacity = hp- >_size = 0;
}

void HeapPush(Heap* hp, HPDataType x)
{
	assert(hp);

	if (hp- >_capacity == hp- >_size)//擴(kuò)容
	{
		int newcapacity = hp- >_capacity == 0 ? 4 : hp- >_capacity * 2;
		HPDataType* new = (HPDataType*)realloc(hp- >_a, sizeof(HPDataType) * newcapacity);
		if (!new)
		{
			perror("realloc fail");
			exit(-1);
		}

		hp- >_a = new;
		hp- >_capacity = newcapacity;
	}

	hp- >_a[hp- >_size++] = x;

	Adjustup(hp- >_a, hp- >_size - 1);

}

void HeapPop(Heap* hp)//先將最后一個數(shù)與堆頂交換,然后再讓size--,再進(jìn)行向下調(diào)整
{
	assert(hp);

	swap(&hp- >_a[0], &hp- >_a[hp- >_size - 1]);
	hp- >_size--;

	Adjustdown(hp- >_a, hp- >_size, 0);

}

HPDataType HeapTop(Heap* hp)//取堆頂
{
	assert(hp);
	assert(hp- >_size > 0);

	return hp- >_a[0];
}

int HeapSize(Heap* hp)//堆大小
{
	assert(hp);

	return hp- >_size;
}

int HeapEmpty(Heap* hp)//判堆空
{
	assert(hp);

	return hp- >_size==0;
}

4.3test.c

#include"pile.h"


void test()
{
	Heap hp;
	int arr[] = { 1,6,2,3,4,7,5 };
	HeapCreate(&hp, arr, sizeof(arr) / sizeof(arr[0]));
	//HeapPush(&hp, 10);
	printf("%dn", HeapSize(&hp));
	while (!HeapEmpty(&hp))
	{
		printf("%d %d n", HeapTop(&hp), HeapSize(&hp));
		HeapPop(&hp);
	}

	printf("%dn", HeapSize(&hp));
	HeapDestory(&hp);
	
	HeapSort(arr, sizeof(arr) / sizeof(arr[0]));

	printf("n");
}

int main()
{
	test();
	return0;
}

4.4 測試結(jié)果

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8575

    瀏覽量

    151021
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40123
  • 元素
    +關(guān)注

    關(guān)注

    0

    文章

    47

    瀏覽量

    8429
  • 二叉樹
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    12324
收藏 人收藏

    評論

    相關(guān)推薦

    怎樣自動實(shí)現(xiàn)把一東西一個一個挪到另一個位置?

    怎樣自動實(shí)現(xiàn)把一東西一個一個挪到另一個位置,求大神們給點(diǎn)思路
    發(fā)表于 04-06 10:16

    煤傳感器的工作原理是什么?

    煤傳感器正常時煤位傳感器輸出端“煤”輸出高電平,當(dāng)煤位增高推移傳感器偏轉(zhuǎn)一定角度時,其內(nèi)萬向接點(diǎn)導(dǎo)通, “煤”輸出低電平,“滿煤”指示燈亮,經(jīng)短暫延時,主機(jī)執(zhí)行繼電器釋放,實(shí)現(xiàn)
    發(fā)表于 03-31 09:00

    iOS如何抽獎輪盤效果實(shí)現(xiàn)思路

    iOS 抽獎輪盤效果實(shí)現(xiàn)思路
    發(fā)表于 04-28 07:19

    如何使用鏈接腳本刪除分配?

    的 heap_symbol),這對我來說會更好,因?yàn)榉駝t這個符號會得到它的地址,并且可以使用它的地址覆蓋內(nèi)存。我的問題是,當(dāng)我只是丟棄它時,我得到了期望此引用的 gcc 文件 (_cr_sbrk.c) 的引用錯誤。我想尋求幫助來實(shí)現(xiàn)我的目標(biāo),即安全地從鏈接器中刪除分配
    發(fā)表于 03-23 07:05

    整流,什么是整流

    整流,什么是整流的檢測 1. 全橋的檢測 大多數(shù)的整流全橋上,均標(biāo)注有“+”、“-”、“~”符號(其中“+”為整流后輸出電壓
    發(fā)表于 02-27 10:46 ?2141次閱讀

    常用橋及半橋電路結(jié)構(gòu)分析

    及半橋都是整流二極管的組合器件,這一點(diǎn)可以從它們的結(jié)構(gòu)中看出。在許多電源電路中使用橋或半橋構(gòu)成整流電路。
    發(fā)表于 08-26 10:34 ?8703次閱讀
    常用橋<b class='flag-5'>堆</b>及半橋<b class='flag-5'>堆</b>電路結(jié)構(gòu)分析

    的應(yīng)用:堆排序和優(yōu)先隊列

    (Heap))是一種重要的數(shù)據(jù)結(jié)構(gòu),是實(shí)現(xiàn)優(yōu)先隊列(Priority Queues)首選的數(shù)據(jù)結(jié)構(gòu)。
    的頭像 發(fā)表于 03-16 11:32 ?3763次閱讀
    <b class='flag-5'>堆</b>和<b class='flag-5'>堆</b>的應(yīng)用:堆排序和優(yōu)先隊列

    串口WiFi模塊實(shí)現(xiàn)遠(yuǎn)程控制電飯煲的設(shè)計思路分享.pdf

    分享一個串口WiFi模塊實(shí)現(xiàn)遠(yuǎn)程控制電飯煲的設(shè)計思路,通過串口wifi模塊可以在手機(jī)app上遠(yuǎn)程操控電飯煲,相比定時的效果更好!
    發(fā)表于 04-26 16:57 ?76次下載

    什么是內(nèi)存?內(nèi)存是如何分配的?

    在一般的編譯系統(tǒng)中,內(nèi)存的分配方向和棧內(nèi)存是相反的。當(dāng)棧內(nèi)存從高地址向低地址增長的時候,內(nèi)存從低地址向高地址分配。
    的頭像 發(fā)表于 07-05 17:58 ?9973次閱讀

    實(shí)現(xiàn)完全 MCU 分區(qū)隔離:

    曾幾何時,嵌入式系統(tǒng)非常簡單以至于很少使用。然而,從那時起,復(fù)雜性增長得如此之快,以至于大多數(shù)嵌入式系統(tǒng),甚至是實(shí)時操作系統(tǒng),現(xiàn)在都使用。如果只有一個在使用,效率就不是什么大問
    發(fā)表于 11-26 15:21 ?20次下載
    <b class='flag-5'>實(shí)現(xiàn)</b>完全 MCU 分區(qū)隔離:<b class='flag-5'>堆</b>

    STL中的算法該如何使用呢?

    了解過數(shù)據(jù)結(jié)構(gòu)的人,應(yīng)該對結(jié)構(gòu)不陌生,的底層是使用數(shù)組來實(shí)現(xiàn)的,但卻保持了二叉樹的特性。
    的頭像 發(fā)表于 04-19 16:42 ?1119次閱讀

    的作用是什么?橋整流后電壓是多少?

    的作用及工作原理解讀 橋的作用是什么?橋整流后電壓是多少?? 橋是一種常用的電路,廣泛應(yīng)用于電力電子系統(tǒng)中。橋是一種全波整流電路
    的頭像 發(fā)表于 08-24 15:17 ?7915次閱讀

    UVC bulk傳輸實(shí)現(xiàn)思路

    前段時間有個讀者咨詢UVC bulk 傳輸實(shí)現(xiàn),接著這個機(jī)會重新梳理一遍UVC bulk 傳輸實(shí)現(xiàn)思路,同時對比ISO 與 Bulk 實(shí)現(xiàn)不同。
    的頭像 發(fā)表于 09-25 10:00 ?5112次閱讀
    UVC bulk傳輸<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>思路</b>

    智慧礦山&amp;礦山安全生產(chǎn):AI智能料檢測-打造高效井下料管理系統(tǒng)

    通過AI算法實(shí)現(xiàn)井下料檢測,并打造智能料管理系統(tǒng),提高料效率。
    的頭像 發(fā)表于 10-16 15:06 ?659次閱讀

    如何使用SystemView的監(jiān)控功能

    SystemView能夠監(jiān)視應(yīng)用程序如何使用動態(tài)存儲。這意味著,如果應(yīng)用程序中使用了C或C++、自定義或RTOS提供的內(nèi)存池對象,我們可以跟蹤這些對象的使用情況。SystemView可以在一個
    的頭像 發(fā)表于 08-09 18:07 ?792次閱讀
    如何使用SystemView的<b class='flag-5'>堆</b>監(jiān)控功能
    主站蜘蛛池模板: 波多野结衣教师系列6| 国产精品JIZZ视频免费| 国产电影三级午夜a影院| 寂寞少妇直播| 欧美亚洲日韩一道免费观看| 性色AV乱码一区二区三区视频| 樱桃视频影院在线播放| 高清mv视频免费观看| 久久麻豆亚洲AV成人无码国产| 日韩高清在线亚洲专区| 一本道高清无码v| 国产69精品9999XXXX| 久久人人玩人妻潮喷内射人人| 日本美国群交P片内射捆绑| 夜月视频直播免费观看| 俄罗斯XBXBXB兽交| 久久偷拍人| 亚欧洲乱码视频一二三区| 99视频在线观看视频| 黄色免费网址在线观看| 色男人综合| 99re久久热最新地址一| 黑人操白逼| 兽皇VIDEO另类HD| 99精品国产高清自在线看超| 含羞草在线免费观看| 日本美国群交P片内射捆绑| 777精品久无码人妻蜜桃| 国偷自产视频一区二区99| 日本高清免费看| 自拍偷拍12p| 黑吊大战白xxxxxx| 无修肉动漫在线观看影片| V8成品人视频| 美女挑战50厘米长的黑人| 亚洲精品久久久久69影院| 国产成人精品综合在线观看| 嗯啊快拔出来我是你老师视频| 樱花草在线观看影院| 黑人特黄AA完整性大片| 午夜插插插|