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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

c语言 数据结构 list、queue、tree抽象数据类型的定义与实现 详尽代码和注释

發(fā)布時(shí)間:2025/3/12 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言 数据结构 list、queue、tree抽象数据类型的定义与实现 详尽代码和注释 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文使用c語言定義并實(shí)現(xiàn)list、queue、tree抽象數(shù)據(jù)類型,代碼有詳盡注釋,可以通過代碼熟悉原理并運(yùn)用數(shù)據(jù)結(jié)構(gòu)。

0.ADT基礎(chǔ)知識(shí)

類型包括兩類信息,屬性和操作。在編程時(shí),根據(jù)編程問題匹配合適的數(shù)據(jù)類型。

定義一個(gè)新的數(shù)據(jù)類型,有三個(gè)步驟:

  • 提供類型屬性和相關(guān)操作的抽象描述。描述不依賴于特定實(shí)現(xiàn)和特定編程語言。
  • 開發(fā)一個(gè)實(shí)現(xiàn)ADT的編程接口。描述如何表示數(shù)據(jù)、描述實(shí)現(xiàn)ADT操作的函數(shù),在c中,可以提供結(jié)構(gòu)定義和操控該結(jié)構(gòu)的函數(shù)原型。
  • 編寫代碼實(shí)現(xiàn)接口。
  • 1.list(鏈表)的實(shí)現(xiàn)

    根據(jù)三個(gè)步驟,定義一個(gè)list:
    1.建立抽象:

    • 類型名:簡單鏈表。
    • 類型屬性:可存儲(chǔ)一系列項(xiàng)。
    • 類型操作:初始化鏈表為空、確定鏈表為空、確定鏈表已滿、確定鏈表中的項(xiàng)數(shù)、在鏈表末尾添加項(xiàng)、遍歷鏈表,處理鏈表中的項(xiàng)、清空鏈表。

    2.建立接口:見list.h

    建立接口后,可以使用這個(gè)接口編寫程序,而不必知道具體實(shí)現(xiàn)細(xì)節(jié),見film3.c

    3.實(shí)現(xiàn)接口:見list.c

    1.1 list.h

    /* list.h -- header file for a simple list type */ #ifndef LIST_H_ #define LIST_H_ #include <stdbool.h> /* C99 feature *//* 特定程序的聲明 */#define TSIZE 45 /* 存儲(chǔ)電影名的數(shù)組大小 */ struct film {char title[TSIZE];int rating; };/* 一般類型定義 */typedef struct film Item; /* 如果以后需要其他數(shù)據(jù)形式的鏈表,*/ /* 可以重新定義Item類型,不必更改其余的接口定義 */typedef struct node {Item item;struct node * next; } Node;/* 每一個(gè)鏈節(jié)叫做節(jié)點(diǎn)(Node) */typedef Node * List; /* 指向鏈表開始處的指針,List作為該類型的指針名*//* 函數(shù)原型 */ /* 前提條件:調(diào)用該函數(shù)前應(yīng)具備的條件 */ /* 后置條件:執(zhí)行完該函數(shù)后的情況 *//* 操作: 初始化一個(gè)鏈表 */ /* 前提條件: plist 指向一個(gè)鏈表 */ /* 后置條件: 鏈表初始化為空 */ void InitializeList(List * plist); /* 該函數(shù)的參數(shù)是指向鏈表的指針,*/ /* 如果函數(shù)想要修改一個(gè)參數(shù),那么該參數(shù)的類型應(yīng)該是指向相應(yīng)類型的指針 */ /* 調(diào)用時(shí)InitializeList(&movies) *//* operation: 確定鏈表是否為空 */ /* plist 指向一個(gè)已初始化的鏈表 */ /* postconditions: 如果鏈表為空,函數(shù)返回true */ /* 否則返回false */ bool ListIsEmpty(const List *plist);/* operation: 確定鏈表是否已滿 */ /* plist points to an initialized list */ /* postconditions: function returns True if list is full */ /* and returns False otherwise */ bool ListIsFull(const List *plist);/* operation: 確定鏈表中的項(xiàng)數(shù) */ /* plist points to an initialized list */ /* postconditions: 函數(shù)返回鏈表中的項(xiàng)數(shù) */ unsigned int ListItemCount(const List *plist);/* operation: 在鏈表的末尾添加項(xiàng) */ /* preconditions: item 是一個(gè)待添加至鏈表的項(xiàng) */ /* plist 指向一個(gè)已初始化的鏈表 */ /* postconditions: 如果可以, 函數(shù)在鏈表末尾添加一個(gè)項(xiàng) */ /* 且返回True; 否則返回False */ bool AddItem(Item item, List * plist);/* operation: 把函數(shù)作用于鏈表中的每一項(xiàng) */ /* plist 指向一個(gè)已初始化的鏈表 */ /* pfun 指向一個(gè)函數(shù),該函數(shù)接受一個(gè) */ /* Item類型的參數(shù),且無返回值 */ /* postcondition: pfun指向的函數(shù)作用于鏈表中的每個(gè)項(xiàng)一次 */ void Traverse (const List *plist, void (* pfun)(Item item) );/* operation: 釋放已分配的內(nèi)存(如果有的話) */ /* plist points to an initialized list */ /* postconditions: 釋放了為鏈表分配的所有內(nèi)存 */ /* 鏈表設(shè)置為空 */ void EmptyTheList(List * plist);#endif

    1.2 list.c

    /* list.c -- 支持鏈表操作的函數(shù) */ #include <stdio.h> #include <stdlib.h> #include "list.h"/* 局部函數(shù)原型 */ /* 該函數(shù)是實(shí)現(xiàn)的一部分,不是接口的一部分,*/ /* 使用static存儲(chǔ)類別說明符將其隱藏在list.c文件夾中 */ static void CopyToNode(Item item, Node * pnode);/* 接口函數(shù) */ /* 把鏈表設(shè)置為空 */ void InitializeList(List * plist) {* plist = NULL; }/* 如果鏈表為空,返回true */ bool ListIsEmpty(const List * plist) {if (*plist == NULL)return true;elsereturn false; }/* 如果鏈表已滿,返回True */ bool ListIsFull(const List * plist) {Node * pt;bool full;/* 添加一個(gè)節(jié)點(diǎn),分配一次內(nèi)存 */pt = (Node *) malloc(sizeof(Node));if (pt == NULL)/* 系統(tǒng)把內(nèi)存分配完了,此時(shí)表示鏈表滿了 */full = true;elsefull = false;free(pt);return full; }/* 返回節(jié)點(diǎn)的數(shù)量 */ unsigned int ListItemCount(const List * plist) {unsigned int count = 0;Node * pnode = *plist; /*設(shè)置鏈表的開始 */while (pnode != NULL){++count;pnode = pnode->next; /* 設(shè)置下一個(gè)節(jié)點(diǎn) */}return count; }/* 創(chuàng)建存儲(chǔ)項(xiàng)的節(jié)點(diǎn) */ /* 并將其添加至由plist指向的鏈表末尾 */ bool AddItem(Item item, List * plist) {Node * pnew;Node * scan = *plist;pnew = (Node *) malloc(sizeof(Node));if (pnew == NULL)return false; /* 失敗時(shí)退出函數(shù) */CopyToNode(item, pnew);pnew->next = NULL;if (scan == NULL) /* 空鏈表, 所以把 */*plist = pnew; /* pnew 放在鏈表的開頭 */else{while (scan->next != NULL)scan = scan->next; /* 找到鏈表的末尾 */scan->next = pnew; /* 把pnew添加到鏈表的末尾 */}return true; }/* 訪問每個(gè)節(jié)點(diǎn)并執(zhí)行pfun指向的函數(shù) */ void Traverse (const List * plist, void (* pfun)(Item item) ) {Node * pnode = *plist; /* 設(shè)置鏈表的開始 */while (pnode != NULL){(*pfun)(pnode->item); /* 把函數(shù)應(yīng)用于鏈表中的項(xiàng) */pnode = pnode->next; /* 前進(jìn)到下一項(xiàng) */} }/* 釋放由malloc()分配的內(nèi)存 */ /* 設(shè)置鏈表指針為 NULL */ void EmptyTheList(List * plist) {Node * psave;while (*plist != NULL){psave = (*plist)->next; /* 保存下一個(gè)節(jié)點(diǎn)的地址 */free(*plist); /* 釋放當(dāng)前節(jié)點(diǎn) */*plist = psave; /* 前進(jìn)至下一個(gè)節(jié)點(diǎn) */} }/* 局部函數(shù)定義 */ /* 把一個(gè)項(xiàng)拷貝到節(jié)點(diǎn)中 */ static void CopyToNode(Item item, Node * pnode) {pnode->item = item; /* 拷貝結(jié)構(gòu) */ }

    1.3 film3.c

    使用接口編寫程序,但是不必知道具體的實(shí)現(xiàn)細(xì)節(jié)。

    /* films3.c -- using an ADT-style linked list */ /* compile with list.c */ #include <stdio.h> #include <stdlib.h> /* prototype for exit() */ #include "list.h" /* defines List, Item */ void showmovies(Item item); char * s_gets(char * st, int n); int main(void) {List movies;Item temp;/* 初始化 */InitializeList(&movies);if (ListIsFull(&movies)){fprintf(stderr,"No memory available! Bye!\n");exit(1);}/* 獲取用戶輸入并存儲(chǔ) */puts("Enter first movie title:");while (s_gets(temp.title, TSIZE) != NULL && temp.title[0] != '\0'){puts("Enter your rating <0-10>:");scanf("%d", &temp.rating);while(getchar() != '\n')continue;if (AddItem(temp, &movies)==false){fprintf(stderr,"Problem allocating memory\n");break;}if (ListIsFull(&movies)){puts("The list is now full.");break;}puts("Enter next movie title (empty line to stop):");}/* 顯示 */if (ListIsEmpty(&movies))printf("No data entered. ");else{printf ("Here is the movie list:\n");Traverse(&movies, showmovies);}printf("You entered %d movies.\n", ListItemCount(&movies));/* 清理 */EmptyTheList(&movies);printf("Bye!\n");return 0; }void showmovies(Item item) {printf("Movie: %s Rating: %d\n", item.title,item.rating); }char * s_gets(char * st, int n) {char * ret_val;char * find;ret_val = fgets(st, n, stdin);if (ret_val){find = strchr(st, '\n'); // 查找換行符if (find) // 如果地址不是NULL,*find = '\0'; // 在此處放置一個(gè)空字符elsewhile (getchar() != '\n')continue; // 處理輸入行的剩余內(nèi)容}return ret_val; }

    2.queue(隊(duì)列)的實(shí)現(xiàn)

    隊(duì)列是具有兩個(gè)特殊屬性的鏈表,1.新項(xiàng)只能添加到鏈表的末尾,2.只能從鏈表的開頭移除項(xiàng)。 先進(jìn)先出的數(shù)據(jù)形式。

    根據(jù)三個(gè)步驟,定義一個(gè)list:
    1.建立抽象:

    • 類型名:隊(duì)列。
    • 類型屬性:可存儲(chǔ)一系列項(xiàng)。
    • 類型操作:初始化隊(duì)列為空、確定隊(duì)列為空、確定隊(duì)列已滿、確定隊(duì)列中的項(xiàng)數(shù)、在隊(duì)列末尾添加項(xiàng)、在隊(duì)列開頭刪除或恢復(fù)項(xiàng)、清空隊(duì)列。

    2.建立接口:見queue.h

    3.實(shí)現(xiàn)接口:見queue.c

    4.測(cè)試接口:見use_q.c

    5.使用隊(duì)列:見mall.c

    2.1 queue.h

    /* queue.h -- interface for a queue */ #ifndef _QUEUE_H_ #define _QUEUE_H_ #include <stdbool.h>// 在這里插入Item類型的定義 // FOR EXAMPLE, //typedef int Item; // for use_q.c // OR typedef struct item {int gumption; int charisma;} Item; // OR (for mall.c) /**/typedef struct item{long arrive; // 一位顧客加入隊(duì)列的時(shí)間int processtime; // 該顧客咨詢時(shí)花費(fèi)的時(shí)間} Item; /**/#define MAXQUEUE 10typedef struct node {Item item;struct node * next; } Node;typedef struct queue {Node * front; /* 指向隊(duì)列首項(xiàng)的指針 */Node * rear; /* 指向隊(duì)列尾項(xiàng)的指針 */int items; /* 隊(duì)列中的項(xiàng)數(shù) */ } Queue;/* operation: 初始化隊(duì)列 */ /* 前提條件: pq 指向一個(gè)隊(duì)列 */ /* 后置條件: 隊(duì)列被初始化為空 */ void InitializeQueue(Queue * pq);/* operation: 檢查隊(duì)列是否已滿 */ /* precondition: pq 指向之前被初始化的隊(duì)列 */ /* postcondition: 如果隊(duì)列已滿則返回true,否則返回false */ bool QueueIsFull(const Queue * pq);/* operation: 檢查隊(duì)列是否為空 */ /* precondition: pq 指向之前被初始化的隊(duì)列 */ /* postcondition: 如果隊(duì)列為空則返回true,否則返回false */ bool QueueIsEmpty(const Queue *pq);/* operation: 確定隊(duì)列中的項(xiàng)數(shù) */ /* precondition: pq points to previously initialized queue */ /* postcondition: 返回隊(duì)列中的項(xiàng)數(shù) */ int QueueItemCount(const Queue * pq);/* operation: 在隊(duì)列末尾添加項(xiàng) */ /* precondition: pq 指向之前被初始化的隊(duì)列 */ /* item是要被添加在隊(duì)列末尾的項(xiàng) */ /* postcondition: 如果隊(duì)列不為空,item將被添加在隊(duì)列的末尾, */ /* 函數(shù)返回true; */ bool EnQueue(Item item, Queue * pq);/* operation: 從隊(duì)列的開頭刪除項(xiàng) */ /* precondition: pq 指向之前被初始化的隊(duì)列 */ /* postcondition: 如果隊(duì)列不為空, */ /* 隊(duì)列首端的item將被拷貝到*pitem中, */ /* 并被刪除,且函數(shù)返回True */ /* 如果該操作使隊(duì)列為空, */ /* 則重置隊(duì)列為空 */ /* 如果隊(duì)列在操作前為空, */ /* 該函數(shù)返回false */ bool DeQueue(Item *pitem, Queue * pq);/* operation: 清空隊(duì)列 */ /* precondition: pq指向之前被初始化的隊(duì)列 */ /* postconditions: 隊(duì)列被清空 */ void EmptyTheQueue(Queue * pq);#endif

    2.2 queue.c

    /* queue.c -- the Queue type implementation*/ #include <stdio.h> #include <stdlib.h> #include "queue.h"/* local functions */ static void CopyToNode(Item item, Node * pn); static void CopyToItem(Node * pn, Item * pi);void InitializeQueue(Queue * pq) {pq->front = pq->rear = NULL;pq->items = 0; }bool QueueIsFull(const Queue * pq) {return pq->items == MAXQUEUE; }bool QueueIsEmpty(const Queue * pq) {return pq->items == 0; }int QueueItemCount(const Queue * pq) {return pq->items; }bool EnQueue(Item item, Queue * pq) {Node * pnew;if (QueueIsFull(pq))return false;pnew = (Node *) malloc( sizeof(Node));if (pnew == NULL)/*如果函數(shù)不能為節(jié)點(diǎn)分配內(nèi)存,程序運(yùn)行內(nèi)存不足*/{fprintf(stderr,"Unable to allocate memory!\n");exit(1);}CopyToNode(item, pnew);pnew->next = NULL;if (QueueIsEmpty(pq))pq->front = pnew; /* 項(xiàng)位于隊(duì)列首端 */elsepq->rear->next = pnew; /* 鏈接到隊(duì)列尾端 */pq->rear = pnew; /* 記錄隊(duì)列尾端位置 */pq->items++; /* 隊(duì)列項(xiàng)數(shù)加1 */return true; }bool DeQueue(Item * pitem, Queue * pq) {Node * pt;if (QueueIsEmpty(pq))return false;CopyToItem(pq->front, pitem);pt = pq->front;pq->front = pq->front->next;/*重置首指針指向隊(duì)列中的下一個(gè)項(xiàng)*/free(pt);/*釋放空出的節(jié)點(diǎn)使用的內(nèi)存空間*/pq->items--;if (pq->items == 0)//如果刪除的是最后一項(xiàng)pq->rear = NULL;//首指針和尾指針都置為NULLreturn true; }/* 清空隊(duì)列 */ void EmptyTheQueue(Queue * pq) {Item dummy;while (!QueueIsEmpty(pq))DeQueue(&dummy, pq); }/* Local functions */static void CopyToNode(Item item, Node * pn) {pn->item = item; }static void CopyToItem(Node * pn, Item * pi) {*pi = pn->item; }

    2.3 use_q.c

    /* use_q.c -- driver testing the Queue interface */ /* compile with queue.c */ #include <stdio.h> #include "queue.h" /* defines Queue, Item */int main(void) {Queue line;Item temp;char ch;InitializeQueue(&line);puts("Testing the Queue interface. Type a to add a value,");puts("type d to delete a value, and type q to quit.");while ((ch = getchar()) != 'q'){if (ch != 'a' && ch != 'd') /* ignore other input */continue;if ( ch == 'a'){printf("Integer to add: ");scanf("%d", &temp);if (!QueueIsFull(&line)){printf("Putting %d into queue\n", temp);EnQueue(temp,&line);}elseputs("Queue is full!");}else{if (QueueIsEmpty(&line))puts("Nothing to delete!");else{DeQueue(&temp,&line);printf("Removing %d from queue\n", temp);}}printf("%d items in queue\n", QueueItemCount(&line));puts("Type a to add, d to delete, q to quit:");}EmptyTheQueue(&line);puts("Bye!");return 0; }

    2.4 mall.c

    有一個(gè)提供快樂的攤位,顧客可以購買1分鐘、2分鐘或3分鐘的快樂。為確保交通順暢,每個(gè)攤位前排隊(duì)等待的顧客最多為10人。假設(shè)顧客隨機(jī)出現(xiàn),并且他們花費(fèi)的時(shí)間也是隨機(jī)選擇的(1\2\3分鐘),那么該攤位平均每小時(shí)接待多少名顧客?每位顧客平均花多長時(shí)間?排隊(duì)等待的顧客平均有幾人?

    // mall.c -- use the Queue interface // compile with queue.c #include <stdio.h> #include <stdlib.h> // for rand() and srand() #include <time.h> // for time() #include "queue.h" // change Item typedef #define MIN_PER_HR 60.0bool newcustomer(double x); // 是否有新顧客來? Item customertime(long when); // 設(shè)置顧客參數(shù)int main(void) {Queue line;Item temp; // 新的顧客數(shù)據(jù)int hours; // 模擬的小時(shí)數(shù)int perhour; // 每小時(shí)平均多少位顧客long cycle, cyclelimit; // 循環(huán)計(jì)數(shù)器、 計(jì)數(shù)器的上限long turnaways = 0; // 因隊(duì)列已滿被拒的顧客數(shù)量long customers = 0; // 加入隊(duì)列的顧客數(shù)量long served = 0; // 在模擬期間到訪過攤位的顧客數(shù)量long sum_line = 0; // 累計(jì)的隊(duì)列總長int wait_time = 0; // 從當(dāng)前到攤位空閑所需時(shí)間double min_per_cust; // 顧客到來的平均時(shí)間long line_wait = 0; // 隊(duì)列累計(jì)的等待時(shí)間 InitializeQueue(&line);srand((unsigned int) time(0)); // rand()隨機(jī)初始化puts("Case Study: Sigmund Lander's Advice Booth");puts("Enter the number of simulation hours:");scanf("%d", &hours);cyclelimit = MIN_PER_HR * hours;puts("Enter the average number of customers per hour:");scanf("%d", &perhour);min_per_cust = MIN_PER_HR / perhour;for (cycle = 0; cycle < cyclelimit; cycle++)//每次迭代對(duì)應(yīng)一分鐘的行為{if (newcustomer(min_per_cust))//如果1分鐘內(nèi)有顧客到來{if (QueueIsFull(&line))turnaways++;//被拒的顧客數(shù)量else{customers++;temp = customertime(cycle);/*設(shè)置temp結(jié)構(gòu)中的arrive和processtime成員*/EnQueue(temp, &line);}}if (wait_time <= 0 && !QueueIsEmpty(&line)){//如果隊(duì)列不為空且前面的顧客沒有咨詢,則刪除隊(duì)列首端的項(xiàng)DeQueue (&temp, &line);wait_time = temp.processtime;//該顧客咨詢時(shí)花費(fèi)的時(shí)間line_wait += cycle - temp.arrive;//到目前為止,隊(duì)列中所有顧客的等待總時(shí)間served++;//咨詢過的顧客數(shù)量}if (wait_time > 0)//完成當(dāng)前顧客的需求所需的時(shí)間大于0wait_time--;sum_line += QueueItemCount(&line);//目前為止統(tǒng)計(jì)的隊(duì)列長度}if (customers > 0){printf("customers accepted: %ld\n", customers);printf(" customers served: %ld\n", served);printf(" turnaways: %ld\n", turnaways);printf("average queue size: %.2f\n",(double) sum_line / cyclelimit);printf(" average wait time: %.2f minutes\n",(double) line_wait / served);}elseputs("No customers!");EmptyTheQueue(&line);puts("Bye!");return 0; }// x = 顧客到來的平均時(shí)間(單位:分鐘) // 如果1分鐘內(nèi)有顧客到來,則返回true bool newcustomer(double x) {if (rand() * x / RAND_MAX < 1)return true;elsereturn false; }// when是顧客到來的時(shí)間 // 該函數(shù)返回一個(gè)Item結(jié)構(gòu),該顧客到達(dá)的時(shí)間設(shè)置成when // 咨詢時(shí)間設(shè)置為1 - 3的隨機(jī)值 Item customertime(long when) {Item cust;cust.processtime = rand() % 3 + 1;cust.arrive = when;return cust; }

    3.tree(二叉查找樹)的實(shí)現(xiàn)

    訪問元素有兩種,隨機(jī)訪問:使用數(shù)組下標(biāo)直接訪問該數(shù)組中的任意元素;順序訪問:對(duì)于鏈表而言,必須從鏈表首節(jié)點(diǎn)開始,逐個(gè)節(jié)點(diǎn)移動(dòng)到要訪問的節(jié)點(diǎn)。
    用數(shù)組可以實(shí)現(xiàn)二分查找,因?yàn)榭梢允褂脭?shù)組下標(biāo)確定數(shù)組中任意部分的中點(diǎn)。但是鏈表只支持順序訪問,不提供跳至中間節(jié)點(diǎn)的方法,所以鏈表中不能使用二分查找。

    有一種數(shù)據(jù)形式的需求,既支持頻繁插入和刪除項(xiàng),又支持頻繁查找。此時(shí)需要二叉查找樹。

    根據(jù)三個(gè)步驟,定義一個(gè)二叉樹:

    該定義假設(shè)二叉樹不包含相同的項(xiàng)。

    1.建立抽象:

    類型名:二叉查找樹。

    類型屬性:

    • 二叉樹要么是空節(jié)點(diǎn)的集合(空樹),要么是有一個(gè)根節(jié)點(diǎn)的節(jié)點(diǎn)集合。
    • 每個(gè)節(jié)點(diǎn)都有兩個(gè)子樹,叫做左子樹和右子樹
    • 每個(gè)子樹本身也是一個(gè)二叉樹,也可能是空樹
    • 二叉查找樹是一個(gè)有序的二叉樹,每個(gè)節(jié)點(diǎn)包含一個(gè)項(xiàng)。
    • 左子樹的所有項(xiàng)都在根節(jié)點(diǎn)項(xiàng)的前面,右子樹所有項(xiàng)都在根節(jié)點(diǎn)項(xiàng)的后面

    類型操作:初始化樹為空、確定樹是否為空、確定樹是否已滿、確定樹中的項(xiàng)數(shù)、在樹中添加一個(gè)項(xiàng)、在樹中刪除一個(gè)項(xiàng)、在樹中查找一個(gè)項(xiàng)、在樹種訪問一個(gè)項(xiàng)、清空樹。

    2.建立接口:見tree.h

    3.實(shí)現(xiàn)接口:見tree.c

    4.使用二叉樹:見petclub.c

    3.1 tree.h

    /* tree.h -- binary search tree 二叉查找樹 */ /* 樹中不允許有重復(fù)的項(xiàng) */ #ifndef _TREE_H_ #define _TREE_H_ #include <stdbool.h>/* 根據(jù)情況重新定義Item */ #define SLEN 20 typedef struct item {char petname[SLEN];char petkind[SLEN]; } Item;#define MAXITEMS 10typedef struct trnode {Item item;struct trnode * left; /* 指向左分支的指針 */struct trnode * right; /* 指向右分支的指針 */ } Trnode;typedef struct tree {Trnode * root; /* 指向根節(jié)點(diǎn)的指針 */int size; /* 樹的項(xiàng)數(shù) */ } Tree;/* 函數(shù)原型 *//* 操作: 把樹初始化為空 */ /* 前提條件: ptree 指向一個(gè)樹 */ /* 后置條件: 樹被初始化為空 */ void InitializeTree(Tree * ptree);/* operation: 確定樹是否為空 */ /* preconditions: ptree points to a tree */ /* postconditions: 如果樹為空,函數(shù)返回true */ /* 否則返回false */ bool TreeIsEmpty(const Tree * ptree);/* operation: 確定樹是否已滿 */ /* preconditions: ptree points to a tree */ /* postconditions: function returns true if tree is */ /* full and returns false otherwise */ bool TreeIsFull(const Tree * ptree);/* operation: 確定樹的項(xiàng)數(shù) */ /* preconditions: ptree points to a tree */ /* postconditions: 返回樹的項(xiàng)數(shù) */ int TreeItemCount(const Tree * ptree);/* operation: 在樹中添加一個(gè)項(xiàng) */ /* preconditions: pi 是待添加項(xiàng)的地址 */ /* ptree 指向一個(gè)已初始化的樹 */ /* postconditions: 如果可以添加,該函數(shù)將在樹中添加一個(gè)項(xiàng) */ /* 并返回true,否則返回false */ bool AddItem(const Item * pi, Tree * ptree);/* operation: 在樹中查找一個(gè)項(xiàng) */ /* preconditions: pi指向一個(gè)項(xiàng) */ /* ptree 指向一個(gè)已初始化的樹 */ /* postconditions: 如果在樹中找到指定項(xiàng),該函數(shù)返回true */ /* 否則返回false */ bool InTree(const Item * pi, const Tree * ptree);/* operation: 從樹中刪除一個(gè)項(xiàng) */ /* preconditions: pi 是刪除項(xiàng)的地址 */ /* ptree 指向一個(gè)已初始化的樹 */ /* postconditions: 如果在樹中成功刪除一個(gè)項(xiàng),該函數(shù)返回true */ /* 否則返回false*/ bool DeleteItem(const Item * pi, Tree * ptree);/* operation: 把函數(shù)應(yīng)用于樹中的每一項(xiàng) */ /* preconditions: ptree 指向一個(gè)樹 */ /* pfun 指向一個(gè)函數(shù) */ /* 該函數(shù)接受一個(gè)Item類型的參數(shù),并無返回值 */ /* postcondition: pfun指向的這個(gè)函數(shù)為樹中的每一項(xiàng)執(zhí)行一次 */ void Traverse (const Tree * ptree, void (* pfun)(Item item));/* operation: 刪除樹中的所有內(nèi)容 */ /* preconditions: ptree指向一個(gè)已初始化的樹 */ /* postconditions: 樹為空 */ void DeleteAll(Tree * ptree);#endif

    3.2 tree.c

    /* tree.c -- tree support functions */ #include <string.h> #include <stdio.h> #include <stdlib.h> #include "tree.h"/* 局部數(shù)據(jù)類型 */ typedef struct pair {Trnode * parent;Trnode * child; } Pair;/* 局部函數(shù)的原型 */ static Trnode * MakeNode(const Item * pi); static bool ToLeft(const Item * i1, const Item * i2); static bool ToRight(const Item * i1, const Item * i2); static void AddNode (Trnode * new_node, Trnode * root); static void InOrder(const Trnode * root, void (* pfun)(Item item)); static Pair SeekItem(const Item * pi, const Tree * ptree); static void DeleteNode(Trnode **ptr); static void DeleteAllNodes(Trnode * ptr);/* 函數(shù)定義 */ void InitializeTree(Tree * ptree) {ptree->root = NULL;ptree->size = 0; }bool TreeIsEmpty(const Tree * ptree) {if (ptree->root == NULL)return true;elsereturn false; }bool TreeIsFull(const Tree * ptree) {if (ptree->size == MAXITEMS)return true;elsereturn false; }int TreeItemCount(const Tree * ptree) {return ptree->size; }bool AddItem(const Item * pi, Tree * ptree)/*在樹中添加一個(gè)項(xiàng)*/ {Trnode * new_node;if (TreeIsFull(ptree))/*首先檢查該樹是否有空間放下一個(gè)項(xiàng)*/{fprintf(stderr,"Tree is full\n");return false; /* 提前返回 */}if (SeekItem(pi, ptree).child != NULL){/*檢查該樹是否有該項(xiàng),因?yàn)橐蠖鏄渲械捻?xiàng)不能重復(fù)*/fprintf(stderr, "Attempted to add duplicate item\n");return false; /* 提前返回 */}new_node = MakeNode(pi); /* 指向新節(jié)點(diǎn) */if (new_node == NULL){fprintf(stderr, "Couldn't create node\n");return false; /* 提前返回 */}/* 成功創(chuàng)建了一個(gè)新節(jié)點(diǎn) */ptree->size++;/*找出應(yīng)該把這個(gè)新節(jié)點(diǎn)放在樹中哪個(gè)位置*/if (ptree->root == NULL) /* 情況 1: 樹為空 */ptree->root = new_node; /* 新節(jié)點(diǎn)為樹的根節(jié)點(diǎn) */else /* case 2: 樹不為空 */AddNode(new_node,ptree->root); /* 在樹中添加新節(jié)點(diǎn) */return true; /* 成功返回 */ }/*在樹中查找一個(gè)項(xiàng)*/ bool InTree(const Item * pi, const Tree * ptree) {/*SeekItem函數(shù)返回一個(gè)結(jié)構(gòu),該函數(shù)可以與結(jié)構(gòu)成員運(yùn)算符一起使用*/return (SeekItem(pi, ptree).child == NULL) ? false : true; }bool DeleteItem(const Item * pi, Tree * ptree) {Pair look;/*SeekItem返回一個(gè)結(jié)構(gòu),*//*內(nèi)含兩個(gè)指針,一個(gè)指針look.parent指向父節(jié)點(diǎn),*//*一個(gè)指針look.child指向包含特定項(xiàng)的節(jié)點(diǎn)*/look = SeekItem(pi, ptree);if (look.child == NULL)/*表明未找到指定項(xiàng)*/return false;/*找到了指定項(xiàng),分三種情況處理*//*第一種情況,該項(xiàng)在根節(jié)點(diǎn)中*/if (look.parent == NULL) /* 刪除根節(jié)點(diǎn)項(xiàng) */DeleteNode(&ptree->root);/*第二種情況,待刪除節(jié)點(diǎn)是父節(jié)點(diǎn)的左子節(jié)點(diǎn)*/else if (look.parent->left == look.child)DeleteNode(&look.parent->left);/*第三種情況,待刪除節(jié)點(diǎn)是父節(jié)點(diǎn)的右子節(jié)點(diǎn)*/elseDeleteNode(&look.parent->right);ptree->size--;return true; }/*遍歷樹*/ void Traverse (const Tree * ptree, void (* pfun)(Item item)) {if (ptree != NULL)InOrder(ptree->root, pfun); }void DeleteAll(Tree * ptree) {if (ptree != NULL)DeleteAllNodes(ptree->root);/*釋放內(nèi)存*//*處理Tree類型的結(jié)構(gòu),重置Tree類型結(jié)構(gòu)成員,表明該樹為空*/ptree->root = NULL;ptree->size = 0; }/* local functions */ /*可以有不同的處理順序*/ static void InOrder(const Trnode * root, void (* pfun)(Item item)) {if (root != NULL){/*處理左子樹、處理項(xiàng)、處理右子樹*/InOrder(root->left, pfun);(*pfun)(root->item);InOrder(root->right, pfun);} }static void DeleteAllNodes(Trnode * root) {Trnode * pright;if (root != NULL){pright = root->right;/*存儲(chǔ)root->right,使其在釋放根節(jié)點(diǎn)后仍然可用*/DeleteAllNodes(root->left);free(root);DeleteAllNodes(pright);} }/*確定新節(jié)點(diǎn)的位置,添加新節(jié)點(diǎn)*/ static void AddNode (Trnode * new_node, Trnode * root) {/*如果新項(xiàng)應(yīng)放在左子樹中,ToLeft()函數(shù)返回true*/if (ToLeft(&new_node->item, &root->item)){if (root->left == NULL) /* 空子樹 */root->left = new_node; /* 把節(jié)點(diǎn)添加到此處 */else/*把新項(xiàng)和左子節(jié)點(diǎn)中的項(xiàng)作比較,*//*以確定新項(xiàng)該放在該子節(jié)點(diǎn)的左子樹還是右子樹*/AddNode(new_node, root->left);/* 否則處理該子樹*/}/*如果新項(xiàng)應(yīng)放在右子樹中,ToRight()函數(shù)返回true*/else if (ToRight(&new_node->item, &root->item)){if (root->right == NULL)root->right = new_node;elseAddNode(new_node, root->right);}else /* 不允許有重復(fù)項(xiàng) */{fprintf(stderr,"location error in AddNode()\n");exit(1);} }/*ToLeft和ToRight函數(shù)依賴于Item類型的性質(zhì)。*/ /*成員名按字母排序,如果名字相同,按其種類排序*/ /*如果種類相同,屬于重復(fù)項(xiàng)*/ static bool ToLeft(const Item * i1, const Item * i2) {int comp1;/*第一個(gè)字符串在第二個(gè)字符串前面,strcmp返回負(fù)數(shù)*//*兩個(gè)字符串相同,strcmp返回0*/if ((comp1 = strcmp(i1->petname, i2->petname)) < 0)return true;else if (comp1 == 0 &&strcmp(i1->petkind, i2->petkind) < 0 )return true;elsereturn false; }static bool ToRight(const Item * i1, const Item * i2) {int comp1;if ((comp1 = strcmp(i1->petname, i2->petname)) > 0)return true;else if (comp1 == 0 &&strcmp(i1->petkind, i2->petkind) > 0 )return true;elsereturn false; }/*處理動(dòng)態(tài)內(nèi)存分配和初始化節(jié)點(diǎn)*/ /*參數(shù)是指向新項(xiàng)的指針,返回值是指向新節(jié)點(diǎn)的指針*/ static Trnode * MakeNode(const Item * pi) {Trnode * new_node;new_node = (Trnode *) malloc(sizeof(Trnode));if (new_node != NULL){new_node->item = *pi;new_node->left = NULL;new_node->right = NULL;}return new_node; }/*查找特定項(xiàng)*/ /*返回的結(jié)構(gòu)包含兩個(gè)指針,*/ /*一個(gè)指針指向包含項(xiàng)的節(jié)點(diǎn),如果未找到指定項(xiàng)則為NULL*/ /*一個(gè)指針指向父節(jié)點(diǎn)(如果該節(jié)點(diǎn)為根節(jié)點(diǎn),沒有父節(jié)點(diǎn),則為NULL)*/ static Pair SeekItem(const Item * pi, const Tree * ptree) {Pair look;look.parent = NULL;/*開始時(shí),設(shè)置look.child指向樹的根節(jié)點(diǎn)*/look.child = ptree->root;if (look.child == NULL)return look; /* 提前返回 */while (look.child != NULL){if (ToLeft(pi, &(look.child->item))){look.parent = look.child;look.child = look.child->left;//如果沒有找到匹配的項(xiàng),look.child將被設(shè)置為NULL}else if (ToRight(pi, &(look.child->item))){look.parent = look.child;look.child = look.child->right;}else /* 如果前兩種情況都不滿足,則必定是相等的情況 */break; /* look.child 目標(biāo)項(xiàng)的節(jié)點(diǎn) */}return look; /* 成功返回 */ }static void DeleteNode(Trnode **ptr) /* ptr是指向待刪除節(jié)點(diǎn)指針的地址 */ /*那么*ptr就是把ptr地址里面的值取出來,就是指向待刪除節(jié)點(diǎn)的指針*/ /*要修改的指針本身是Trnode*類型,指向Trnode的指針*/ /*該函數(shù)的參數(shù)是該指針的地址,所以參數(shù)的類型是Trnode** */ {Trnode * temp;/*待刪除節(jié)點(diǎn)是沒有左子節(jié)點(diǎn)的節(jié)點(diǎn)*/if ( (*ptr)->left == NULL){temp = *ptr;*ptr = (*ptr)->right;free(temp);}/*沒有右子節(jié)點(diǎn)的節(jié)點(diǎn)*/else if ( (*ptr)->right == NULL){temp = *ptr;*ptr = (*ptr)->left;free(temp);}else /* 被刪除的節(jié)點(diǎn)有兩個(gè)子節(jié)點(diǎn) */{/* 找到重新連接右子樹的位置 *//*沿左子樹的右支查找到第1個(gè)空位*/for (temp = (*ptr)->left; temp->right != NULL;temp = temp->right)continue;/*把待刪除節(jié)點(diǎn)的右子樹與該空位連接*/temp->right = (*ptr)->right;/*處理完之后重置待刪除節(jié)點(diǎn)的地址*//*重置之前先將*ptr存儲(chǔ)在temp中,釋放待刪除節(jié)點(diǎn)的內(nèi)存*/temp = *ptr;*ptr =(*ptr)->left;free(temp); } }

    3.3 petclub.c

    /* petclub.c -- use a binary search tree */ #include <stdio.h> #include <string.h> #include <ctype.h> #include "tree.h"char menu(void); void addpet(Tree * pt); void droppet(Tree * pt); void showpets(const Tree * pt); void findpet(const Tree * pt); void printitem(Item item); void uppercase(char * str); char * s_gets(char * st, int n);int main(void) {Tree pets;char choice;InitializeTree(&pets);while ((choice = menu()) != 'q'){switch (choice){case 'a' : addpet(&pets);break;case 'l' : showpets(&pets);break;case 'f' : findpet(&pets);break;case 'n' : printf("%d pets in club\n",TreeItemCount(&pets));break;case 'd' : droppet(&pets);break;default : puts("Switching error");}}DeleteAll(&pets);puts("Bye.");return 0; }char menu(void) {int ch;puts("Nerfville Pet Club Membership Program");puts("Enter the letter corresponding to your choice:");puts("a) add a pet l) show list of pets");puts("n) number of pets f) find pets");puts("d) delete a pet q) quit");while ((ch = getchar()) != EOF){while (getchar() != '\n') /* 處理輸入行的剩余內(nèi)容 */continue;ch = tolower(ch);if (strchr("alrfndq",ch) == NULL)puts("Please enter an a, l, f, n, d, or q:");elsebreak;}if (ch == EOF) /* 使程序退出 */ch = 'q';return ch; }void addpet(Tree * pt) {Item temp;if (TreeIsFull(pt))puts("No room in the club!");else{puts("Please enter name of pet:");s_gets(temp.petname,SLEN);puts("Please enter pet kind:");s_gets(temp.petkind,SLEN);uppercase(temp.petname);uppercase(temp.petkind);AddItem(&temp, pt);} }void showpets(const Tree * pt) {if (TreeIsEmpty(pt))puts("No entries!");elseTraverse(pt, printitem); }void printitem(Item item) {printf("Pet: %-19s Kind: %-19s\n", item.petname,item.petkind); }void findpet(const Tree * pt) {Item temp;if (TreeIsEmpty(pt)){puts("No entries!");return; /* quit function if tree is empty */}puts("Please enter name of pet you wish to find:");s_gets(temp.petname, SLEN);puts("Please enter pet kind:");s_gets(temp.petkind, SLEN);uppercase(temp.petname);uppercase(temp.petkind);printf("%s the %s ", temp.petname, temp.petkind);if (InTree(&temp, pt))printf("is a member.\n");elseprintf("is not a member.\n"); }void droppet(Tree * pt) {Item temp;if (TreeIsEmpty(pt)){puts("No entries!");return; /* quit function if tree is empty */}puts("Please enter name of pet you wish to delete:");s_gets(temp.petname, SLEN);puts("Please enter pet kind:");s_gets(temp.petkind, SLEN);uppercase(temp.petname);uppercase(temp.petkind);printf("%s the %s ", temp.petname, temp.petkind);if (DeleteItem(&temp, pt))printf("is dropped from the club.\n");elseprintf("is not a member.\n"); }void uppercase(char * str) {while (*str){*str = toupper(*str);str++;} } char * s_gets(char * st, int n) {char * ret_val;char * find;ret_val = fgets(st, n, stdin);if (ret_val){find = strchr(st, '\n'); // 查找換行符if (find) // 如果地址不是 NULL,*find = '\0'; // 在此處放置一個(gè)空字符elsewhile (getchar() != '\n')continue; // 處理輸入行的剩余內(nèi)容}return ret_val; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的c语言 数据结构 list、queue、tree抽象数据类型的定义与实现 详尽代码和注释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    91精品久久久久久久久 | 亚洲精品视频第一页 | 久久人人爽人人爽人人片av免费 | 国产成人a v电影 | 精品国产一区二区三区免费 | 热久久免费国产视频 | 国产一区观看 | 国产精品精品国产色婷婷 | 亚洲精品久久视频 | 亚洲综合色丁香婷婷六月图片 | 在线成人一区 | 综合网天天射 | 免费视频成人 | 午夜av一区二区三区 | 亚洲精品视频一二三 | 午夜精品久久久久久久99热影院 | 精品久久网站 | 久久99亚洲网美利坚合众国 | 午夜精品久久久久久久99婷婷 | 亚洲精品久久激情国产片 | 亚洲国产99 | 去干成人网 | 免费福利小视频 | 一区二区三区日韩视频在线观看 | 黄色毛片在线观看 | 国产精品激情偷乱一区二区∴ | 日韩欧美网址 | 最近中文字幕mv | 一区 在线 影院 | 国产精品高 | 国产精品theporn | 99福利影院| 国产色一区 | 不卡视频国产 | 国产精品久久久久三级 | 国产91免费在线观看 | 久久亚洲专区 | 亚洲影视资源 | 国产在线精品一区二区不卡了 | av怡红院 | 亚洲精品色视频 | 欧美激情视频在线免费观看 | 在线不卡视频 | 日韩伦理一区二区三区av在线 | 99婷婷| 少妇bbb| 欧美精品色 | 国产精品日韩欧美一区二区 | 91精品麻豆| 精品免费久久久久 | 在线成人av| 久久高清免费 | 波多野结衣在线观看视频 | 成人在线超碰 | 久久久久在线观看 | 国产伦精品一区二区三区四区视频 | www免费网站在线观看 | 99热官网 | 美女视频久久久 | 不卡日韩av | 黄色大片中国 | 99热这里只有精品1 av中文字幕日韩 | 黄色在线免费观看网址 | 日本女人在线观看 | 欧美另类69 | 欧美激情精品久久久久久 | 香蕉久久久久 | 中文字幕久久精品亚洲乱码 | 在线视频 一区二区 | 亚洲欧美激情精品一区二区 | 久草97| 91免费试看| 黄色电影网站在线观看 | 伊人午夜 | 亚洲天堂自拍视频 | 国产精品人人做人人爽人人添 | 天天摸日日操 | 国产成人精品一区二区三区免费 | 国产亚洲成人精品 | 五月婷婷六月综合 | 玖玖视频在线 | 2023av在线 | 亚洲a成人v | 亚洲最快最全在线视频 | 99理论片 | 99久久99久久免费精品蜜臀 | 婷婷综合导航 | 日韩网站免费观看 | 久久99国产一区二区三区 | 亚洲国产片| 99精品国产高清在线观看 | 久久五月婷婷综合 | 99久久久免费视频 | 91福利视频久久久久 | av成人动漫在线观看 | 91久久精品一区二区二区 | 九九热久久免费视频 | aaa亚洲精品一二三区 | 91成人观看| 亚洲精品乱码白浆高清久久久久久 | 97av影院| 2021国产精品视频 | 久久久久久网站 | 欧美伦理一区二区三区 | 激情xxxx | 伊人婷婷久久 | 中文字幕免费观看全部电影 | 亚洲精选在线观看 | 人人舔人人爱 | 深爱激情亚洲 | 国产成人免费av电影 | 中国一级片在线 | 精品国产乱码一区二 | 在线中文字幕视频 | 国产成人精品一二三区 | 五月天亚洲婷婷 | 亚洲成av人片在线观看无 | 免费高清在线视频一区· | 美女国内精品自产拍在线播放 | 婷婷99| 国产精品观看在线亚洲人成网 | 视频一区二区在线观看 | 美女禁18| 18国产精品福利片久久婷 | 一本一道波多野毛片中文在线 | 亚洲欧洲中文日韩久久av乱码 | 久久亚洲私人国产精品 | 国产色爽 | 91麻豆操 | 国产自在线 | 久草视频免费在线播放 | 9热精品| 黄色大全在线观看 | 久久久99精品免费观看app | 中文字幕三区 | 国产午夜三级一区二区三 | 久久成人一区二区 | 天堂入口网站 | 成人av电影免费观看 | 欧美久久久久 | 亚洲mv大片欧洲mv大片免费 | 欧美日韩高清一区二区 | 国产夫妻av在线 | 黄色网中文字幕 | zzijzzij亚洲日本少妇熟睡 | 一区二区三区电影在线播 | 国产精品观看 | 天天操天天干天天操天天干 | 色姑娘综合天天 | 国产精品入口66mio女同 | 日本一区二区免费在线观看 | 日韩精品你懂的 | 国产精品成人国产乱一区 | 成人午夜电影网 | 一区二区三区四区五区在线视频 | 国产精品久久一区二区三区, | 成年人毛片在线观看 | 国产一区二区手机在线观看 | 91精品国产乱码久久桃 | 麻豆视频在线观看免费 | 亚洲a色 | 九九热在线免费观看 | 在线观看日本韩国电影 | 一二区电影 | 国产操在线 | 国产老太婆免费交性大片 | 人人玩人人添人人澡97 | 久草资源在线观看 | www.狠狠干 | 日韩激情在线视频 | 国模精品一区二区三区 | 婷婷丁香久久五月婷婷 | 91精品视频免费看 | 国产啊v在线观看 | 五月天高清欧美mv | 激情深爱.com | 成人免费观看视频大全 | 精品不卡视频 | 久久人人爽人人爽 | 国产一区免费观看 | 久久综合久久综合这里只有精品 | av免费在线网站 | 98精品国产自产在线观看 | 国产一区视频在线播放 | 国产亚洲精品日韩在线tv黄 | 六月丁香激情综合 | 高清免费在线视频 | 日韩欧美久久 | 国产一级电影免费观看 | 中文字幕av免费 | 亚洲精品国产品国语在线 | 福利视频 | 99在线精品免费视频九九视 | 国产999精品视频 | 亚洲精品国产精品国自产观看浪潮 | 国产中文| 96av在线视频 | 国产最新视频在线观看 | 国产高清久久久 | 成全免费观看视频 | 免费日韩一区二区三区 | 69国产盗摄一区二区三区五区 | 99精品视频免费看 | 国产亚洲精品久久久久久无几年桃 | 久久精品一区 | 久久综合之合合综合久久 | 天堂久色 | 久草免费在线观看 | 91高清不卡 | 美女搞黄国产视频网站 | 毛片精品免费在线观看 | 精品欧美一区二区三区久久久 | ww视频在线观看 | 99久热精品| 国内毛片毛片 | 麻豆视频国产在线观看 | 亚洲国产wwwccc36天堂 | 99视频在线播放 | 精品久久久久久一区二区里番 | aaa日本高清在线播放免费观看 | 天天爱天天 | 五月婷婷综合激情网 | 国产日产精品久久久久快鸭 | 天堂av色婷婷一区二区三区 | 在线av资源 | 激情视频久久 | 免费国产黄线在线观看视频 | 日韩欧美极品 | 99电影 | 狠狠干夜夜爱 | 欧美成人一区二区 | 亚洲一二区精品 | 久久国际影院 | 免费黄在线看 | 青草视频在线 | 麻豆一区在线观看 | 亚洲精品欧美专区 | 中文字幕在线观看一区二区 | 99热九九这里只有精品10 | 日韩中文字幕视频在线观看 | 激情综合久久 | 波多野结衣亚洲一区二区 | 欧美精品三级在线观看 | 五月天色婷婷丁香 | 黄色毛片视频 | 欧美日一级片 | 曰本免费av| 亚洲精品网站 | 深夜男人影院 | 日韩免费网址 | 亚洲黄色小说网 | av大全在线免费观看 | 国产午夜影院 | 亚洲国产视频在线 | 九九热在线观看视频 | 色婷婷激情综合 | 国产成人精品一区二区三区免费 | 国产精品嫩草影院123 | 欧美日韩中文字幕综合视频 | 激情五月开心 | 日韩在线免费视频观看 | 日韩乱码在线 | 综合久久2023 | 中文字幕精品一区 | 免费看黄在线网站 | 97精品国产97久久久久久 | 色综合久久88色综合天天6 | 国产黄在线观看 | 在线观看一区 | 国产精品久久久久久久久久久杏吧 | 国产精品a级 | 免费看的黄色小视频 | 在线观看成人福利 | 日韩欧美在线观看 | 丁香色婷 | 亚洲每日更新 | 最新婷婷色 | 国产免费观看av | 97视频久久久 | 国产精品99蜜臀久久不卡二区 | 四虎在线视频免费观看 | 国产91精品一区二区麻豆亚洲 | 久久久穴| 在线a人片免费观看视频 | 日韩高清观看 | 国产黑丝袜在线 | 欧美在线观看视频一区二区 | 亚洲国产人午在线一二区 | 免费av网站观看 | 久久综合9988久久爱 | 91少妇精拍在线播放 | 黄色成人小视频 | 91社区国产高清 | 亚洲一级黄色 | 一个色综合网站 | 九九有精品 | 国产黄色大全 | 成人三级网站在线观看 | 欧美极品xxx| 日韩色一区二区三区 | 探花视频在线版播放免费观看 | 五月黄色| 国产99免费视频 | 精品免费视频123区 午夜久久成人 | 中文字幕在线播放av | 中文字幕永久免费 | 欧美日韩免费在线视频 | 97人人艹| 2023亚洲精品国偷拍自产在线 | 国产亚洲精品久久久久久无几年桃 | 国产精品一区二区三区免费看 | 亚洲精品无 | 久草在线视频首页 | 久久久久女人精品毛片九一 | 中文字幕在线观看免费高清电影 | 久久人人射| 日韩视频www | 999色视频| 欧美色图亚洲图片 | 成人黄色在线 | 97国产精品| av黄色免费网站 | 国产日韩精品久久 | 五月亚洲婷婷 | 国产精品夜夜夜一区二区三区尤 | 国产色婷婷在线 | 91在线观看欧美日韩 | 色精品视频 | 日本精品二区 | 亚洲人在线视频 | 日免费视频 | 91精品欧美一区二区三区 | 久久人人爽人人爽人人片 | 激情偷乱人伦小说视频在线观看 | 国产裸体无遮挡 | 99r精品视频在线观看 | 欧美 日韩 性 | 国产一二区视频 | 国产私拍在线 | 久久久影片 | 天堂av网在线 | 日韩在线三区 | 中文高清av | 日韩剧 | 国产精久久久久久久 | 在线免费观看羞羞视频 | 成人免费在线观看电影 | 午夜精品一区二区三区在线观看 | 一区二区在线电影 | 97超在线 | 黄a网站 | 久久精品99久久 | 一区二区三区手机在线观看 | 久久久久久蜜桃一区二区 | 亚洲欧洲精品一区 | 国产二级视频 | 在线精品视频免费观看 | 中文字幕中文中文字幕 | 毛片无卡免费无播放器 | 99精品国产在热久久 | 在线观看视频亚洲 | 国产一区二区三区四区大秀 | 丁香五香天综合情 | 色欧美成人精品a∨在线观看 | 808电影免费观看三年 | 91精品日韩| 免费三级大片 | 久久99国产精品免费网站 | 婷婷精品国产一区二区三区日韩 | 国内成人精品2018免费看 | 91香蕉视频黄 | 天天干天天草天天爽 | 综合网av | 久久精品视频网站 | 久草在线免费在线观看 | 亚洲不卡av一区二区三区 | av福利网址导航 | 免费观看成人网 | 精品国产免费久久 | 久久伦理影院 | 中文字幕一区在线观看视频 | 国产91精品看黄网站在线观看动漫 | 天天天干| www.激情五月.com | 大荫蒂欧美视频另类xxxx | 久久久久国产成人免费精品免费 | 久久国产精品久久国产精品 | 五月婷婷一级片 | 黄色app网站在线观看 | 欧美另类一二三四区 | 亚洲mv大片欧洲mv大片免费 | 欧美做受高潮电影o | 免费黄色激情视频 | 国产精品一区二区三区视频免费 | 国产精品免费久久久久影院仙踪林 | 成人在线视频免费观看 | 四虎影院在线观看av | 毛片区 | 色小说在线 | 亚洲精品在线免费看 | 国产精品免费不 | 国产免费作爱视频 | 国产精品999久久久 久产久精国产品 | 日本爱爱片 | 91在线网址 | 久久综合狠狠综合久久狠狠色综合 | 人人爽人人爱 | 欧美日韩免费视频 | 久久久久久久网站 | 丁香婷婷色综合亚洲电影 | 九九免费在线观看视频 | 中文字幕在线一二 | 国产精品免费一区二区 | 一二三精品视频 | 免费观看91 | 一级成人免费视频 | 欧美吞精 | 福利一区二区在线 | 亚洲视频1区2区 | 一本大道久久精品懂色aⅴ 五月婷社区 | 久久久久女人精品毛片九一 | 中文免费观看 | 亚洲精品播放 | 韩国一区二区在线观看 | 日韩中文字幕在线观看 | www最近高清中文国语在线观看 | 中文在线www | 91最新中文字幕 | 美女网站视频免费都是黄 | av理论电影 | 久久国内免费视频 | 亚洲综合网站在线观看 | 欧美日韩在线视频一区二区 | 久久综合狠狠综合 | 欧美日韩性 | 成人在线观看日韩 | 91高清免费看 | www.色婷婷.com | 亚洲高清在线观看视频 | 国产福利精品在线观看 | 国产成人久久77777精品 | 久久久久久久久爱 | 激情久久五月天 | 97成人精品视频在线观看 | 亚洲一区二区三区在线看 | 国产精品久久人 | 天天干.com| 久久久999 | 丁香网五月天 | 国产日韩欧美网站 | 国产一区二区三区网站 | 超级碰碰免费视频 | 亚洲色图激情文学 | 久久久久久亚洲精品 | 欧美激情在线网站 | 精品电影一区 | 超碰99人人 | 天堂在线视频中文网 | 香蕉视频在线播放 | 国产福利一区二区三区视频 | 国产96av| 六月激情| 亚洲开心色 | 视频国产在线 | 少妇av片| 九九热只有这里有精品 | 久久久久久久久电影 | 99婷婷狠狠成为人免费视频 | 欧美日韩国产综合一区二区 | 日本久久综合视频 | 91亚洲国产成人 | 色综合小说 | 中文一区在线 | 麻豆网站免费观看 | 久久成人精品视频 | 丁香花在线视频观看免费 | 香蕉影院在线播放 | 国产高清视频免费在线观看 | 在线看毛片网站 | 久色小说 | 亚洲精品久久久久中文字幕二区 | 日韩在线欧美在线 | 日本精品久久久久久 | 超碰在线最新地址 | 国产伦精品一区二区三区照片91 | 97国产一区二区 | 国产一级免费观看 | 亚洲最新av网址 | 天天操天天操天天操天天操天天操 | 免费看毛片网站 | 在线日韩 | 在线精品视频免费播放 | 一区二区精品久久 | 国产在线一区二区三区播放 | 亚洲码国产日韩欧美高潮在线播放 | 亚洲综合色站 | 久久久国产精品网站 | 色婷婷久久久综合中文字幕 | 成年人黄色大全 | 天堂网一区二区三区 | 久草com| 日本最新中文字幕 | 欧美日韩国产一二 | 人操人| 国产精品中文字幕av | 特级西西444www大精品视频免费看 | 91成人区 | 97视频免费在线看 | 午夜影视av | 国产一级不卡视频 | 国产3p视频| 在线观看视频在线 | 狠狠色噜噜狠狠狠合久 | 99资源网| 一区 二区电影免费在线观看 | 免费观看一级成人毛片 | 日韩欧美一区二区三区视频 | 美女免费网站 | 国产亚洲日 | 久久精品高清视频 | 免费av成人在线 | 免费视频一级片 | 欧美精品乱码99久久影院 | 久久人人97超碰com | 国产精品久久久久久久婷婷 | 国产不卡免费视频 | 蜜臀av性久久久久av蜜臀三区 | 亚洲精品视频久久 | av片一区二区 | 国产精品久久久久久久久久久久冷 | 午夜精品区 | 狠狠色丁香婷综合久久 | 国产91在线观 | 久久免费美女视频 | 日韩大片在线免费观看 | 色婷婷久久 | 2023年中文无字幕文字 | 成人一级黄色片 | 亚洲精品99久久久久久 | 精品久久久久久久久久久久久久久久久久 | 在线观看免费91 | av黄色大片 | 国产精彩视频一区 | 欧美日韩激情网 | 中文字幕二区在线观看 | 中文字幕在线观看播放 | 欧美极度另类性三渗透 | 免费看国产一级片 | 色综合久久综合中文综合网 | 亚洲精品在线一区二区三区 | 激情导航| 日本精品一区二区三区在线观看 | 婷婷伊人网 | 中文国产在线观看 | 欧美亚洲一级片 | 午夜精品电影一区二区在线 | 久久精品电影网 | 日本狠狠干 | 国产午夜精品免费一区二区三区视频 | 久久九九国产精品 | 久久久99精品免费观看app | 国产精品美女999 | 你操综合 | 91成人精品在线 | 久久久久久不卡 | 欧美国产视频在线 | 婷婷四房综合激情五月 | 五月天伊人 | 天天操天天操天天操 | 在线观看www视频 | 91试看 | 日韩av一卡二卡三卡 | 超碰97免费观看 | 国产精品成人久久 | 99色免费视频 | 精品在线视频一区 | 在线免费观看黄色大片 | 丁香午夜 | 日韩av成人 | 免费看特级毛片 | 日本aa在线 | 香蕉视频4aa | 久久精品国产一区二区三区 | 亚洲天堂网在线视频 | 亚州精品成人 | 亚洲片在线观看 | 中文字幕精 | 欧美一区二区三区免费看 | 欧美性生交大片免网 | 国产免费午夜 | 国模精品一区二区三区 | 亚洲黄色高清 | 天天干天天拍天天操天天拍 | 亚洲精品国产品国语在线 | 精品国产乱码久久久久久三级人 | 麻豆影视在线免费观看 | 亚洲国产美女久久久久 | 久久国产日韩 | 国产精品自产拍在线观看网站 | 国内精品在线看 | 国产色综合 | 久久电影色 | 在线日本v二区不卡 | 日韩精品一区在线播放 | 国产精品v a免费视频 | 欧美精品久久久久性色 | 国产美女久久久 | 高清av影院 | 亚洲精欧美一区二区精品 | 免费观看的黄色 | 国产一级片一区二区三区 | 狠狠色丁香久久婷婷综合_中 | 精品国内自产拍在线观看视频 | 美女免费视频黄 | 日韩丝袜视频 | 免费精品视频在线观看 | 免费在线观看毛片网站 | 欧美精品久久人人躁人人爽 | 久久五月天色综合 | 国产r级在线观看 | 国产v欧美| 99视频一区| 国产精品岛国久久久久久久久红粉 | 日韩欧美有码在线 | 综合久久久久久久久 | 亚洲一区久久 | 麻豆视频www | 国产精彩在线视频 | 久久综合久久综合九色 | 青春草免费视频 | 337p西西人体大胆瓣开下部 | 亚洲性xxxx| 日本精a在线观看 | 九九久久影视 | 国产98色在线 | 日韩 | 久久亚洲私人国产精品 | 久久亚洲国产精品 | 日日干干夜夜 | 久久成人国产精品 | 不卡的一区二区三区 | 欧美日韩在线播放 | 丁香婷婷综合色啪 | 国产美女主播精品一区二区三区 | 欧美日本在线观看视频 | 成 人 黄 色 免费播放 | 久久丁香网 | 有码一区二区三区 | 日韩成人中文字幕 | 久久天堂影院 | 人人爱在线视频 | 久久综合天天 | 免费黄色网址大全 | 黄色av三级在线 | 久久久国产一区二区三区 | 色综合久久久久久久 | 91人人在线 | 91精品国产成人www | 中文字幕 国产视频 | 91一区二区三区在线观看 | 久青草电影 | 国内精品二区 | 日韩av片无码一区二区不卡电影 | 亚洲国产影院av久久久久 | 日韩精品高清视频 | 99在线视频免费观看 | 欧美日韩一区二区久久 | 国产亚洲欧美精品久久久久久 | 亚洲人人网 | 99色免费 | 7777精品伊人久久久大香线蕉 | 97超碰资源网 | 黄色免费观看网址 | 91刺激视频| 二区视频在线观看 | 美女视频黄网站 | 中文字幕亚洲欧美日韩 | 福利视频网站 | 成人一级片免费看 | 91成人午夜 | 亚洲成人蜜桃 | 久草干 | 国产涩涩网站 | 久久婷亚洲五月一区天天躁 | 91精品成人 | 国产精品亚洲人在线观看 | 亚洲精品日韩在线观看 | 五月婷婷伊人网 | 天天干天天操av | 日韩日韩日韩日韩 | 亚洲 欧美 综合 在线 精品 | 伊人宗合| 亚洲成人免费观看 | 超碰精品在线 | 精品人人爽 | 精品主播网红福利资源观看 | 亚洲理论电影网 | 激情五月在线视频 | 麻豆久久久久久久 | 99久久精品免费看国产免费软件 | 亚洲天堂精品 | 成人夜晚看av | 久久精品中文字幕免费mv | 午夜影院三级 | 色就色,综合激情 | 国产精品美女免费视频 | 久久精品这里都是精品 | 亚a在线 | 高清av免费一区中文字幕 | 综合在线色| 欧美一级片免费在线观看 | 日韩精品一区二区三区免费观看视频 | 特级毛片网 | 久久好看免费视频 | 香蕉一区 | 国内精品在线看 | 久久av网| 中日韩欧美精彩视频 | 亚洲精品中文字幕在线观看 | 国产精品免费久久久久久久久久中文 | 精品国产乱码久久久久久浪潮 | 午夜精品一区二区三区四区 | 国产裸体bbb视频 | 国产区第一页 | 中文字幕成人在线观看 | 免费三级黄色片 | 99国内精品久久久久久久 | 四虎国产永久在线精品 | 91天天操| 少妇自拍av | 日韩二三区| 欧美巨大 | 视频在线观看国产 | 亚州黄色一级 | 国产中文 | 综合色在线 | 麻豆传媒视频在线免费观看 | 一级黄色大片 | 亚洲精品美女久久久久网站 | 日韩久久精品一区二区三区 | 欧美a级一区二区 | 综合天堂av久久久久久久 | 国语对白少妇爽91 | 精品uu | 国产精品一区免费在线观看 | 青青河边草免费直播 | 久久久久国产精品免费 | 日韩色av色资源 | 日韩欧美精品一区二区 | 成人精品影视 | 欧美大片mv免费 | 91在线播放视频 | 在线看毛片网站 | 成人在线视频观看 | 四虎精品成人免费网站 | 福利视频入口 | 性日韩欧美在线视频 | 亚洲一区二区精品3399 | 亚洲在线看 | 久久久国产日韩 | 日韩电影中文,亚洲精品乱码 | av片一区二区 | 国产精品一区二区av | 亚洲最大成人免费网站 | 久久精久久精 | 国产精品免费久久久 | 久久天天操 | av解说在线 | 91av中文| 久艹在线观看视频 | a视频在线播放 | 草久在线观看视频 | 亚州精品在线视频 | av黄在线播放 | 免费视频区 | 亚洲国产经典视频 | 一区二区三区日韩在线 | 人人爽人人澡人人添人人人人 | 五月天久久狠狠 | 人成免费网站 | 日韩亚洲欧美中文字幕 | 黄色网址国产 | 国产亚洲视频在线免费观看 | 久久久久激情电影 | 色婷婷www| 成年人视频在线观看免费 | 国产精品二区在线 | 日韩99热| 91成人免费在线视频 | 欧美一级小视频 | 在线午夜 | 99视频在线免费 | 久久国产热视频 | 国产精品久久久久久久久久免费看 | 国产亚洲字幕 | 一区三区在线欧 | 99视频这里只有 | wwwwww黄| 国产精品嫩草69影院 | 久草在线免费新视频 | 一区二区三区电影大全 | 精品综合久久 | 国产区在线 | 超碰人人av | 欧美日韩1区 | 91视频免费国产 | 午夜久久网站 | 日韩在线小视频 | 黄色大全免费网站 | 成人免费视频视频在线观看 免费 | 人人澡人人爱 | 亚洲国产影院 | 91视频在线免费观看 | 久久久精品网 | 国产精品18久久久久久不卡孕妇 | 极品美女被弄高潮视频网站 | 精品资源在线 | 在线成人短视频 | 久久99精品国产麻豆宅宅 | 天天综合五月天 | 亚洲国产免费看 | 日韩电影在线视频 | 欧美日韩国产欧美 | 中文字幕av有码 | 黄色免费网 | 国产99久久久国产 | 黄色三几片 | 精品久久久久免费极品大片 | 久久久国产毛片 | 成人av影视观看 | 亚洲欧美日韩国产一区二区三区 | 99精品视频在线观看 | 精品视频久久久 | 久久久久久国产精品亚洲78 | 91精品久久久久久久久久入口 | 国内精品久久久久久久久 | 天天天操天天天干 | 色综合亚洲精品激情狠狠 | 人人澡澡人人 | 日本中文字幕系列 | 亚州国产精品视频 | 免费一级日韩欧美性大片 | 久久在视频 | 91正在播放 | 国产精品毛片一区 | 亚洲毛片久久 | 婷婷色狠狠 | 久久公开免费视频 | 日韩精品免费一区二区在线观看 | 中文字幕乱码亚洲精品一区 | 亚洲精品免费观看 | 国产色婷婷在线 | 国产在线黄 | 伊人网站 | 国产亚洲一区二区在线观看 | 成人黄色小说网 | 黄污在线观看 | 一区在线观看 | 中文字幕免 | 91久久人澡人人添人人爽欧美 | 久久成人精品电影 | 成人影片在线播放 | 久精品视频在线观看 | 久久超碰免费 | 中文字幕视频免费观看 | av电影在线播放 | 日韩中文字幕免费视频 | 国产视频久久 | 国产精品99视频 | 97人人模人人爽人人喊网 | 亚洲天堂网站视频 | 一区在线免费观看 | 成人在线免费观看网站 | 国产精品一区二区吃奶在线观看 | 国产一级电影免费观看 | 99久久久国产精品免费观看 | 婷婷综合 | 欧美美女激情18p | 国产香蕉97碰碰碰视频在线观看 | 色噜噜狠狠色综合中国 | 黄色一级大片免费看 | 久久精品视频国产 | 国产剧情av在线播放 | 在线亚洲日本 | 一区二区激情视频 | 午夜电影久久久 | 麻豆免费在线播放 | 91精品久久久久久久久久入口 | 91视频免费视频 | 国产在线成人 | 精品国产福利在线 | 天天爽天天爽天天爽 | 国产精品二区三区 | 午夜视频一区二区三区 | 天天天色综合 | 黄色成人在线观看 | 我要看黄色一级片 | 91探花国产综合在线精品 | 激情综合五月天 | 日本成人黄色片 | 中文字幕在线字幕中文 | 中文字幕一二三区 | 香蕉视频国产在线观看 | 在线视频观看亚洲 | 欧美成人999| 婷婷亚洲激情 | 欧美日韩不卡一区二区三区 | 新版资源中文在线观看 | 亚洲免费av在线播放 | 精品视频在线播放 | 黄色成年 | 国产中文视 | 国产一级电影免费观看 | 天天操天天弄 | 一级欧美一级日韩 | 午夜黄色 | 国产精品一区二区三区久久 | 丁香视频免费观看 | 999久久国产 | 激情深爱五月 | 深夜福利视频一区二区 | 国产精品久久久久久久久久东京 | 亚洲永久精品视频 | 国产精品久久久久久欧美 | 欧美极品少妇xbxb性爽爽视频 | 在线免费观看视频一区 | 免费看一级特黄a大片 | 亚洲经典视频 | 韩日精品中文字幕 | 国产一区二区三区久久久 | 欧美精品乱码久久久久久按摩 | 激情五月婷婷综合网 | 亚洲精品久久在线 | 美女网站视频免费黄 | 国产成人亚洲在线观看 | 91在线播放国产 | 久久永久免费视频 | 中文字幕中文字幕在线一区 | 337p欧美 | 久久国产精品成人免费浪潮 | 五月天激情综合网 | 成人一级电影在线观看 | 91精品国产欧美一区二区 | 欧美夫妻性生活电影 | 久久久久综合视频 | 亚洲资源一区 | 久久久精品欧美一区二区免费 | 欧美一级网站 | 六月婷婷久香在线视频 | 天天爱综合 | 久久欧美综合 | 国产精品国产三级国产不产一地 | 激情偷乱人伦小说视频在线观看 | 亚洲永久av| 亚洲精品mv在线观看 | 在线av资源| 99视频精品 | 精品在线你懂的 | 免费观看9x视频网站在线观看 | 精品96久久久久久中文字幕无 | 三上悠亚一区二区在线观看 | 91色吧| 狠狠狠色丁香婷婷综合久久88 | 97精品欧美91久久久久久 | 97在线看| 日韩在线播放欧美字幕 | 9999精品免费视频 | 黄色激情网址 | 四虎影视成人精品 | 麻豆视传媒官网免费观看 | 亚洲aaa级 | 国产精品欧美日韩 | 激情av综合 | 中文字幕在线色 | 免费看v片网站 | 麻豆视传媒官网免费观看 | 日韩精品视频免费在线观看 | 伊人网av| 国产成人精品网站 | 国产一二三区av | 激情视频一区二区三区 | 99热999| 五月天丁香视频 | 97狠狠操 | 成人一级免费视频 | 免费视频久久 | 99视频国产精品 | 久久久久日本精品一区二区三区 | 日韩精品一区二区三区中文字幕 | 免费a一级 | 久久久久久久福利 | 国产 日韩 在线 亚洲 字幕 中文 | 久久人人射 | 不卡av电影在线 | 国产999免费视频 | 人人插人人看 | 色婷婷狠| 国内精品视频久久 | 久久精品日韩 |