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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

堆的C语言实现——堆与堆排序(二)

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆的C语言实现——堆与堆排序(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

堆的C語言實現——堆與堆排序(二)

  • 堆的C語言實現——堆與堆排序(二)
    • 頭文件
    • 初始化函數
    • 下濾函數1(遞歸)
    • 堆構造函數1(自底向上,遞歸)
    • 下濾函數2(非遞歸,交換法)
    • 下濾函數3(非遞歸,空穴法)
    • 堆構造函數2(自底向上,非遞歸,空穴法)
    • 自頂向下堆構造
    • 插入函數1(交換法)
    • 插入函數2(空穴法)
    • 堆構造函數3(自頂向下,空穴法)
    • 刪除最大鍵函數
    • 完整的代碼及運行截圖

上一篇博文 堆與堆排序(一)介紹了什么是堆、堆的性質、堆的構造。這篇博文我們以大根堆為例,討論堆的C語言實現。完整的代碼會附在本文末尾。

頭文件

#ifndef _MAX_HEAP_ #define _MAX_HEAP_#define MAX_HEAP_SENTINEL 100 #define MIN_PQ_CAPACITY 3 #define HEAP_CAPACITY 20#define LEFT(i) (2*i) #define RIGHT(i) (2*i+1) #define PARENT(i) (i/2)typedef int element_t;struct heap_struct {int capacity;int size;element_t *elements; };typedef struct heap_struct *priority_queue;void print_array(int a[], int len); void print_heap(priority_queue heap);// 基于空穴法的下濾函數(非遞歸) void percolate_down_no_swap(int a[], int n, int t);// 基于遞歸的下濾函數(交換法) void percolate_down_recursive(int a[], int n, int t);// 基于交換法的下濾函數(非遞歸) void percolate_down(int a[], int n, int t);priority_queue initialize(int capacity);//優先隊列初始化// 基于空穴法的插入 void insert_no_swap(element_t x, priority_queue max_heap); void insert(element_t x, priority_queue max_heap); //基于交換法的插入 int is_full(priority_queue max_heap); int is_empty(priority_queue max_heap); element_t delete_max(priority_queue max_heap); // 刪除最大節點// 自底向上的堆構造(遞歸),調用了函數 percolate_down_recursive priority_queue build_max_heap_bottom_up_recursive(element_t a[], int elmt_cnt); // 自底向上的堆構造(非遞歸),調用了函數 percolate_down_no_swap priority_queue build_max_heap_bottom_up(element_t a[], int elmt_cnt); // 自頂向下的堆構造(非遞歸),調用了函數 insert_no_swap priority_queue build_max_heap_up_bottom(element_t a[], int elmt_cnt); // 自頂向下的堆構造(非遞歸),調用了函數 insert priority_queue build_max_heap_up_bottom2(element_t a[], int elmt_cnt);void destroy(priority_queue heap); // 用來釋放內存 #endif

第4行:#define MAX_HEAP_SENTINEL 100

在上一篇博文中說過,可以用數組來實現堆。方法是用從上到下、從左到右的方式來記錄堆的元素。為了方便起見,可以在這種數組從 1 到 n 的位置上存放堆的元素,留下H[0],要么讓它空著,要么在其中放一個限位器,它的值大于堆中任何一個元素。 所以我們定義了一個限位器 MAX_HEAP_SENTINEL,假設最大堆的任何一個元素都小于100.

14~19行:定義了一個結構體struct heap_struct

struct heap_struct {int capacity;int size;element_t *elements; };

capacity表示堆的容量,也就是說節點個數最多就是 capacity,不能再多了。

size表示當前堆的大小,即當前這個堆有多少個節點。

elements是一個指針,指向數組的第一個元素(在初始化函數中會體現這一點)。

初始化函數

priority_queue initialize(int capacity) {priority_queue heap;if(capacity < MIN_PQ_CAPACITY){printf("Priority queue capacity is too small\n");exit(EXIT_FAILURE);}heap = malloc( sizeof(struct heap_struct));if(heap == NULL){printf("out of space\n");exit(EXIT_FAILURE);}// +1 是因為要包含[0]heap->elements = malloc( (capacity + 1) * sizeof(element_t) );if(heap->elements == NULL){printf("out of space\n");exit(EXIT_FAILURE);}heap->capacity = capacity;heap->size = 0; #ifdef MAX_HEAP_SENTINEL// MAX_HEAP_SENTINEL 大于任何一個節點值,作為標記heap->elements[0] = MAX_HEAP_SENTINEL; #endifreturn heap; }

第11行:為結構體分配內存 heap = malloc( sizeof(struct heap_struct));

第19行:為數組分配內存 heap->elements = malloc( (capacity + 1) * sizeof(element_t) );

第27行:heap->size = 0;

初始化狀態,堆的元素數為0,即堆為空。

下濾函數1(遞歸)

// 下濾函數(遞歸解法) // 假定以 LEFT(t) 和 RIGHT(t) 為根的子樹都已經是大根堆 // 調整以 t 為根的子樹,使之成為大根堆。 // 節點位置為 1~n,a[0]不使用 void percolate_down_recursive(int a[], int n, int t) { #ifdef PRINT_PROCEDUREprintf("check %d\n", t); #endifint left = LEFT(t);int right = RIGHT(t); int max = t; //假設當前節點的鍵值最大if(left <= n) // 說明t有左孩子 {max = a[left] > a[max] ? left : max;}if(right <= n) // 說明t有右孩子 {max = a[right] > a[max] ? right : max;}if(max != t){ swap(a + max, a + t); // 交換t和它的某個孩子,即t下移一層 #ifdef PRINT_PROCEDUREprintf("%d NOT satisfied, swap it and %d \n",t, max); #endifpercolate_down_recursive(a, n, max); // 遞歸,繼續考察t} }

上一篇博文已經說了,對于自底向上構造堆,基本思想如下:

  • 在初始化一棵包含 n 個節點的完全二叉樹時,按照給定的順序來放置鍵;
  • 按照下面的方法,對樹進行“堆化”
  • 從最后一個父母節點開始,到根為止,該算法檢查這些節點的鍵是否滿足父母優勢的要求。如果該節點不滿足,就把該節點的鍵 K 和它子女的最大鍵進行交換,然后再檢查在新的位置上,K 是否滿足父母優勢要求。這個過程一直繼續到對 K 的父母優勢要求滿足為止(最終它必須滿足,因為對每個葉子中的鍵來說,這條件是自動滿足的)。
  • 對于以當前父母節點為根的子樹,在完成它的“堆化”以后,對該節點的直接前趨(數組中此節點的前一個節點)進行同樣的操作。在對樹的根完成這種操作以后,該算法就停止了。
  • 如果該節點不滿足父母優勢,就把該節點的鍵 K 和它子女的最大鍵進行交換,然后再檢查在新的位置上,K 是否滿足父母優勢要求。這個過程一直繼續到對 K 的父母優勢要求滿足為止——這種策略叫做下濾(percolate down)。

    此函數用來實現第3步。有了這個函數,我們就可以寫出自底向上構造堆的完整代碼了。

    堆構造函數1(自底向上,遞歸)

    // element_t a[]是用戶數組 例如 int a[5]={1,3,5,2,4}; // 則傳參 a 和 5 priority_queue build_max_heap_bottom_up_recursive(element_t a[], int elmt_cnt) {priority_queue pq = initialize(elmt_cnt);assert(pq != NULL);// 把用戶數組拷貝到堆中memcpy(pq->elements+1, a, sizeof(element_t)*elmt_cnt);pq->size = elmt_cnt; int i;// 從最后一個父母節點開始下濾,使成為大根堆for(i = elmt_cnt/2; i >= 1; --i){ percolate_down_recursive(pq->elements, elmt_cnt, i);}return pq; }

    percolate_down_recursive函數用了遞歸,雖然很容易理解,但是對自己要求高的程序員看著有點礙眼,能否不用遞歸呢?當然能,只是要犧牲一點可讀性。

    下濾函數2(非遞歸,交換法)

    // 此函數沒有用遞歸 void percolate_down(int a[], int n, int t) {int key = a[t]; // 用key記錄當前節點的鍵值int max_idx;int heap_ok = 0; // 初始條件是父母優勢不滿足 #ifdef PRINT_PROCEDURE printf("check %d\n", t); #endif // LEFT(t) <= n 成立說明有孩子while(!heap_ok && (LEFT(t) <= n)){ max_idx = LEFT(t); // 假設左孩子鍵值最大if(LEFT(t) < n) // 條件成立則說明有2個孩子{if(a[LEFT(t)] < a[RIGHT(t)])max_idx = RIGHT(t); //說明右孩子的鍵值比左孩子大}//此時max_idx指向鍵值最大的孩子if(a[t] >= a[max_idx]){heap_ok = 1; //滿足父母優勢,跳出循環,本函數返回}else{ //交換位置,a[t]被換到了a[max_idx]的位置swap(a+t, a+max_idx); #ifdef PRINT_PROCEDURE printf("%d NOT satisfied, swap it and %d \n",t, max_idx);printf("check %d\n", t); #endif t = max_idx; //繼續考察a[max_idx]是否滿足父母優勢 } } return; }

    第27行:交換函數的代碼是

    //交換*a和*b, 內部函數 static void swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp; }

    可以看到,交換需要3個賦值語句,還是比較費時間的。這里介紹一種“空穴法”,可以避免交換。

    如下圖所示,1號節點的左子樹和右子樹都已經是大根堆,這時候需要對1號節點下濾,使以1號節點為根的樹成為一個大根堆。

    下濾函數3(非遞歸,空穴法)

    // 非遞歸且不用交換 void percolate_down_no_swap(int a[], int n, int t) {int key = a[t]; // 用key記錄鍵值int max_idx;int heap_ok = 0; // 初始條件是父母優勢不滿足 #ifdef PRINT_PROCEDURE printf("check %d\n", t); #endif // LEFT(t) <= n 成立則說明 t 有孩子while(!heap_ok && (LEFT(t) <= n)){ max_idx = LEFT(t); // 假設左右孩子中,左孩子鍵值較大if(LEFT(t) < n) // 條件成立則說明有2個孩子{if(a[LEFT(t)] < a[RIGHT(t)])max_idx = RIGHT(t); //說明右孩子的鍵值比左孩子大}//此時max_idx指向鍵值較大的孩子if(key >= a[max_idx]){heap_ok = 1; //為 key 找到了合適的位置,跳出循環}else{ a[t] = a[max_idx]; //孩子上移一層,max_idx 被空出來,成為空穴 #ifdef PRINT_PROCEDURE printf("use %d fill %d \n", max_idx, t);printf("%d is empty\n", max_idx); #endif t = max_idx; //令 t 指向空穴 } }a[t] = key; // 把 key 填入空穴 #ifdef PRINT_PROCEDURE printf("use value %d fill %d \n", key, t); #endif return; }

    堆構造函數2(自底向上,非遞歸,空穴法)

    有了上面這個函數,在構造大根堆時,函數可以這樣寫:

    priority_queue build_max_heap_bottom_up(element_t a[], int elmt_cnt) {priority_queue pq = initialize(elmt_cnt);assert(pq != NULL);memcpy(pq->elements+1, a, sizeof(element_t)*elmt_cnt);pq->size = elmt_cnt;int i;for(i = elmt_cnt/2; i >= 1; --i){ // 下濾,非遞歸,空穴法percolate_down_no_swap(pq->elements, elmt_cnt, i);}return pq; }

    自頂向下堆構造

    除了上面的構造方法,還有一種算法(效率較低)是通過把新的鍵連續插入預先構造好的堆,來構造一個新堆。有的人把它稱作自頂向下堆構造。

  • 首先,把一個鍵值為 K 的新節點附加在當前堆的最后一個葉子后面;
  • 然后,拿 K 和它父母的鍵做比較。如果 K 小于等于它的父母,那么算法停止;否則交換這兩個鍵,并把 K 和它的新父母做比較。
  • 重復2,一直持續到 K 不大于它的父母,或者 K 成為樹根為止。
  • 這種策略叫做上濾(percolate up)

    以4,1,3,2,16,9,10,14,8,7這列鍵為例,用圖說明上濾的過程。

    插入函數1(交換法)

    void insert(element_t x, priority_queue max_heap) {if( is_full(max_heap) ){printf("priority queue is full, insert failed\n");return;}// 把新節點附加在當前堆的最后一個葉子后面max_heap->elements[ ++max_heap->size ] = x; int cur = max_heap->size; // cur 指向新的節點 #ifdef MAX_HEAP_SENTINELwhile( x > max_heap->elements[ cur/2 ] ) // 把新節點的鍵值和它的父母比較 #else// 當 cur == 1 時,說明新節點已經被交換到了樹根的位置,此時應該跳出循環while( (cur != 1) && (x > max_heap->elements[ cur/2 ]) ) #endif{// 交換新節點和它的父母swap(max_heap->elements + cur/2, max_heap->elements + cur);cur /= 2; // cur繼續指向新節點} }

    12~17行:這里用了兩種寫法,如果沒有使用限位器MAX_HEAP_SENTINEL,那么 elements[0]就沒有使用,當cur == 1的時候,說明節點已經被交換到了根的位置,它沒有父母節點,這時候應該停止操作。所以在while的條件判斷中加入了(cur != 1).

    如果使用了限位器,elements[0]中的值是一個比任何節點都大的值。當cur == 1的時候,說明節點已經被交換到了根的位置,這時候elements[ cur/2 ]就是elements[0],顯然while的循環條件不成立,所以循環中止。

    同前文一樣,swap操作比較費時,函數還可以優化。

    插入函數2(空穴法)

    // swap操作比較費時,上面的函數可以優化一下void insert_no_swap(element_t x, priority_queue max_heap) {if( is_full(max_heap) ){printf("priority queue is full, insert failed\n");return;}// 在當前堆的最后一個葉子后面創建一個空穴,用cur指向空穴int cur = ++max_heap->size; #ifdef MAX_HEAP_SENTINELwhile( x > max_heap->elements[ cur/2 ] ) // 新節點的鍵值和空穴的父母作比較 #elsewhile( (cur != 1) && (x > max_heap->elements[ cur/2 ]) ) #endif{// 父母向下移動一層,填補空穴,原父母的位置成為新的空穴max_heap->elements[cur] = max_heap->elements[cur/2];cur /= 2; }max_heap->elements[cur] = x; //把新節點填入空穴 }

    堆構造函數3(自頂向下,空穴法)

    有了插入函數,自頂向下構造堆的函數就不難寫了。

    priority_queue build_max_heap_up_bottom(element_t a[], int elmt_cnt) {priority_queue pq = initialize(elmt_cnt);assert(pq != NULL);int i;for(i = 0; i < elmt_cnt; ++i){ insert_no_swap(a[i], pq); #ifdef PRINT_PROCEDUREprint_heap(pq); #endif}return pq; }

    刪除最大鍵函數

    找出最大的鍵是容易的,困難的是刪除它。當刪除一個最大鍵時,在根位置產生了一個空穴。由于現在堆少了一個元素,因此堆中最后一個元素X必須移動到某個地方。如果X可以被放到空穴中(滿足父母優勢),那么刪除完成。不過這一般不太可能,因此我們將空穴的兩個兒子中較大者移入空穴,這樣就把空穴向下推了一層。重復該步驟直到X可以被放入空穴中。

    因為“用空穴法進行下濾”的詳細方法在上一篇博文中講過,所以這里略去了下濾的詳細過程。

    假設已經構造好了一個大根堆,對應的數組是

    [16,14,10,8,7,3,9,1,4,2]

    下面的一系列圖用來演示如何逐個刪除最大鍵。

    element_t delete_max(priority_queue max_heap) {if( is_empty( max_heap ) ){printf("priority queue is empty, return [0]\n");return max_heap->elements[0];}if( max_heap->size == 1){max_heap->size = 0;return max_heap->elements[1];}else{ element_t max_elmt = max_heap->elements[1];// 得到最后一個元素,并且堆的大小減一element_t last_elmt = max_heap->elements[max_heap->size--];// 把最后一個元素移動到樹根的位置max_heap->elements[1] = last_elmt;// 調整樹根percolate_down_no_swap(max_heap->elements,max_heap->size ,1); return max_elmt;} }

    寫到這里,重要的函數就講完了。

    完整的代碼及運行截圖

    最后附上完整的代碼和測試函數,對了,還有運行截圖。

    /* max_heap.h */ #ifndef _MAX_HEAP_ #define _MAX_HEAP_#define MAX_HEAP_SENTINEL 100 #define MIN_PQ_CAPACITY 3 #define HEAP_CAPACITY 20#define LEFT(i) (2*i) #define RIGHT(i) (2*i+1) #define PARENT(i) (i/2)typedef int element_t;struct heap_struct {int capacity;int size;element_t *elements; };typedef struct heap_struct *priority_queue;void print_array(int a[], int len); void print_heap(priority_queue heap);void percolate_down_no_swap(int a[], int n, int t); void percolate_down_recursive(int a[], int n, int t); void percolate_down(int a[], int n, int t);priority_queue initialize(int capacity); void insert_no_swap(element_t x, priority_queue max_heap); void insert(element_t x, priority_queue max_heap); int is_full(priority_queue max_heap); int is_empty(priority_queue max_heap); element_t delete_max(priority_queue max_heap);priority_queue build_max_heap_bottom_up_recursive(element_t a[], int elmt_cnt); priority_queue build_max_heap_bottom_up(element_t a[], int elmt_cnt); priority_queue build_max_heap_up_bottom(element_t a[], int elmt_cnt); priority_queue build_max_heap_up_bottom2(element_t a[], int elmt_cnt); void destroy(priority_queue heap); #endif /* max_heap.c */ #include "max_heap.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> void print_heap(priority_queue heap) {if(heap->size == 0){printf("the priority queue is empty\n");return;}// +1是因為heap->size不包括elements[0]print_array(heap->elements, heap->size + 1); }// 打印下標和元素值的通用函數 void print_array(int a[], int len) {printf("index:\n");int i;for (i = 0; i < len; ++i) {printf("%3d ", i); //寬度3加上空格就是4,所以后面有 4 * len} printf("\n");for (int i = 1; i <= 4 * len; ++i) {printf("%s", "-");} printf("\n");// 以上2個for循環用于打印數組下標和分隔線“-----------”for(i=0; i<len; ++i)printf("%3d ",a[i]); //打印數組的值printf("\n\n"); }//交換*a和*b, 內部函數 static void swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp; }priority_queue initialize(int capacity) {priority_queue heap;if(capacity < MIN_PQ_CAPACITY){printf("Priority queue capacity is too small\n");exit(EXIT_FAILURE);}heap = malloc( sizeof(struct heap_struct));if(heap == NULL){printf("out of space\n");exit(EXIT_FAILURE);}// +1 是因為要包含[0]heap->elements = malloc( (capacity + 1) * sizeof(element_t) );if(heap->elements == NULL){printf("out of space\n");exit(EXIT_FAILURE);}heap->capacity = capacity;heap->size = 0; #ifdef MAX_HEAP_SENTINEL// MAX_HEAP_SENTINEL 大于任何一個節點值,作為標記heap->elements[0] = MAX_HEAP_SENTINEL; #endifreturn heap; }void destroy(priority_queue heap) // 別忘了釋放內存! {free(heap->elements);free(heap); }int is_full(priority_queue max_heap) {return (max_heap->size == max_heap->capacity); }int is_empty(priority_queue max_heap) {return (max_heap->size == 0); }// 下濾函數(遞歸解法) // 假定以 LEFT(t) 和 RIGHT(t) 為根的子樹都已經是大根堆 // 調整以 t 為根的子樹,使之成為大根堆。 // 節點位置為 1~n,a[0]不使用 void percolate_down_recursive(int a[], int n, int t) { #ifdef PRINT_PROCEDUREprintf("check %d\n", t); #endifint left = LEFT(t);int right = RIGHT(t); int max = t; //假設當前節點的鍵值最大if(left <= n) // 說明t有左孩子 {max = a[left] > a[max] ? left : max;}if(right <= n) // 說明t有右孩子 {max = a[right] > a[max] ? right : max;}if(max != t){ swap(a + max, a + t); // 交換t和它的某個孩子,即t下移一層 #ifdef PRINT_PROCEDUREprintf("%d NOT satisfied, swap it and %d \n",t, max); #endifpercolate_down_recursive(a, n, max); // 遞歸,繼續考察t} }// 2018-5-4 8:17 // 此函數沒有用遞歸 void percolate_down(int a[], int n, int t) {int key = a[t]; // 用key記錄當前節點的鍵值int max_idx;int heap_ok = 0; // 初始條件是父母優勢不滿足 #ifdef PRINT_PROCEDURE printf("check %d\n", t); #endif // LEFT(t) <= n 成立說明有孩子while(!heap_ok && (LEFT(t) <= n)){ max_idx = LEFT(t); // 假設左孩子鍵值最大if(LEFT(t) < n) // 條件成立則說明有2個孩子{if(a[LEFT(t)] < a[RIGHT(t)])max_idx = RIGHT(t); //說明右孩子的鍵值比左孩子大}//此時max_idx指向鍵值最大的孩子if(a[t] >= a[max_idx]){heap_ok = 1; //滿足父母優勢,跳出循環,本函數返回}else{ //交換位置,a[t]被換到了a[max_idx]的位置swap(a+t, a+max_idx); #ifdef PRINT_PROCEDURE printf("%d NOT satisfied, swap it and %d \n",t, max_idx);printf("check %d\n", t); #endif t = max_idx; //繼續考察a[max_idx]是否滿足父母優勢 } } return; }// 非遞歸且不用交換 void percolate_down_no_swap(int a[], int n, int t) {int key = a[t]; // 用key記錄鍵值int max_idx;int heap_ok = 0; // 初始條件是父母優勢不滿足 #ifdef PRINT_PROCEDURE printf("check %d\n", t); #endif // LEFT(t) <= n 成立則說明 t 有孩子while(!heap_ok && (LEFT(t) <= n)){ max_idx = LEFT(t); // 假設左右孩子中,左孩子鍵值較大if(LEFT(t) < n) // 條件成立則說明有2個孩子{if(a[LEFT(t)] < a[RIGHT(t)])max_idx = RIGHT(t); //說明右孩子的鍵值比左孩子大}//此時max_idx指向鍵值較大的孩子if(key >= a[max_idx]){heap_ok = 1; //為 key 找到了合適的位置,跳出循環}else{ a[t] = a[max_idx]; //孩子上移一層,max_idx 被空出來,成為空穴 #ifdef PRINT_PROCEDURE printf("use %d fill %d \n", max_idx, t);printf("%d is empty\n", max_idx); #endif t = max_idx; //令 t 指向空穴 } }a[t] = key; // 把 key 填入空穴 #ifdef PRINT_PROCEDURE printf("use value %d fill %d \n", key, t);#endif return; }void insert(element_t x, priority_queue max_heap) {if( is_full(max_heap) ){printf("priority queue is full, insert failed\n");return;}// 把新節點附加在當前堆的最后一個葉子后面max_heap->elements[ ++max_heap->size ] = x; int cur = max_heap->size; // cur 指向新的節點 #ifdef MAX_HEAP_SENTINELwhile( x > max_heap->elements[ cur/2 ] ) // 把新節點的鍵值和它的父母比較 #else// 當 cur == 1 時,說明新節點已經被交換到了樹根的位置,此時應該跳出循環while( (cur != 1) && (x > max_heap->elements[ cur/2 ]) ) #endif{// 交換新節點和它的父母swap(max_heap->elements + cur/2, max_heap->elements + cur);cur /= 2; // cur繼續指向新節點}}// swap操作比較費時,上面的函數可以優化一下void insert_no_swap(element_t x, priority_queue max_heap) {if( is_full(max_heap) ){printf("priority queue is full, insert failed\n");return;}// 在當前堆的最后一個葉子后面創建一個空穴,用cur指向空穴int cur = ++max_heap->size; #ifdef MAX_HEAP_SENTINELwhile( x > max_heap->elements[ cur/2 ] ) // 新節點的鍵值和空穴的父母作比較 #elsewhile( (cur != 1) && (x > max_heap->elements[ cur/2 ]) ) #endif{// 父母向下移動一層,填補空穴,原父母的位置成為新的空穴max_heap->elements[cur] = max_heap->elements[cur/2];cur /= 2; }max_heap->elements[cur] = x; //把新節點填入空穴}// element_t a[]是用戶數組 例如 int a[5]={1,3,5,2,4}; // 則傳參 a 和 5 priority_queue build_max_heap_bottom_up_recursive(element_t a[], int elmt_cnt) {priority_queue pq = initialize(elmt_cnt);assert(pq != NULL);memcpy(pq->elements+1, a, sizeof(element_t)*elmt_cnt);pq->size = elmt_cnt; int i;// 從最后一個父母節點開始堆化for(i = elmt_cnt/2; i >= 1; --i){ percolate_down_recursive(pq->elements, elmt_cnt, i);}return pq; }priority_queue build_max_heap_bottom_up(element_t a[], int elmt_cnt) {priority_queue pq = initialize(elmt_cnt);assert(pq != NULL);memcpy(pq->elements+1, a, sizeof(element_t)*elmt_cnt);pq->size = elmt_cnt;int i;for(i = elmt_cnt/2; i >= 1; --i){ percolate_down_no_swap(pq->elements, elmt_cnt, i);}return pq; }priority_queue build_max_heap_up_bottom(element_t a[], int elmt_cnt) {priority_queue pq = initialize(elmt_cnt);assert(pq != NULL);int i;for(i = 0; i < elmt_cnt; ++i){ insert_no_swap(a[i], pq); #ifdef PRINT_PROCEDUREprint_heap(pq); #endif}return pq; }//和上一個函數的區別是插入采用交換法 priority_queue build_max_heap_up_bottom2(element_t a[], int elmt_cnt) {priority_queue pq = initialize(elmt_cnt);int i;for(i = 0; i < elmt_cnt; ++i){ insert(a[i], pq);}return pq; }element_t delete_max(priority_queue max_heap) {if( is_empty( max_heap ) ){printf("priority queue is empty, return [0]\n");return max_heap->elements[0];}if( max_heap->size == 1){max_heap->size = 0;return max_heap->elements[1];}else{ element_t max_elmt = max_heap->elements[1];// 得到最后一個元素,并且大小減一element_t last_elmt = max_heap->elements[max_heap->size--];// 把最后一個元素移動到樹根的位置max_heap->elements[1] = last_elmt;// 調整樹根percolate_down_no_swap(max_heap->elements,max_heap->size ,1);return max_elmt;} }//測試函數 int main(void) {int a[]={4,1,3,2,16,9,10,14,8,7}; //10個int elmt_cnt = sizeof(a) / sizeof(a[0]);priority_queue pq1,pq2,pq3,pq4;// 測試最大堆構造函數pq1 = build_max_heap_bottom_up_recursive(a,elmt_cnt);pq2 = build_max_heap_bottom_up(a,elmt_cnt); pq3 = build_max_heap_up_bottom(a,elmt_cnt);pq4 = build_max_heap_up_bottom2(a,elmt_cnt);// 打印構造結果print_heap(pq1);print_heap(pq2);print_heap(pq3);print_heap(pq4);// 測試刪除最大鍵的函數int del_key = 0;printf("delete the max key: ");while(is_empty(pq3)==0) // 用pq3測試{del_key = delete_max(pq3);printf("%d ", del_key);}printf("\n");destroy(pq1); //別忘了釋放內存!destroy(pq2);destroy(pq3);destroy(pq4); return 0; }

    總結

    以上是生活随笔為你收集整理的堆的C语言实现——堆与堆排序(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    av观看网站 | 美女网站黄在线观看 | 国产精品日韩在线观看 | 欧美精品九九99久久 | 国产成年免费视频 | 免费看黄网站在线 | 91精品久久久久久综合乱菊 | 青青草国产在线 | 97超碰精品 | 久久久亚洲麻豆日韩精品一区三区 | 99精品在线免费在线观看 | 久久综合国产伦精品免费 | 国产精品2区 | av福利免费 | 怡红院av久久久久久久 | 中文字幕资源网 | 亚洲精品久久久久久中文传媒 | 狠狠狠色丁香婷婷综合激情 | 黄色a大片| 天天操夜夜看 | 亚洲伦理一区 | 久香蕉 | 夜夜视频资源 | 91成人在线网站 | 久爱精品在线 | 中文字幕电影高清在线观看 | 久久精品国产免费观看 | 日韩精品一区二区三区免费观看 | 日韩精品免费一线在线观看 | 日日操夜夜操狠狠操 | 国产在线观看,日本 | 五月婷婷一级片 | 久久99精品久久只有精品 | 国产午夜视频在线观看 | 婷婷亚洲五月 | 手机在线看a | 91大片网站| 亚洲色图27p| 欧美性猛片, | 在线小视频你懂的 | www.午夜色.com | 日韩精品在线视频 | 久久国产欧美日韩精品 | 99精品国产亚洲 | 日韩久久精品一区二区三区下载 | 亚洲,国产成人av | 天天操天天爱天天干 | av网站地址 | www.久久成人 | 色综合天天狠天天透天天伊人 | 国产一区国产二区在线观看 | 免费在线色视频 | 欧美日韩在线观看一区二区三区 | 国语自产偷拍精品视频偷 | 91精品在线免费视频 | 一级a毛片高清视频 | 粉嫩高清一区二区三区 | 色av婷婷 | 中文字幕色婷婷在线视频 | 国产在线专区 | 日韩有码网站 | 九九综合久久 | 一级黄色在线免费观看 | 日韩电影在线一区 | 日韩在线观看视频在线 | 色丁香久久| 在线 国产一区 | 蜜桃视频日本 | 欧美九九视频 | 欧美激情va永久在线播放 | 久久久久麻豆v国产 | 黄色片网站av | 久久香蕉影视 | 日韩av成人在线观看 | 国产一区二区三区免费在线观看 | 日韩欧美在线观看一区二区三区 | 亚洲人精品午夜 | 久久久人人人 | 国产精品成人国产乱 | 99色精品视频| 日韩午夜电影 | 97人人人| 日韩欧美精品免费 | 在线观看一区 | 超碰97免费 | 国产高清不卡一区二区三区 | 亚洲电影在线看 | 成年人电影毛片 | 久久久免费毛片 | 成人h在线播放 | 亚洲国产午夜 | av大片网址| 免费网站在线观看人 | 精品国产免费一区二区三区五区 | 正在播放国产一区 | av在线激情 | 亚洲国产午夜视频 | 97香蕉久久国产在线观看 | 亚洲精品一区中文字幕乱码 | 丁香久久婷婷 | 成人黄色小说在线观看 | 久草免费手机视频 | 亚洲无吗天堂 | 97超碰.com| 久99热| 国产一区91| 四虎精品成人免费网站 | 亚洲精品五月天 | 精品国偷自产国产一区 | 93久久精品日日躁夜夜躁欧美 | 日韩免费av网址 | 成人免费在线观看av | 久久成| 国产xx在线 | 91精品视频导航 | 日日射天天射 | 日韩欧美视频在线免费观看 | 久久久人 | 国产综合精品久久 | 精品在线一区二区 | 韩日在线一区 | 人人爽人人爱 | h视频在线看 | 婷婷网站天天婷婷网站 | 欧美激情精品一区 | 高清av不卡 | 亚洲精品乱码久久久久v最新版 | 四虎国产精品免费 | 久久精品亚洲国产 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 天天做日日做天天爽视频免费 | 久久电影中文字幕视频 | 欧美激情操 | 国产九色视频在线观看 | 欧美a级在线免费观看 | 天天爽天天做 | 午夜精品久久久久久久99水蜜桃 | 天天综合网国产 | 免费三级大片 | 免费黄a| 日本少妇高清做爰视频 | 久99久精品| 亚洲久草视频 | 天天色综合天天 | 中文在线字幕免费观看 | 精品国产精品久久一区免费式 | 精品字幕在线 | .精品久久久麻豆国产精品 亚洲va欧美 | 久久免费av | 97超碰人人在线 | 久久99热精品这里久久精品 | 在线观看色网 | 国产高清视频免费在线观看 | 亚洲精品视频在线播放 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 久久99精品热在线观看 | 国产剧情在线一区 | 91亚洲精品久久久蜜桃网站 | 91精品婷婷国产综合久久蝌蚪 | 99久久精品视频免费 | 亚洲精品久久视频 | 激情欧美在线观看 | 久久女同性恋中文字幕 | 国产精品淫片 | 成人久久久久 | 欧美91片 | av在线免费播放网站 | 91九色在线视频 | 成人观看视频 | 探花视频在线观看 | 黄色福利视频网站 | 精品国产成人在线影院 | 激情五月婷婷综合 | 九九热视频在线播放 | 亚洲综合一区二区精品导航 | 国产精品密入口果冻 | 久久久激情视频 | 日韩视频二区 | 最新日韩中文字幕 | 亚洲精品黄色在线观看 | 91精品综合在线观看 | 国产在线精 | 91精品视频免费 | 五月婷婷视频 | 免费在线黄| 四虎影视成人永久免费观看视频 | 国产精品18毛片一区二区 | 久久桃花网 | 久久免费视频这里只有精品 | 99国产精品视频免费观看一公开 | 一级黄色在线视频 | 2022中文字幕在线观看 | 婷婷丁香国产 | www.色com | 国产在线自 | 国产无套精品久久久久久 | 欧美一级片在线免费观看 | 黄色字幕网| 日韩三级久久 | 亚洲欧美日韩在线一区二区 | 99视频一区 | 亚洲视频免费在线观看 | 免费日韩 精品中文字幕视频在线 | 激情影音| 久草久草视频 | 亚洲精欧美一区二区精品 | 很黄很污的视频网站 | 国产.精品.日韩.另类.中文.在线.播放 | a在线观看国产 | 欧美日韩视频在线一区 | 亚洲综合色站 | 91尤物在线播放 | 国产在线播放一区二区三区 | 不卡国产视频 | 免费视频一区二区 | 亚洲激情 在线 | 久久亚洲国产精品 | 亚洲精品动漫久久久久 | 一区二区 久久 | 天天·日日日干 | 黄色三级免费观看 | 韩国在线一区 | 欧美大码xxxx | 成人免费视频播放 | 久久久久9999亚洲精品 | 国产精品二区在线观看 | 色视频网页 | 国产精品久久久久久久久搜平片 | 色综合天天射 | 日韩专区在线 | 久久精品91视频 | 一级特黄aaa大片在线观看 | 欧美va天堂va视频va在线 | 天堂在线视频中文网 | 激情五月在线观看 | 天堂av在线免费 | adc在线观看 | 午夜在线日韩 | 久久影视精品 | 欧美日本高清视频 | 麻豆播放 | 九色视频网站 | 一本色道久久综合亚洲二区三区 | 韩国三级在线一区 | 久久精品国产精品亚洲精品 | 久久人人爽人人爽人人片 | 久福利| 麻豆一精品传二传媒短视频 | 国产 日韩 中文字幕 | 日本高清dvd | 欧美视频99 | 伊人黄 | 国产日韩在线播放 | 91污污| 99久久精品免费看国产免费软件 | 在线免费av播放 | 欧美综合久久 | 天天综合婷婷 | 亚洲黄色小说网 | 久久不射影院 | 懂色av一区二区三区蜜臀 | 波多在线视频 | 精品久久久久久久久久久久久 | 国色天香永久免费 | 中文字幕中文字幕在线中文字幕三区 | 日韩中文字幕视频在线观看 | 国产一级在线 | 激情欧美一区二区三区免费看 | 亚洲欧美精品在线 | 69国产盗摄一区二区三区五区 | 亚洲精品88欧美一区二区 | 久久综合九色综合久99 | 成人免费视频免费观看 | 91完整版 | 91成熟丰满女人少妇 | 国产精品成人久久 | 欧美日高清视频 | 美女av在线免费 | 成人在线观看免费 | 亚洲自拍偷拍色图 | 青青草国产精品视频 | 在线成人欧美 | 亚洲永久字幕 | 国产一区二区三区黄 | 在线看国产视频 | 亚洲欧美日韩一二三区 | 久久免费视频精品 | 国产乱对白刺激视频不卡 | 91亚洲狠狠婷婷综合久久久 | 四虎影视4hu4虎成人 | 激情视频一区二区三区 | 久久草| 亚洲乱亚洲乱亚洲 | 91av美女| www.色婷婷.com | 一区二区三区福利 | 在线免费观看视频你懂的 | 在线观看黄色大片 | 午夜视频在线瓜伦 | av色图天堂网| 天天操天天干天天操天天干 | 狠狠五月婷婷 | 黄色一级动作片 | 国产一区二区三区 在线 | 精品国产综合区久久久久久 | 欧美日韩精品在线视频 | 成人中心免费视频 | 日韩精品中文字幕在线播放 | 国产你懂的在线 | 久久免费精品一区二区三区 | 五月激情丁香图片 | 日韩三级免费观看 | 久久99亚洲精品久久 | 成人午夜电影网站 | 俺要去色综合狠狠 | 欧美日韩视频在线观看免费 | 国色天香在线 | 国产精品一区二区三区在线看 | 天天综合久久 | 欧美日韩在线观看一区二区 | 日本久久久精品视频 | 黄色综合 | 久久一久久| 99视频这里只有 | 一区二区三区四区五区在线 | 久久精品国产免费看久久精品 | 天天天综合 | 国产视频亚洲视频 | 在线观看国产亚洲 | 91视频下载 | 热久久免费视频 | 日本特黄一级片 | 日韩在线视频网址 | 亚洲视频一区二区三区在线观看 | 在线视频你懂 | 日韩av电影一区 | 日韩专区视频 | 国产视频中文字幕 | 久久精品久久久精品美女 | 高清不卡一区二区在线 | 日日麻批40分钟视频免费观看 | 国产999在线观看 | 99精品免费网 | 波多野结衣在线视频一区 | 天天干夜夜爱 | 精品亚洲一区二区三区 | 高清视频一区二区三区 | 久久情网| 亚洲一级片免费观看 | 人人干网站 | 激情av五月婷婷 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 亚洲国产精品久久久久婷婷884 | 欧美a免费 | 中文字幕丰满人伦在线 | 麻豆国产露脸在线观看 | 玖玖在线观看视频 | 一级片黄色片网站 | 久久成视频 | 久久久久在线观看 | 久久久久久久久久久黄色 | 天天做天天干 | 91精品国产综合久久福利 | av成人动漫在线观看 | 久久久国产精品视频 | 99国产精品免费网站 | 九九视频免费在线观看 | 一区二区三区免费在线 | 亚洲欧美日韩不卡 | 国产一级二级在线 | 亚洲精品玖玖玖av在线看 | 国产精品久久片 | 狠狠色狠狠综合久久 | 福利视频导航网址 | 91精品免费看 | 国产精品成人国产乱一区 | 国产精品亚州 | 久久噜噜少妇网站 | 天天色成人网 | 97超碰成人| 在线观看av免费 | 一区在线免费观看 | 麻豆91在线看 | 久久国产精品99久久久久久老狼 | 久久91久久久久麻豆精品 | 久久久久久久国产精品视频 | 天天摸天天干天天操天天射 | 美女网站视频一区 | 精品久久一区二区三区 | 日韩一区二区在线免费观看 | 97在线精品 | 最近最新中文字幕视频 | 日操操 | 成人黄色片免费看 | 精品视频在线播放 | .精品久久久麻豆国产精品 亚洲va欧美 | 欧美成年黄网站色视频 | 又黄又爽又刺激视频 | 免费视频黄 | 在线播放91 | 成人午夜剧场在线观看 | 国产99久久九九精品免费 | 99国产免费网址 | 欧美精品v国产精品v日韩精品 | 国产成人av电影在线观看 | 久久天天操 | 国产一区在线视频播放 | 国产精品一区二区三区观看 | 欧美亚洲精品在线观看 | 97免费在线观看视频 | 精品国自产在线观看 | 成片视频在线观看 | 欧美精品少妇xxxxx喷水 | 深夜免费小视频 | 特级西西444www大精品视频免费看 | 91人人爱| 国产在线观看午夜 | 最新超碰 | 91最新视频| 久久久久中文 | 波多在线视频 | 亚洲国产网址 | 国产精品ssss在线亚洲 | 天天干天天做天天操 | 欧美一级免费在线 | 成人免费视频观看 | 91在线播放视频 | 九九九九九精品 | 精品伊人久久久 | 麻豆传媒视频在线 | 91手机电视| 欧美激情综合色 | 91亚色视频在线观看 | 久久精品www人人爽人人 | 婷婷色伊人 | 福利网址在线观看 | 91亚色视频 | 成人一级影视 | 97国产大学生情侣酒店的特点 | 中文字幕在线观看av | 成年人免费电影 | 成人免费精品 | 亚洲精品在线视频 | 国产精品高清在线 | 69精品视频在线观看 | 日韩精品久久久久 | 亚洲精品乱码白浆高清久久久久久 | 免费在线观看成年人视频 | 麻豆国产在线播放 | 久久久久久久久爱 | 国产99区| 五月婷婷开心中文字幕 | 777奇米四色| www.久久婷婷 | 日韩亚洲国产中文字幕 | av中文字幕剧情 | 青草草在线视频 | 国产精品少妇 | 三级a视频 | 天天综合导航 | 丁香视频全集免费观看 | 国内精品久久久精品电影院 | 91av视频网站 | 国产在线毛片 | 亚洲乱亚洲乱亚洲 | 六月久久婷婷 | 午夜丁香视频在线观看 | 欧美色精品天天在线观看视频 | 一区二区三区影院 | 久久字幕 | 久久视频6 | 97福利在线观看 | 久草色在线观看 | 日韩一级电影在线观看 | 日韩丝袜视频 | 国产精品亚 | av女优中文字幕在线观看 | 日韩免费在线观看 | www.夜夜操| 91九色蝌蚪在线 | 亚洲在线视频免费观看 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 国产尤物在线 | 五月婷婷激情 | 国产精品九九九 | 免费男女羞羞的视频网站中文字幕 | 亚洲a在线观看 | 国产精品成人一区二区三区吃奶 | 99热99| 曰本免费av | 激情综合网天天干 | www.狠狠操| 成人黄色毛片 | 999视频精品 | 一区中文字幕在线观看 | 在线免费观看欧美日韩 | 又长又大又黑又粗欧美 | 日韩精品中文字幕在线不卡尤物 | 丁香六月综合网 | 黄av免费 | 婷婷色中文 | 亚洲免费观看在线视频 | 国产精品自在欧美一区 | 亚洲成人精品国产 | 婷婷午夜 | 天天天天色综合 | 午夜av电影院 | 黄在线免费观看 | 国内精品久久久久久久久久久久 | 99产精品成人啪免费网站 | 综合激情网... | 中文字幕免费一区二区 | 久久久久久蜜桃一区二区 | 国产精品永久 | 欧美成人精品欧美一级乱黄 | 91欧美精品| 在线观看视频福利 | 久久精品欧美一区二区三区麻豆 | 亚洲欧美999| 福利一区二区 | 久久色中文字幕 | 亚洲精品中文字幕视频 | 欧美性精品 | 91成人精品| 久久不见久久见免费影院 | 国产免费二区 | 蜜桃av人人夜夜澡人人爽 | 国产一级黄色片免费看 | 国产精品成人自产拍在线观看 | 亚洲国产日韩av | 国偷自产中文字幕亚洲手机在线 | 欧美精品在线一区二区 | 美女亚洲精品 | 9在线观看免费高清完整版 玖玖爱免费视频 | 久久丁香网 | 五月天六月婷婷 | 国产探花 | av成人免费在线看 | 一级黄色片毛片 | 国产精品av免费 | 超碰在线日本 | 欧美亚洲久久 | 国产97av | 国产在线观看你懂的 | 中文字幕在线观看完整版 | 亚洲激精日韩激精欧美精品 | 久久精品超碰 | 九色91在线 | 中文字幕中文字幕中文字幕 | 国偷自产中文字幕亚洲手机在线 | 99在线观看免费视频精品观看 | 久久99久国产精品黄毛片入口 | 亚洲精选99 | 成人久久18免费网站麻豆 | 久久成人福利 | 久草在线91| 欧美激情亚洲综合 | 免费观看一区二区 | 精品久久久久久久久久岛国gif | 99热网站| 亚洲精品视频在线观看网站 | 久久午夜影视 | 开心激情久久 | 草久视频在线 | 天天射天天操天天 | 日韩肉感妇bbwbbwbbw | 精品视频国产 | 午夜成人免费电影 | 亚洲日韩欧美一区二区在线 | 欧美久久久 | 色婷婷av一区 | 免费日韩一级片 | 西西大胆免费视频 | 亚洲国产精品人久久电影 | 国产美女视频 | 国产美女主播精品一区二区三区 | 国产美女精彩久久 | www色com | 高清一区二区 | 一级淫片在线观看 | 97超碰人人模人人人爽人人爱 | 99国产精品久久久久久久久久 | 国产a视频免费观看 | 国产精品99久久久久久久久 | 国产免费又黄又爽 | 成人av网站在线播放 | 色在线高清 | 97在线观看免费观看 | 国产精品免费av | 在线欧美小视频 | 日韩在线观看影院 | 福利av在线| 亚洲视频网站在线观看 | 日韩欧美一区二区三区在线 | 91视频在线看 | 999久久久久久久久 69av视频在线观看 | 伊人热 | 色婷婷成人网 | 久久免费在线 | 国产精品99久久久久的智能播放 | 亚洲精品免费观看视频 | 日韩av一区在线观看 | 国产免费又粗又猛又爽 | 欧美国产一区二区 | 国产精品初高中精品久久 | av先锋中文字幕 | 狠狠操狠狠 | 国产婷婷视频在线 | 亚洲精品国| 精品国产伦一区二区三区观看说明 | 日本成人中文字幕在线观看 | 插综合网| 在线免费观看黄色 | 国产精品中文字幕av | 亚洲欧洲美洲av | 亚洲综合成人专区片 | 日韩av一区在线观看 | 国产婷婷在线观看 | 久影院| 国产一区二区三区四区大秀 | 国内揄拍国产精品 | 日韩视频一区二区在线观看 | 亚洲日b视频| 日韩在线三级 | 国产高清在线一区 | 成人毛片一区 | 久久久久五月天 | 免费日韩电影 | 午夜少妇一区二区三区 | 在线观看免费av片 | 午夜久久久久久久久久影院 | 欧美了一区在线观看 | 国产成人333kkk | 日韩精品一区二区三区免费观看视频 | 狠狠色丁香婷婷综合橹88 | 996久久国产精品线观看 | 成人在线视频论坛 | 中文在线中文a | 国产精品视频你懂的 | 激情综合网五月婷婷 | 精品99视频| 亚洲欧美经典 | 69av国产| 99c视频在线 | 一区二区 精品 | 黄色在线视频网址 | 91看片在线 | 免费观看完整版无人区 | av解说在线观看 | 亚洲欧美成人综合 | 九九视频网站 | 99热在线观看 | 亚洲成av人影片在线观看 | 免费av在线网 | 久久99精品久久久久婷婷 | 午夜久久影视 | 免费午夜视频在线观看 | 88av色| 91精品国产自产在线观看永久 | 久久xx视频 | 黄色片软件网站 | 日本精品视频网站 | 激情丁香 | 国产精品久久久久婷婷二区次 | 免费精品 | 99在线免费视频观看 | 欧洲精品在线视频 | 日韩精品一区二区三区免费视频观看 | 精品国精品自拍自在线 | 亚洲激情网站免费观看 | 五月天天在线 | 干干干操操操 | 国产精品99久久久精品 | 成人在线视频你懂的 | 国产不卡在线观看视频 | 成人h视频在线 | 五月天婷婷在线观看视频 | 手机在线小视频 | 日本在线视频网址 | 日韩欧美视频在线观看免费 | 日韩天天综合 | 国产另类av | 国产欧美高清 | 免费在线观看av网址 | 中文字幕一区二区三区四区 | 99精彩视频| 欧美精品被| 99久久婷婷国产综合精品 | 色爱成人网 | 欧美巨乳网 | 日日爱av| 午夜电影 电影 | 尤物九九久久国产精品的分类 | 国产精品女人网站 | 99精品一级欧美片免费播放 | 人人射人人澡 | 亚洲激情婷婷 | 国精产品一二三线999 | 成人在线观看资源 | 99久久精品国产一区二区三区 | 在线中文字母电影观看 | 狠狠干.com | 国产精品久久久久久久久久久久冷 | 久久人人干 | 在线观看久久久久久 | 国产精品一区二区在线观看免费 | 99久久精品久久亚洲精品 | 久久精品视频在线 | 91精品久久久久久粉嫩 | 久久91网 | 午夜视频免费播放 | 欧美精品999 | 在线观看亚洲精品视频 | 最近中文字幕高清字幕在线视频 | 久久电影国产免费久久电影 | 最新动作电影 | 懂色av一区二区在线播放 | www欧美xxxx | 国产黄色美女 | 欧美中文字幕第一页 | 国产中文在线播放 | 精品99视频 | 视频国产精品 | 色综合久久88色综合天天6 | 日韩av快播电影网 | 天天搞天天 | 伊人午夜视频 | 精品色综合| 麻豆精品传媒视频 | 国产视频亚洲 | 欧美日韩在线精品一区二区 | 91视频com | 久久爱992xxoo | 免费特级黄色片 | 午夜视频导航 | 天天操天天操天天操天天操天天操 | 粉嫩av一区二区三区免费 | 欧美在线观看视频 | 在线观看视频免费播放 | 视频一区二区视频 | 久久九九免费视频 | 中文字幕色在线 | 久久论理| 91看片淫黄大片一级在线观看 | 色爱成人网 | 久久视频在线看 | 国内亚洲精品 | 人人爽人人爽人人爽学生一级 | 久草免费在线观看 | 免费视频97 | 国产在线精 | 高清视频一区二区三区 | 日韩欧美视频一区二区 | 人人爽人人av | 日韩三级中文字幕 | 五月婷婷国产 | 国产a网站 | 久久久久中文 | 一本一本久久a久久精品综合妖精 | 婷婷射五月| 亚洲国产免费 | 亚洲精品自在在线观看 | 综合铜03 | 青青久草在线视频 | 久久伊人精品一区二区三区 | 国产成人免费网站 | 最近中文国产在线视频 | 在线中文字幕av观看 | 国产在线观看中文字幕 | 91麻豆精品国产91久久久久久 | 欧美一级日韩三级 | av电影 一区二区 | www.eeuss影院av撸 | 日韩视频免费 | 国产午夜精品久久久久久久久久 | 香蕉视频国产在线观看 | 伊人网综合在线观看 | 亚洲成人精品影院 | 亚洲精品综合在线观看 | 成人久久久久 | 黄色av一区二区三区 | 在线亚洲人成电影网站色www | 亚洲成成品网站 | 麻豆传媒视频在线免费观看 | 国产精品一区二区三区视频免费 | 国产二区av| 玖玖色在线观看 | av资源在线观看 | 97国产精品亚洲精品 | 狠狠躁天天躁综合网 | 婷婷伊人综合亚洲综合网 | 色狠狠久久av五月综合 | 国产色资源 | 国产精品毛片久久 | 超级碰碰碰免费视频 | 久久精品视频网站 | 亚洲电影自拍 | 一区二区三区 中文字幕 | 亚洲综合在线五月天 | 国产日韩精品在线观看 | 天天射射天天 | 日韩av一卡二卡三卡 | 国内毛片毛片 | 国产一性一爱一乱一交 | 一区二区三区 亚洲 | 精品a在线 | 日韩成人精品一区二区 | 成人午夜毛片 | 精品国产一区二区三区免费 | 免费日韩一区二区三区 | 色诱亚洲精品久久久久久 | 亚洲午夜精品一区 | 国产1级视频 | 欧美久久久久久久久久久 | 亚洲另类在线视频 | 中文字幕乱码在线播放 | 99超碰在线观看 | 99在线精品视频 | 午夜精品视频福利 | 国产高清中文字幕 | 四虎在线免费观看 | 久久99国产精品免费 | 日韩精品无码一区二区三区 | 欧美va天堂va视频va在线 | 久草在线这里只有精品 | 91麻豆国产福利在线观看 | 国产91在线免费视频 | 成人中文字幕av | 99久久99久久精品国产片果冰 | 韩国精品一区二区三区六区色诱 | 99久久99久久精品免费 | 99色网站 | 特级毛片网站 | 天堂网一区二区 | 免费高清无人区完整版 | 在线观看黄色国产 | 亚洲日本成人 | 国产一区二区观看 | 欧美在线观看视频一区二区三区 | 美女视频永久黄网站免费观看国产 | www.香蕉视频 | 久久久国产精品人人片99精片欧美一 | 在线一级片 | 黄色在线观看免费 | 国产亚洲一区二区三区 | 精品久久在线 | 麻豆传媒视频在线 | 日本巨乳在线 | 久久黄色网址 | 天天干中文字幕 | av超碰在线 | 久草网站 | 国产精品久久久毛片 | 一区二区三区精品在线 | 二区视频在线 | 国产精品系列在线播放 | 国产成人在线观看免费 | 国产精品人成电影在线观看 | 日本最新一区二区三区 | 国产成人av网址 | 国产精品原创 | 久久久久久高潮国产精品视 | 麻豆高清免费国产一区 | 精品国产精品国产偷麻豆 | 九九久久久久99精品 | 在线91网 | 97av视频 | 欧美激情精品久久久久久 | 91麻豆文化传媒在线观看 | 免费观看日韩av | 中文字幕在线观看日本 | 日韩二区在线观看 | 成人一区不卡 | 国产在线不卡一区 | 国产视频不卡 | 久久看免费视频 | 日韩视频中文字幕在线观看 | 青青河边草免费视频 | 天天色综合1 | 国产青青青 | 91成人网在线 | 中文字幕高清 | 日日夜夜骑 | 欧美精品久久久久久久久久 | 国产精品99久久久久久有的能看 | 国内丰满少妇猛烈精品播 | 欧美黄污视频 | 国产91aaa| 国产精品久久在线 | 国产精品2019 | 久草在线视频首页 | 黄色小说网站在线 | 亚洲精品视频在线观看免费视频 | 免费高清在线观看成人 | www看片网站 | 在线观看亚洲国产 | 欧美黄色高清 | 日韩av午夜在线观看 | 免费三级在线 | 国产精品不卡av | 香蕉网址| 国产精品99久久久久久大便 | av午夜电影 | 人人澡超碰碰97碰碰碰软件 | 国产精品九色 | 日日干天天插 | 蜜臀久久99精品久久久酒店新书 | 看片在线亚洲 | 亚洲国产精品500在线观看 | 丝袜少妇在线 | 亚洲精品高清视频在线观看 | 伊人射| 亚洲专区欧美专区 | 欧美精品久久天天躁 | 精品在线免费视频 | 日日久视频 | av色影院| 中文字幕av最新更新 | 国产精品电影一区二区 | 最近中文字幕免费观看 | 伊人久久国产 | 国产亚洲婷婷 | 欧美成人999 | 最近中文字幕免费av | 欧美在线18| 久久久精品久久 | 这里只有精品视频在线 | 91禁看片 | 最近中文字幕在线中文高清版 | 婷婷精品在线视频 | 久久久久久久久久久高潮一区二区 | 国产a级精品 | 日韩av不卡在线 | 久久久久亚洲精品男人的天堂 | 国产黄大片 | 国内精品在线一区 | 在线免费观看国产精品 | 999抗病毒口服液 | 在线看福利av | 91精品推荐 | 99热最新 | 欧美精品乱码99久久影院 | 亚洲成人精品久久久 | 欧美成人播放 | 日韩电影一区二区三区 | 黄色特级毛片 | 九九免费在线观看视频 | 美女网站在线观看 | 日日干日日色 | 超碰在线人 | 国产精品免费久久久久影院仙踪林 | 中文字幕高清有码 | 国产亚洲精品成人av久久影院 | 国产在线免费观看 | 欧美日韩中文在线视频 | 中文字幕在线播放视频 | 国产一级二级av | 久久久久网址 | 色综合久久久久久久久五月 | 五月婷婷开心 | 成人在线黄色电影 | 精品在线一区二区 | 久久人人爽人人爽人人片 | 日韩视频二区 | 日韩精品一卡 | adn—256中文在线观看 | 久久激情视频网 | 一区免费视频 | 国产亚洲精品福利 | 成年人在线观看网站 | 国产小视频免费观看 | 99热官网 | 亚洲国产成人久久 | 日韩高清在线一区二区三区 | 国产精品不卡在线观看 | 91手机电影| 91在线精品观看 | 国产在线视频资源 | 国产电影一区二区三区四区 | 日韩有码第一页 | 日韩两性视频 | 美女久久网站 | 日韩手机视频 | 国产精品久久久久婷婷二区次 | 337p日本欧洲亚洲大胆裸体艺术 | 日本三级在线观看中文字 | 麻花传媒mv免费观看 | 天天色天天操天天爽 | 91激情在线视频 | 久久精品一区 | 狠狠狠色丁香婷婷综合久久五月 | 久久久久久国产精品美女 | 91久久久久久久一区二区 | 成人性生活大片 | 午夜精品一区二区三区在线 | 欧美一区二区精美视频 | 精品久久一 | 国产精品久久久久久久午夜 |