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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构与算法随学随记

發布時間:2025/4/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法随学随记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.數據結構是一門研究非數值計算的程序設計問題中的操作對象,以及它們之間的關系和操作等相關問題的學科.

2.傳統上,我們把數據結構分為邏輯結構和物理結構。

邏輯結構:是指數據對象中數據元素之間的相互關系。

物理結構:是指數據的邏輯結構在計算機中的存儲形式。

3.集合結構:集合結構中的數據元素除了同屬于一個集合外,它們之間沒有其他不三不四的關系。

線性結構:線性結構中的數據元素之間是一對一的關系。

樹形結構:樹形結構中的數據元素之間存在一對多的層次關系。

圖形結構:圖形結構的數據元素是多對多的關系。

4.存儲器主要是針對內存而言的,像硬盤、軟盤、光盤等外部存儲器的數據組織通常用文件結構來描述。

6.數據元素的存儲結構形式有兩種:順序存儲和鏈式存儲

順序存儲結構:是把數據元素存放在地址連續的存儲單元里,其數據間的邏輯關系和物理關系是一致的。

7.clock():捕捉從程序開始運行到clock()被調用時所耗費的時間。這個時間單位是clock tick,即“時鐘打點”。

常數CLK_TCK:機器時鐘每秒所走的時鐘大點數。

用法模板:

?

#include<stdio.h> #include<time.h>clock_t start,stop; //clock_t是clock()函數返回的變量類型 double duration; //記錄被測函數運行時間,以秒為單位 int main() {//不在測試范圍內的準備工作寫在clock()調用之前start=clock();//開始計時MyFunction();//把被測函數加在這里stop=clock();duration=((double)(stop-start))/CLK_TCK;//其他不再被測范圍的處理寫在后面,例如輸出duration的值return 0; View Code

8.什么是好的算法:

(1)空間復雜度S(n):根據算法寫成的程序在執行時占用存儲單元的長度。

(2)時間復雜度T(n):根據算法寫成的程序在執行時耗費時間的長度。

在分析一般算法的效率時,我們經常關注下面兩種復雜度

(1)最壞情況復雜度Tworst(n)

(2)平均復雜度Tavg(n)

? ? ? ? ? ? ? ? ? ? ? ? Tavg(n)<=Tworst(n)

9.復雜度常用函數比較大小:

1<logn<n<nlog2n<n2<n3<2n<n!

10.鏈表結點的定義:

鏈表的結點有兩個域:一個是數據域,用來存放數據;另一個是指針域,用來存放下一個結點的位置,如圖所示:

因此,鏈表的結構型定義如下:

typedef struct Node{int data;//這里默認的是int型,如需其他類型那個可直接修改struct Node *next;//指向Node型變量的指針 }Node; View Code

11.二叉樹結點的定義:

typedef struct BTNode{int data;struct BTNode *lchild;struct BTNode *rchild;}BTNode; View Code

12.線性表:由一組數據元素構成,數據元素的位置只取決于自己的序號,元素之間的相對位置是線性的。在復雜線性表中,由若干項數據元素組成的數據元素成為記錄,而由多個記錄構成的線性表又稱為文件。

非空線性表的結構特性:

(1)有且只有一個根節點a1,它無前件。

(2)有且只有一個終端結點an,它無后件

(3)除根節點和終端節點外,其他所有節點有且只有一個前件,也有且只有一個后件。節點個數n為線性表的長度,當n=0時,稱為空表。

13.線性表的順序存儲結構具有以下兩個基本特點:

(1)線性表中所有元素的所占存儲空間是練習的;

(2)線性表中各數據元素再存儲空間中是按邏輯順序依次存放的。

ai?的存儲地址:

ADR(ai)=ADR(ai)+(i-1)K,ADR(ai)為第一個元素的地址,K代表每個元素所占的字節數。

14.順序表的插入運算:

插入的過程:

首先處理3種異常情況:

(1)當存儲空間已滿時為“上溢”錯誤,不能插入,算法結束;

(2)當i>n時,認為在最后一個元素之后插入;

(3)當i<n時,認為在第一個元素之前插入。

然后從最后一個元素開始,直到第i個元素,其中每一個元素均往后移動一個位置。

最后將新元素插入到第i個位置,并且將線性表的長度增加1。

15.順序表的刪除元素

刪除的過程:

首先處理一下2種異常情況:

(1)當線性表為空(即n=0)時即為“上溢”錯誤,算法結束;

(2)當i<1或i>n時,

然后從第i+1個元素開始,直到最后一個元素,其中每個元素依次向前移動一個位置。

最后將線性表的長度減少1。

16.所有的指針變量只占4個字節,用第一個字節的地址表示整個變量的地址。

17.順序表不像鏈表一樣在結點中存在指針域,因此存儲密度大。插入運算方便和刪除運算方便是鏈表的優點。線性表的順序存儲結構必須占用一片連續的存儲空間,而鏈表不需要這樣。順序表不便于元素的插入和刪除,因為要移動多個元素。鏈表在插入和刪除的過程中不需要移動元素,只需修改指針。線性表是具有相同特性數據元素的一個有序序列。

18.靜態鏈表中指針指示的是鏈表中下一元素在數組中的地址。雖然靜態鏈表用數組來存儲,但其指針域和一般單鏈表一樣,指出了表中下一個結點的位置。靜態鏈表具有鏈表的的插入和刪除方便的特點,也不需要移動較多的元素,這是優于順序表的地方。

19.KMP算法

(1)字符串查找問題:給定文本串text和模式串pattern,從文本串text中找出模式串pattern第一次出現的位置

(2)最基本的字符串匹配算法:暴力求解(Brute Force):時間復雜度O(m*n)

(3)KMP算法是一種線性時間復雜度的字符串匹配算法,它是對BF算法改進。

(4)記:文本串長度為N,模式串長度為M

(I)BF算法的時間復雜度O(M*N),空間復雜度O(1);

(II)KMP算法的時間復雜度O(M+N),空間復雜度O(N);

(5)KMP算法的核心就是避免不必要的回溯,那么什么事不必要的呢?問題由模式串決定,不是由目標決定。

(6)分析BF與KMP的區別

(I)假設當前文本串text匹配到i位置,模式串pattern串匹配到j位置

(II)BF算法中,如果當前字符串匹配成功,即text[i+j]==pattern[j],令i++,j++,繼續匹配下一個字符;如果失敗,即text[i+j]=/=(不等于)pattern[j],令i++,j=0;即每次匹配失敗的情況下,模式串pattern相對于文本串text向右移動了一位。

(7)KMP算法中,如果當前字符匹配成功,即text[i+j]==pattern[j],令i++,j++,繼續匹配下一個字符;如果失敗,即text[i+j]=/=(不等于)pattern[j],令i不變,j=next[j],(這里,next[j]<=j-1),即模式串pattern相對于文本串text向右移動了至少1位(移動的實際位數j-next[j]>=1)。

(8)在暴力求解中,為什么模式串的索引會回溯?

因為模式串存在重復字符。

(9)對于模式串的位置j,考察Patternj-1=P0P1...Pj-2Pj-1,查找字符串Patternj-1最大相等k前綴和k后綴。注:計算next[j]時,考察的字符串是模式串的前j-1個字符,與pattern[j]無關。即:查找慢走條件的最大的k,是得P0P1...Pk-2Pk-1?=Pj-kPj-k+1...Pj-2Pj-1?。

(10)next的遞推關系:

(I)對于模式串的位置j,有next[j]=k,即:P0P1...Pk-2Pk-1?=Pj-kPj-k+1...Pj-2Pj-1?

(II)則,對于模式串的位置j+1,考察Pj;

(III)若p[k]==p[j]?

  next[j+1]=next[j]+1

(IV)若p[k]=/=p[j],記h=next[k];如果p[h]==p[j],則next[j+1]=h+1,否則重復此過程。

(11)進一步分析next

(I)文本串匹配到i,模式串匹配到j,此時,若text[i]=/=pattern[j],即匹配失敗的情況:

(II)若next[j]=k,說明模式串應該從j滑動到k位置;

(III)若此時滿足pattern[j]==pattern[k],因為text[i]=/=pattern[j],所以,text[i]=/=pattern[k]

(i)即i和k沒有匹配,應該繼續滑動到next[k]。

(ii)換句話說:若原始的next數組中,若next[j]=k并且pattern[j]==pattern[k],next[j]可以直接等于next[k]。

(12)代碼

//BF算法,暴力算法 int index(Str str,Str substr) {int i=0,j=0,k=i;while(i<str.length&&j<substr.length){if(str.ch[i]==substr.ch[j]){++i;++j;}else{j=0;i=++k;//匹配失敗,i從主串下一位置開始,k種記錄了上一次的啟示位置 }}if(j==substr.length)return k;else return -1; } //KMP算法 int KMP(Str str,Str substr,int next[]) {int i=0,j=0;while(i<str.length&&j<substr.length){if(str.ch[i]==substr.ch[j]){++i;++j;}else{j=next[i];if(j==-1){j=0;++i;}}}if(j==substr.length)return i-substr.length;else return -1; } 求next數組的算法如下 void getnext(Str sbustr,int next[]) {int i=0;j=-1;next[0]=-1;while(i<substr.length){if(j==-1||substr.ch[i]==sbustr.ch[j]){++i;++j;next[i]=j;}elsej=next[j];} } View Code

20.

(1)串是限定了數據元素是字符的線性表,串的數據元素必須是單個字符

(2)串的兩種最基本存儲方式是順序存儲方式和鏈式存儲方式。

(3)空格字符也是串中的一個字符。

21.希爾排序

#include<stdio.h> #include<math.h> #define MAXNUM 10//希爾排序void shellSort(int array[],int n,int t){int a,dk;for(a=1;a<=t;a++){dk=(int)(pow(2,t-a+1)-1);//計算增量 int i,j,temp;for(i=dk;i<n;i++)//分別向每組的有序區域進行插入 {temp=array[i];for(j=i-dk;(j>=i%dk)&&array[j]>temp;j-=dk)//比較與記錄后移同時進行array[j+dk]=array[j];if(j!=i-dk)array[j+dk]=temp;//插入 } }} void main(){void shellSort(int array[],int n,int t);//t為排序的趟數int array[MAXNUM],i;for(i=0;i<MAXNUM;i++)scanf("%d",&array[i]);shellSort(array,MAXNUM,(int)(log(MAXNUM+1)/log(2)));//排序趟數應為long2(n+1)的整數部分for(i=0;i<MAXNUM;i++)printf("%d ",array[i]);printf("\n"); } View Code

22.進行冒泡排序

#include <stdio.h> #include <stdlib.h>#define MAXNUM 10 /* run this program using the console pauser or add your own getch, system("pause") or input loop */void maopaoInsert(int R[],int n) {int i,j,temp;for(j=0;j<n-1;j++)//總共需要排序的次數 {for(i=0;i<n-1-j;i++)//此趟需要排序的個數,也就是從0 .....n-1-j。進行比較 {if(R[i]>R[i+1])//每次進行兩兩比較 {temp=R[i];R[i]=R[i+1];R[i+1]=temp;}}}} void main(){int array[MAXNUM],i;for(i=0;i<MAXNUM;i++)scanf("%d",&array[i]);maopaoInsert(array,MAXNUM);//排序趟數應為long2(n+1)的整數部分for(i=0;i<MAXNUM;i++)printf("%d ",array[i]);printf("\n"); } View Code

23快速排序

#include <stdio.h> #include <stdlib.h>#define MAXNUM 10void kuaisuSort(int a[],int left,int right) {if(left>=right)//如果左邊索引大于或者等于右邊的索引就代表已經整理完成一個組了 {return; } int i=left;int j=right;int key=a[left];//以a[left]為軸中心while(i<j)//控制在當組內尋找一遍 {while(i<j&&key<=a[j])//而尋找結束的條件就是,1,找到一個小于或者大于key的數,沒有符合條件1的,并且i與j的大小沒有反轉 {j--;//向前尋找 } a[i]=a[j];// 找到一個這樣的數后就把他賦給前面的被拿走的i的值(如果第一次循環且key是a[left],那么就是key) while(i<j&&key>=a[i])//這是i在當組內向前尋找,同上,不過注意與key的大小關系停止循環和上面相反,因為排序思想就是把數組網兩邊礽,所以左右兩邊的數大小與key的關系相反 {i++;}a[j]=a[i];} a[i]=key;//當在當組內找完一遍以后就把中間數key回歸kuaisuSort(a,left,i-1);//最后用同樣的方式把對分出來的左邊的小組進行同上的做法kuaisuSort(a,i+1,right);//最后用同樣的方式把對分出來的右邊的小組進行同上的做法 //當然最后可能會出現很多分左右,直到每一組的i=j為止。 } void main(){int array[MAXNUM],i;for(i=0;i<MAXNUM;i++)scanf("%d",&array[i]);kuaisuSort(array, 0,MAXNUM-1); for(i=0;i<MAXNUM;i++)printf("%d ",array[i]);printf("\n"); } View Code

24.簡單選擇排序

#include <stdio.h> #include <stdlib.h>#define MAXNUM 10 /* run this program using the console pauser or add your own getch, system("pause") or input loop */void jiandanxuanzeSort(int R[],int n) {int i,j,min;int minR;//儲存最小的數組 int temp;for(i=0;i<n;i++){minR=R[i];////假設R[i]為本輪最小值 min=i;//將 最小值下標存儲在min中 for(j=i+1;j<n;j++)//從i到n查找最小值 {if(R[j]<minR)//如果有R[j]小于最小值 {minR=R[j];//那么把R[j]賦值給minR行調換 min=j;}}//將尋找到的最小值R[min]與本輪的R[i]對換 temp=R[i];R[i]=R[min];R[min]=temp;} }void main(){int array[MAXNUM],i;for(i=0;i<MAXNUM;i++)scanf("%d",&array[i]);jiandanxuanzeSort(array,MAXNUM); for(i=0;i<MAXNUM;i++)printf("%d ",array[i]);printf("\n"); } View Code

25.最大公約數

//最大公約數 int gcd(int v1,int v2) {while(v2){int temp=v2;v2=v1%v2;v1=temp; } return v1; } View Code

26.交換

(1)指針

#include <iostream>using namespace std;void swap(int *px, int *py) {int temp;temp=*px;*px=*py;*py=temp; }int main() {int a,b;a = 1;b = 10;cout << "傳指針的方法: " << endl;cout << "a = " << a << ", b = " << b << endl;//拷貝的指針(地址) swap(&a,&b);cout << "a = " << a << ", b = " << b << endl;return 0; } View Code

(2)宏函數

#include <iostream>#define SWAP(x,y,t) ((t)=(x),(x)=(y),(y)=(t)) using namespace std;int main() {int a, b, temp;a = 1;b = 10;cout << "使用宏定義函數: " << endl;cout << "a = " << a << ", b = " << b << endl;SWAP(a,b,temp);cout << "a = " << a << ", b = " << b << endl;return 0; } View Code

(3)引用

#include <iostream>using namespace std;//引用就是別名 void swap(int &a,int &b) {int temp;temp=a;a=b;b=temp;} int main() {int a,b;a = 1;b = 10;cout << "傳引用: " << endl;cout << "a = " << a << ", b = " << b << endl;swap(a,b);cout << "a = " << a << ", b = " << b << endl;return 0; } View Code

(4)C++標準庫 swap

#include <iostream>using namespace std;int main() {int a, b;a = 1;b = 10;cout << "使用std::swap函數: " << endl;cout << "a = " << a << ", b = " << b << endl;std::swap(a,b);cout << "a = " << a << ", b = " << b << endl;return 0; } View Code

27.圖

(1)鄰接矩陣

代碼:

#include <iostream>using namespace std;#define MAX_VERTS 20 //保存最多的頂點數 //頂點 class Vertex {public:Vertex(char lab){Label=lab; } private:char Label;};//圖 鄰接矩陣 (對稱) class Graph {public:Graph();~Graph();void addVertex(char lab);//增加頂點 void addEdge(int start,int end);//增加邊void printMatrix();//打印矩陣 private:Vertex* vertexList[MAX_VERTS];//數組(保存最多的定點數) int nVerts;//實際上的頂點數 int adjMat[MAX_VERTS][MAX_VERTS]; //鄰接矩陣 } ;//構造函數,有效點為0,初始化矩陣 Graph::Graph() {nVerts=0;for(int i=0;i<MAX_VERTS;i++){for(int j=0;j<MAX_VERTS;j++){adjMat[i][j]=0;} }} //增加點 void Graph::addVertex(char lab){vertexList[nVerts++]=new Vertex(lab);}// 增加邊 (對稱) void Graph::addEdge(int start,int end){adjMat[start][end]=1;adjMat[end][start]=1;}//打印 void Graph::printMatrix(){for(int i=0;i<nVerts;i++){for(int j=0;j<nVerts;j++){cout<<adjMat[i][j]<<" ";}cout<<endl;}}//析構函數 Graph::~Graph(){for(int i=0;i<nVerts;i++){delete vertexList[i];}} int main() {Graph a;a.addVertex('A');//下標 0 a.addVertex('B');//下標 1a.addVertex('C');//下標 2 a.addVertex('D');//下標 3 a.addVertex('E');//下標 4 a.addEdge(0,1);//連線 A-B a.addEdge(0,3);//連線 A-D a.addEdge(1,0);//連線 B-A a.addEdge(1,4);//連線 B-E a.addEdge(2,4);//連線 C-Ea.addEdge(3,0);//連線 D-Aa.addEdge(3,4);//連線 D-Ea.addEdge(4,1);//連線 E-B a.addEdge(4,2);//連線 E-C a.addEdge(4,3);//連線 E-D a.printMatrix(); return 0; } View Code

(2)鄰接表

#include <iostream> #include <list>using namespace std;class Vertex { public:char Label;Vertex(char lab) { Label = lab; } };ostream& operator<<(ostream& out, const Vertex& v) {cout << v.Label;return out; }template<class T> class Graph { public:Graph(const int vertices) : n(vertices){VertexList = new T*[n];HeadNodes = new list<int>[n];nVerts = 0;}~Graph(){delete[] VertexList;delete[] HeadNodes;}void addVertex(T* v);void addEdge(int start, int end);void printVertice();void printAdjList(); private:T** VertexList;list<int>* HeadNodes;int n;int nVerts; };template<class T> void Graph<T>::addVertex(T* v) {VertexList[nVerts++] = v; }template<class T> void Graph<T>::addEdge(int start, int end) {HeadNodes[start].push_back(end); }template<class T> void Graph<T>::printVertice() {for(int i=0; i<nVerts; i++)cout << *VertexList[i] << " ";cout << endl; }template<class T> void Graph<T>::printAdjList() {for(int i=0; i<nVerts; i++){cout << i << " -> ";for(list<int>::iterator iter = HeadNodes[i].begin(); iter != HeadNodes[i].end(); ++iter)cout << *iter << " -> ";cout << "end" << endl;} }int main() {//Graph<char> g(5);//char a = 'A';//char b = 'B';//char c = 'C';//char d = 'D';//char e = 'E';Graph<Vertex> g(5);Vertex a('A');Vertex b('B');Vertex c('C');Vertex d('D');Vertex e('E');g.addVertex(&a);g.addVertex(&b);g.addVertex(&c);g.addVertex(&d);g.addVertex(&e);g.printVertice();g.addEdge(0,1);g.addEdge(0,3);g.addEdge(1,0);g.addEdge(1,4);g.addEdge(2,4);g.addEdge(3,0);g.addEdge(3,4);g.addEdge(4,1);g.addEdge(4,2);g.addEdge(4,3);g.printAdjList();system("pause");return 0; } View Code

(3)深度優先搜索(DFS) 使用堆棧

?

代碼:(以鄰接矩陣圖形為案例)

#include <iostream> #include<stack>#define MAX_VERTS 20using namespace std;class Vertex { public:Vertex(char lab) { Label = lab; wasVisited=false;//新構造的頂點沒有訪問過 } public:bool wasVisited; char Label; };class Graph { public:Graph();~Graph();void addVertex(char lab);void addEdge(int start, int end);void printMatrix();void showVertex(int v);//顯示頂點 void DFS();//深度優先搜索 private:Vertex* vertexList[MAX_VERTS];int nVerts;int adjMat[MAX_VERTS][MAX_VERTS];int getAdjUnvisitedVertex(int v); //獲得臨接的下一個且沒有訪問的頂點 };void Graph::DFS() {stack<int> gStack;vertexList[0]->wasVisited=true;//頂點 showVertex(0);gStack.push(0);//頂點放入到堆棧 int v;while(gStack.size()>0){v=getAdjUnvisitedVertex(gStack.top());//總是以堆棧中最上一個為準 if(v==-1)// 如果沒有,則返回 gStack.pop();else//找到 {vertexList[v]->wasVisited=true;showVertex(v);gStack.push(v); //找到放入到堆棧中 }}cout<<endl;for(int j=0;j<nVerts;j++)//設置false 可以多次進行搜索 vertexList[j]->wasVisited=false; }//獲得臨接的下一個且沒有訪問的頂點 //是否是鄰接的?是否訪問過 int Graph::getAdjUnvisitedVertex(int v) {for(int j=0;j<nVerts;j++)if((adjMat[v][j]==1)&&(vertexList[j]->wasVisited==false))return j;return -1; } void Graph::showVertex(int v) {cout<<vertexList[v]->Label<<" "; } Graph::Graph() {nVerts = 0;for(int i=0; i<MAX_VERTS; i++)for(int j=0; j<MAX_VERTS; j++)adjMat[i][j] = 0; }void Graph::addVertex(char lab) {vertexList[nVerts++] = new Vertex(lab); }void Graph::addEdge(int start, int end) {adjMat[start][end] = 1;adjMat[end][start] = 1; }void Graph::printMatrix() {for(int i=0; i<nVerts; i++){for(int j=0; j<nVerts; j++)cout << adjMat[i][j] << " ";cout << endl;} }Graph::~Graph() {for(int i=0; i<nVerts; i++)delete vertexList[i]; }int main() {Graph g;g.addVertex('A');// 0g.addVertex('B');// 1g.addVertex('C');// 2g.addVertex('D');// 3g.addVertex('E');// 4 g.addEdge(0,1); // A-Bg.addEdge(0,3); // A-Dg.addEdge(1,0); // B-Ag.addEdge(1,4); // B-Eg.addEdge(2,4); // C-Eg.addEdge(3,0); // D-Ag.addEdge(3,4); // D-Eg.addEdge(4,1); //E-B g.addEdge(4,2);//E-Cg.addEdge(4,3);//E-D g.printMatrix();cout << "深度優先搜索的結果: ";g.DFS();system("pause");return 0; } View Code

?

(4)廣度優先搜索(BFS) 使用隊列

?

?代碼:

#include <iostream> #include <stack> #include<queue> #define MAX_VERTS 20using namespace std;class Vertex { public:Vertex(char lab) { Label = lab; wasVisited = false;} public:bool wasVisited;char Label; };class Graph { public:Graph();~Graph();void addVertex(char lab);void addEdge(int start, int end);void printMatrix();void showVertex(int v);void DFS();void BFS();//廣度優先 private:Vertex* vertexList[MAX_VERTS];int nVerts;int adjMat[MAX_VERTS][MAX_VERTS];int getAdjUnvisitedVertex(int v); };void Graph::DFS() {stack<int> gStack;vertexList[0]->wasVisited = true;showVertex(0);gStack.push(0);int v;while(gStack.size() > 0){v = getAdjUnvisitedVertex(gStack.top());if(v == -1)gStack.pop();else{vertexList[v]->wasVisited = true;showVertex(v);gStack.push(v);}}cout << endl;for(int j=0; j<nVerts; j++)vertexList[j]->wasVisited = false; }void Graph::BFS() {queue<int>gQueue;vertexList[0]->wasVisited=true; //設置頂點為訪問過了,showVertex(0);gQueue.push(0);//把頂點放入到隊列中 int vert1,vert2;while(gQueue.size()>0){vert1=gQueue.front();//把隊列中頂點拿出來 gQueue.pop();//隊列頂點刪除 vert2=getAdjUnvisitedVertex(vert1);//鄰接且沒有訪問過的 while(vert2!=-1)//有 鄰接且沒有訪問過的 {vertexList[vert2]->wasVisited=true;showVertex(vert2);gQueue.push(vert2);//放入到隊列中 vert2=getAdjUnvisitedVertex(vert1);//繼續尋找vert1中其他符合條件的//(因為getAdjUnvisitedVertex這個函數只是保證找到符合條件就返回) }} cout<<endl;for(int j=0; j<nVerts; j++)vertexList[j]->wasVisited = false;} int Graph::getAdjUnvisitedVertex(int v) {for(int j=0; j<nVerts; j++)if((adjMat[v][j] == 1) && (vertexList[j]->wasVisited == false))return j;return -1; }void Graph::showVertex(int v) {cout << vertexList[v]->Label << " "; }Graph::Graph() {nVerts = 0;for(int i=0; i<MAX_VERTS; i++)for(int j=0; j<MAX_VERTS; j++)adjMat[i][j] = 0; }void Graph::addVertex(char lab) {vertexList[nVerts++] = new Vertex(lab); }void Graph::addEdge(int start, int end) {adjMat[start][end] = 1;adjMat[end][start] = 1; }void Graph::printMatrix() {for(int i=0; i<nVerts; i++){for(int j=0; j<nVerts; j++)cout << adjMat[i][j] << " ";cout << endl;} }Graph::~Graph() {for(int i=0; i<nVerts; i++)delete vertexList[i]; }int main() {Graph g;g.addVertex('A');// 0g.addVertex('B');// 1g.addVertex('C');// 2g.addVertex('D');// 3g.addVertex('E');// 4 g.addEdge(0,1); // A-Bg.addEdge(0,3); // A-Dg.addEdge(1,0); // B-Ag.addEdge(1,4); // B-Eg.addEdge(2,4); // C-Eg.addEdge(3,0); // D-Ag.addEdge(3,4); // D-Eg.addEdge(4,1); // E-B g.addEdge(4,2); // E-Cg.addEdge(4,3); // E-D g.printMatrix();cout << "深度優先搜索的結果: ";g.DFS();cout << "廣度優先搜索的結果: ";g.BFS();cout <<endl;system("pause");return 0; } View Code

28.紅黑樹

(1)紅黑樹特征:節點都有顏色,插入和刪除節點時要遵循紅黑規則

(2)紅黑規則:

(I)每一個節點不是紅色的就是黑色的。

(II)根總是黑色的

(III)如果節點時紅色的,則它的子節點必須是黑色的

(IV)從根到葉節點的每條路徑,必須包含相同數目的黑色節點。

(3)修正方法

(I) 修改節點的顏色

(II)旋轉

(4)C++標準庫中的紅黑樹

#include <set> #include <map>using namespace std;int main() {//C++標準庫容器(數據結構):紅黑樹set<int> a;multiset<int> b;map<int,int> c;multimap<int,int> d;a.insert(50);a.insert(40);a.insert(30);return 0; } View Code

(5)紅黑樹(自編)

#include <iostream> #include <sstream> #include <string> #include <vector>// SEE UPDATE COMMENTS AT END OF FILE // 2006-01.29 fixed memory leaks// eliminate need to qualify standard library with std:: using namespace std;// =============================================================== // C++ NEEDS SOME DECLARATIONS BEFORE THE MAIN RedBlackTree class. // skip down a little to line this up with the other side // =============================================================== // requires forward declaration to resolve cycle between NodeVisitor and RedBlackTree template<class T> class RedBlackTree;// use an abstract class for the node visitor. it is templatized to match the templated RedBlackTree declaration template<class T> class NodeVisitor { public:// need a virtual destructor for the concrete classesvirtual ~NodeVisitor() {}// ise a pure virtual function so a concrete class must implement// the proper signaturevirtual void visit(const RedBlackTree<T> *node,int depth) = 0; };// ============================================= // >>>>>>>>>>>>>>>>> RED BLACK TREE STARTS HERE // ============================================= // in line with the STL conventions, this template uses 'by-value' semantics for the contained // object. This means that the 'T' object will need to have the correct constructor and copy assignment // semantics or it won't work. primitive types are OK but object instances would have to be // put together correctly. template<class T> class RedBlackTree {private: /*Red/Black tree implementation based on Algorithms in C++, SedgewickIntroduction To Algorithms Cormen, Thomas H. / Leiserson, Charl es E . / Rivest, Ronald L . The MIT Press 07/1990NOTE : LOOK AT END OF FILE TO SEE DIFFERENCES IN TRAVERSAL IDIOMS */// yes, i could use an enum but since i want to print the values, using an enum is more// trouble than it is worth.static const int red = 0;static const int black = 1;// use a common instance variable naming convention 'm_'. others use a single leading '_'int m_color;T m_val;RedBlackTree *m_left;RedBlackTree *m_right;RedBlackTree(RedBlackTree *b) {m_val = b->m_val;m_left = b->m_left;m_right = b->m_right;m_color = red;}void copy(RedBlackTree *x) {m_val = x->m_val;m_left = x->m_left;m_right = x->m_right;m_color = x->m_color;// UPDATE 2006-01-28// node pointed to by 'x' is no longer needed, delete it. // first make sure the delete won't descend into other nodesx->m_left = 0;x->m_right = 0;delete x;}RedBlackTree *RBinsertLeft(T k,int sw) {RedBlackTree *l;RedBlackTree *b;l = m_left;if (l == 0) {m_left = b = new RedBlackTree(k);}else {b = l->RBinsert(k,sw);}return b;}RedBlackTree *RBinsertRight(T k,int sw) {RedBlackTree *r;RedBlackTree *b;r = m_right;if (r == 0) {m_right = b = new RedBlackTree(k);}else {b = r->RBinsert(k,sw);}return b;}RedBlackTree *rotLeft(){RedBlackTree *x;RedBlackTree *me;if (m_right == 0) return 0;// make the changes in a copy of current node __self// on return, the caller will copy in 'me' to current nodeme = new RedBlackTree(this);x = me->m_right;me->m_right = x->m_left;x->m_left = me;return x;}RedBlackTree *rotRight(){RedBlackTree *x;RedBlackTree *me;if (m_left == 0) return 0;// make the changes in a copy of current node __self// on return, the caller will copy in 'me' to current nodeme = new RedBlackTree(this);x = me->m_left;me->m_left = x->m_right;x->m_right = me;return x;}RedBlackTree *RBinsert(T k,int sw) {RedBlackTree *b = 0;RedBlackTree *x;RedBlackTree *l;RedBlackTree *ll;RedBlackTree *r;RedBlackTree *rr;// if current node is a 4 node, split it by flipping its colors// if both children of this node are red, change this one to red// and the children to blackl = m_left;r = m_right;if ((l != 0)&&(l->m_color==red)&&(r != 0)&&(r->m_color==red)) {m_color = red;l->m_color = black;r->m_color = black;}// go left or right depending on key relationshipif (k < m_val) {// recursively insertb = RBinsertLeft(k,0);// on the way back up check if a rotation is needed// if search path has two red links with same orientation// do a single rotation and flip the color bitsl = m_left;if ((m_color == red)&&(l != 0)&&(l->m_color == red)&&(sw == 1)) {x = rotRight();if (x != 0) {// copy returned node to 'this' copy(x);}}// flip the color bitsl = m_left;if (l != 0) {ll = l->m_left;if (ll != 0) {if ((l->m_color == red)&&(ll->m_color == red)) {x = rotRight();if (x != 0) {copy(x);}m_color = black;r = m_right;if (r != 0) {r->m_color = red;}}}}}else {b = RBinsertRight(k,1);// on the way back up check if a rotation is needed// if search path has two red links with same orientation// do a single rotation and flip the color bitsr = m_right;if ((m_color == red)&&(r != 0)&&(r->m_color == red)&&(sw == 0)) {x = rotLeft();if (x != 0) {// copy returned node to 'this' copy(x);}}// flip the color bitsr = m_right;if (r != 0) {rr = r->m_right;if (rr != 0) {if ((r->m_color == red)&&(rr->m_color == red)) {x = rotLeft();if (x != 0) {// copy returned node to 'this' copy(x);}m_color = black;l = m_left;if (l != 0) {l->m_color = red;}}}}} return b;}// ================================================== // PUBLIC METHODS // ================================================== public:// construct with an initial value RedBlackTree(T x) {m_val = x;m_left = 0;m_right = 0;m_color = red;}~RedBlackTree() {if (m_left != 0) {delete m_left;}if (m_right != 0) {delete m_right;}}// return a string representation string str() const {stringstream s(stringstream::out);// m_val (type T) must have the proper ostream insertion operator// or this implementation won't works << "[" << m_val << "," << m_color << "]";return s.str();}// 'const' means this method doesn't change the object stateT val() const {return m_val;}// 'const' means this method doesn't change the object stateint color() const {return m_color;}// 'const' means this method doesn't change the object state// and it returns a pointer to a const node that the caller// cannot change, only inspectconst RedBlackTree *find(const T &key) const {const RedBlackTree *result = 0;if (key == m_val) {result = this;}else if (key < m_val) {if (m_left != 0) {result = m_left->find(key);}}else {if (m_right != 0) {result = m_right->find(key);}}return result;}// 'const' means this method doesn't change the object state// and the visitor is not allowed to change the object state.// that may not be what is desired but is used here to // illustrate something you can do in C++ that you can't do// in the other languages and that illustrates the bias towards// extensive static type checkingvoid inorder(NodeVisitor<T> *visitor,int depth) const {if (m_left != 0) {m_left->inorder(visitor,depth+1);}visitor->visit(this,depth);if (m_right != 0) {m_right->inorder(visitor,depth+1);}}RedBlackTree *insert(T k) {RedBlackTree *b;b = RBinsert(k,0);m_color = black;return b;} };// define a concrete class for the node visitor class IntNodeVisitor : public NodeVisitor<int> { public:virtual ~IntNodeVisitor() {}// the node is 'const' so the visitor can't change it, only look at itvirtual void visit(const RedBlackTree<int> *node,int depth) {if (node->val() != 0) {cout << "(" << node->val() << ":" << node->color() << ":" << depth << "), ";}} };// ================================== // test program // ================================== int main(int argc,char *argv[]) {int nodelist[] = {11,4,8,14,17,6,9,7,16,15,13,5,19,18,12,10,3,20,1};NodeVisitor<int> *v;// anonymous class implementing the NodeVisitor interfacev = new IntNodeVisitor;// insert all the data into the treeRedBlackTree<int> *root = new RedBlackTree<int>(2);root->insert(11);root->insert(4);root->insert(8);root->insert(14);root->insert(17);root->insert(6);//顯示紅黑樹里的數據root->inorder(v,0);return 0;// need to do an ugly calculation to figure out length of the nodelist array// if i used a collection object instead of an array, then I couldn't have// done static initialization. so its a tradeofffor(int i=0;i<(sizeof(nodelist)/sizeof(nodelist[0]));i++) {root->insert(nodelist[i]);}// print the headercout << "C++ = "; // visit all the nodes in orderroot->inorder(v,0);// print a newlinecout << endl;// find the specified element and print its valueconst RedBlackTree<int> *x = root->find(16);cout << x->str() << endl;// no garbage collection, need to explicitly deletedelete root; // will recursively delete all the nodesdelete v; }// =================================================================== // UPDATE 2006-01-29 // there are memory leaks that need to be fixed. // 1. the algorithm leaks nodes after a rotate // two possible fixes : // find where the leaks occur and do the needed deletes // in this case the 'copy' method handles // deleting unused nodes // use an appropriate smart pointer to handle deleteing // 2. the tree is not properly disposed of when the program completes // In the STL tradition a delete of the tree should // delete all tree resources but not the contained data. the application // should handle deleting the contained data elements, if needed, prior // to deleting the tree. In this case a recursive delete of the // nodes works gets rid of the tree resources // // these issue show that one of the big difficulties in C++ is to // handle disposing of data after you are done with it. that is indeed a // source of many C++ program errors of the type that are related more to // dealing with the complexity of the language rather than the solving // the problem. In this code the leaks are probably fixed but there is always // a lingering doubt "Did I get all the leaks?" // Thats a problem with C++, its hard to be certain. // // a modern approach is to use smart pointers to simulate garbage // collection. the Boost library referenced counted smart pointers // will be included in the next standard revision of the C++ library // so they are used here to handle all the cases. // =================================================================== View Code

(6)紅黑樹(模版)

#ifndef RED_BLACK_TREE_H_ #define RED_BLACK_TREE_H_#include "Wrapper.h" #include "Except.h"// Red-black tree class. // // CONSTRUCTION: with negative infinity object // // ******************PUBLIC OPERATIONS********************* // void insert( x ) --> Insert x // void remove( x ) --> Remove x (unimplemented) // Comparable find( x ) --> Return item that matches x // Comparable findMin( ) --> Return smallest item // Comparable findMax( ) --> Return largest item // bool isEmpty( ) --> Return true if empty; else false // void makeEmpty( ) --> Remove all items // ******************ERRORS******************************** // Throws exceptions as warranted. template <class Comparable> class RedBlackTree;template <class Comparable> class RedBlackNode;template <class Comparable> class RedBlackTree {public:RedBlackTree( const Comparable & negInf );RedBlackTree( const RedBlackTree & rhs );~RedBlackTree( );Cref<Comparable> findMin( ) const;Cref<Comparable> findMax( ) const;Cref<Comparable> find( const Comparable & x ) const;bool isEmpty( ) const;void makeEmpty( );void insert( const Comparable & x );void remove( const Comparable & x );enum { RED, BLACK };const RedBlackTree & operator=( const RedBlackTree & rhs );typedef RedBlackNode<Comparable> Node;private:Node *header; // The tree header (contains negInf)Node *nullNode;// Used in insert routine and its helpers (logically static)Node *current;Node *parent;Node *grand;Node *great;// Usual recursive stuffvoid reclaimMemory( Node *t ) const;RedBlackNode<Comparable> * clone( Node * t ) const;// Red-black tree manipulationsvoid handleReorient( const Comparable & item );RedBlackNode<Comparable> * rotate( const Comparable & item,Node *parent ) const;void rotateWithLeftChild( Node * & k2 ) const;void rotateWithRightChild( Node * & k1 ) const; };template <class Comparable> class RedBlackNode {Comparable element;RedBlackNode *left;RedBlackNode *right;int color;RedBlackNode( const Comparable & theElement = Comparable( ),RedBlackNode *lt = NULL, RedBlackNode *rt = NULL,int c = RedBlackTree<Comparable>::BLACK ): element( theElement ), left( lt ), right( rt ), color( c ) { }friend class RedBlackTree<Comparable>; };// Construct the tree. // negInf is a value less than or equal to all others. template <class Comparable> RedBlackTree<Comparable>::RedBlackTree( const Comparable & negInf ) {nullNode = new Node;nullNode->left = nullNode->right = nullNode;header = new Node( negInf );header->left = header->right = nullNode; }// Copy constructor. template <class Comparable> RedBlackTree<Comparable>::RedBlackTree( const RedBlackTree<Comparable> & rhs ) {nullNode = new Node;nullNode->left = nullNode->right = nullNode;header = new Node( rhs.header->element );header->left = header->right = nullNode;*this = rhs; }// Destroy the tree. template <class Comparable> RedBlackTree<Comparable>::~RedBlackTree( ) {makeEmpty( );delete nullNode;delete header; }// Insert item x into the tree. // Throws DuplicateItemException if x is already present. template <class Comparable> void RedBlackTree<Comparable>::insert( const Comparable & x ) {current = parent = grand = header;nullNode->element = x;while( current->element != x ){great = grand; grand = parent; parent = current;current = x < current->element ? current->left : current->right;// Check if two red children; fix if soif( current->left->color == RED && current->right->color == RED )handleReorient( x );}// Insertion fails if already presentif( current != nullNode )throw DuplicateItemException( );current = new Node( x, nullNode, nullNode );// Attach to parentif( x < parent->element )parent->left = current;elseparent->right = current;handleReorient( x ); }// Remove item x from the tree. // Not implemented in this version. template <class Comparable> void RedBlackTree<Comparable>::remove( const Comparable & x ) {cout << "Sorry, remove unimplemented; " << x <<" still present" << endl; }// Find the smallest item the tree. // Return the smallest item wrapped in a Cref object. template <class Comparable> Cref<Comparable> RedBlackTree<Comparable>::findMin( ) const {if( isEmpty( ) )return Cref<Comparable>( );Node *itr = header->right;while( itr->left != nullNode )itr = itr->left;return Cref<Comparable>( itr->element ); }// Find the largest item in the tree. // Return the largest item wrapped in a Cref object. template <class Comparable> Cref<Comparable> RedBlackTree<Comparable>::findMax( ) const {if( isEmpty( ) )return Cref<Comparable>( );Node *itr = header->right;while( itr->right != nullNode )itr = itr->right;return Cref<Comparable>( itr->element ); }// Find item x in the tree. // Return the matching item wrapped in a Cref object. template <class Comparable> Cref<Comparable> RedBlackTree<Comparable>::find( const Comparable & x ) const {nullNode->element = x;Node *curr = header->right;for( ; ; ){if( x < curr->element )curr = curr->left;else if( curr->element < x )curr = curr->right;else if( curr != nullNode )return Cref<Comparable>( curr->element );elsereturn Cref<Comparable>( );} }// Make the tree logically empty. template <class Comparable> void RedBlackTree<Comparable>::makeEmpty( ) {reclaimMemory( header->right );header->right = nullNode; }// Test if the tree is logically empty. // Return true if empty, false otherwise. template <class Comparable> bool RedBlackTree<Comparable>::isEmpty( ) const {return header->right == nullNode; }// Deep copy. template <class Comparable> const RedBlackTree<Comparable> & RedBlackTree<Comparable>::operator=( const RedBlackTree<Comparable> & rhs ) {if( this != &rhs ){makeEmpty( );header->right = clone( rhs.header->right );}return *this; }// Internal method to clone subtree. template <class Comparable> RedBlackNode<Comparable> * RedBlackTree<Comparable>::clone( Node * t ) const {if( t == t->left ) // Cannot test against nullNode!!!return nullNode;elsereturn new RedBlackNode<Comparable>( t->element, clone( t->left ),clone( t->right ), t->color ); }// Internal routine that is called during an insertion // if a node has two red children. Performs flip and rotations. // item is the item being inserted. template <class Comparable> void RedBlackTree<Comparable>::handleReorient( const Comparable & item ) {// Do the color flipcurrent->color = RED;current->left->color = BLACK;current->right->color = BLACK;if( parent->color == RED ) // Have to rotate {grand->color = RED;if( item < grand->element != item < parent->element )parent = rotate( item, grand ); // Start dbl rotatecurrent = rotate( item, great );current->color = BLACK;}header->right->color = BLACK; // Make root black }// Internal routine that performs a single or double rotation. // Because the result is attached to the parent, there are four cases. // Called by handleReorient. // item is the item in handleReorient. // parent is the parent of the root of the rotated subtree. // Return the root of the rotated subtree. template <class Comparable> RedBlackNode<Comparable> * RedBlackTree<Comparable>::rotate( const Comparable & item,Node *theParent ) const {if( item < theParent->element ){item < theParent->left->element ?rotateWithLeftChild( theParent->left ) : // LLrotateWithRightChild( theParent->left ) ; // LRreturn theParent->left;}else{item < theParent->right->element ?rotateWithLeftChild( theParent->right ) : // RLrotateWithRightChild( theParent->right ); // RRreturn theParent->right;} }// Rotate binary tree node with left child. template <class Comparable> void RedBlackTree<Comparable>:: rotateWithLeftChild( Node * & k2 ) const {Node *k1 = k2->left;k2->left = k1->right;k1->right = k2;k2 = k1; }// Rotate binary tree node with right child. template <class Comparable> void RedBlackTree<Comparable>:: rotateWithRightChild( Node * & k1 ) const {Node *k2 = k1->right;k1->right = k2->left;k2->left = k1;k1 = k2; }// Internal method to reclaim internal nodes in subtree t. template <class Comparable> void RedBlackTree<Comparable>::reclaimMemory( Node *t ) const {if( t != t->left ){reclaimMemory( t->left );reclaimMemory( t->right );delete t;} }#endif View Code

?29.冒泡排序

(1)從左到右掃描數據,選擇最大的數據,放在右邊。

(2)要點:比較相鄰的兩個樹,如果左邊的數大于右邊的數就進行交換。

(3)代碼:

#include <iostream>using namespace std;void BubbleSort(int list[], int n);int main() {int a[] = {2,4,6,8,0,1,3,5,7,9};BubbleSort(a,10);for(int k=0; k<10; k++)cout << a[k] << " ";cout << endl;return 0; }void BubbleSort(int list[], int n) {for(int i=0; i<n-1; i++){for(int j=0; j<n-i-1;j++){if(list[j] > list[j+1])std::swap(list[j],list[j+1]);}} } View Code

30選擇排序

(1)從當前未排序的整數中找一個最小的整數,將它放在已排序的整數列表的最后。

(2)要點:選擇排序最小的,往左邊選。

#include <iostream>using namespace std;void SelectSort(int *a, const int n);int main() {int x[] = {1,3,5,7,9,0,2,4,6,8};SelectSort(x,10);for(int k=0; k<10; k++)cout << x[k] << endl;return 0; }void SelectSort(int *list, const int n) {// i<nfor(int i=0; i<n-1; i++){int min = i; //min就是毛巾,毛巾是數組的下標for(int j=i+1; j<n; j++){if(list[j] < list[min])min = j;}swap(list[i],list[min]);} } View Code

31.折半查找

v#include <iostream>using namespace std;int BinarySearch(int *a, const int x, const int n); int BinSearch(int *a, const int x, const int n);int main() {int x[] = {1,2,3,4,5,6,7,8,9,10};int 結果;int num;num = 6;結果 = BinSearch(x, num, 10);if(結果 < 0)cout << "沒找到! " << endl;elsecout << "在x[" << 結果 << "]找到" << num << endl;return 0; }int BinSearch(int *a, const int x, const int n) {int left = 0, right = n-1;while(left<=right){int middle = (left + right)/2;if(x < a[middle]) right = middle-1;else if(x > a[middle]) left=middle+1;else return middle;}return -1; }int BinarySearch(int *a, const int x, const int n) {int low, high, mid;low = 0, high = n-1;while(low<=high){mid = (low + high) / 2;if(a[mid] == x)return mid;else if(a[mid] < x)low = mid+1;else if(a[mid] > x)high = mid - 1;}return -1; } View Code #include <iostream>using namespace std;int BinarySearch_I(int *a, const int x, const int n); int BinarySearch_R(int *a, const int x, const int left, const int right);int main() {int m[] = {1,2,3,4,5,6,7,8,9};int 結果;int num = 7;if((結果 = BinarySearch_R(m,num,0,8))<0){cout << "遞歸算法: 沒找到!" << endl;}else{cout << "遞歸算法: 在m[" << 結果 << "]找到" << num << endl;}if((結果 = BinarySearch_I(m,num,9))<0){cout << "迭代算法: 沒找到!" << endl;}else{cout << "迭代算法: 在m[" << 結果 << "]找到" << num << endl;}return 0; }int BinarySearch_I(int *a, const int x, const int n) {int left = 0, right = n-1;while(left <= right){int middle = (left+right)/2;if(x<a[middle]) right = middle-1;else if(x>a[middle]) left = middle + 1;else return middle;}return -1; }int BinarySearch_R(int *a, const int x, const int left, const int right) {if(left<=right){int middle = (left+right)/2;if(x<a[middle]) return BinarySearch_R(a,x,left,middle-1);else if(x>a[middle]) return BinarySearch_R(a,x,middle+1,right);else return middle;}return -1; } View Code

32.排列組合

#include <iostream>using namespace std; //字符,開始的下標,最后的下標 void Permutations(char *p,const int k,const int m) {//k的變換, Permutations(p,k+1,m)中的k+1賦值給了k if(k==m)//已經到了最后一個,不需要遞歸 {cout<<"ddddddddddddd"<<endl;for(int i=0;i<=m;i++)cout<<p[i];cout<<endl; } else{for(int i=k;i<=m;i++ ){swap(p[k],p[i]);//調換開頭 abc,讓 a,b,c依次開頭 Permutations(p,k+1,m);//加入確定了 a 繼續讓bc依次遞歸 swap(p[k],p[i]);//還原 } } }int main() {char s[]="abc";Permutations(s,0,2); return 0; } View Code

33.快速排序

#include <iostream>using namespace std;template<class T> void QuickSort(T *a, const int left, const int right) {if(left<right){//選樞軸int i = left;int j = right+1; //為什么要加一?int pivot = a[left];//劃分算法do{do i++; while(a[i]<pivot);do j--; while(a[j]>pivot);if(i<j) swap(a[i],a[j]);}while(i<j);swap(a[left],a[j]);QuickSort(a,left,j-1);QuickSort(a,j+1,right);} }int main() {int k[] = {8,6,4,2,0,1,3,5,7,9,99};QuickSort(k,0,9);for(int i=0; i<10; i++)cout << k[i] << endl;return 0; } View Code

34.約瑟夫問題

據說著名猶太歷史學家Josephus有過以下的故事:在羅馬人占領喬塔帕特后,39個猶太人與Josephus以及他的朋友多到一個洞中,39個猶太人決定死也不要被敵人抓住,于是決定了一個自殺方式,41個人排成一個園圈,由第1個人開始報數,每報道第3個個就必須自殺,然后再由下一個重新報數,直到所有人自殺身亡為止。

然而Josephus和它的朋友安排在第16個和第31個為止,于是逃過了這場死亡游戲。

程序模擬給出了死亡游戲自殺順序。

//n個人圍圈報數,報m出列,最后剩下的是幾號? #include <stdio.h> #include <stdlib.h>typedef struct node {int data;//存儲了排列的序號。struct node *next; }node;//創建循環鏈表 node *create(int n) {node *p = NULL, *head;head = (node*)malloc(sizeof (node ));p = head;node *s;int i = 1;if( 0 != n ){//尾后插入法while( i <= n ){s = (node *)malloc(sizeof (node));s->data = i++; // 為循環鏈表初始化,第一個結點為1,第二個結點為2。p->next = s;p = s;}s->next = head->next;//最后一個節點指向第一個節點(不是頭節點) }free(head);//刪除頭節點return s->next ;//返回第一個節點 }int main() {int n = 41;int m = 3;int i;node *p = create(n);node *temp;m %= n; // m在這里是等于3while (p != p->next )//鏈表剩下最后一個 {for (i = 1; i < m-1; i++)//找到第一個節點 {p = p->next ;//p指向第二節點 }printf("%d->", p->next->data );//打印第三個節點的數值 temp = p->next ; //刪除第m個節點p->next = temp->next ;free(temp);p = p->next ;//p是第四個節點 }printf("%d\n", p->data );//打印最后一個return 0; } View Code

?

轉載于:https://www.cnblogs.com/heisaijuzhen/p/4285274.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的数据结构与算法随学随记的全部內容,希望文章能夠幫你解決所遇到的問題。

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

天天se天天cao天天干 | 色综合天天综合在线视频 | 91激情 | 色婷婷狠狠五月综合天色拍 | 国产在线一区观看 | 最近免费观看的电影完整版 | 欧美综合干 | 91插插视频 | 亚洲精品综合久久 | 六月丁香婷婷网 | 国产精品久久久久久五月尺 | 九九热免费在线视频 | 一本色道久久精品 | 中国美女一级看片 | 亚洲japanese制服美女 | 国产高清久久久久 | 精品资源在线 | 中文字幕一区二区三区久久 | а天堂中文最新一区二区三区 | 日韩美精品视频 | 中文字幕最新精品 | 亚洲在线网址 | 国产黄大片 | 波多野结衣电影久久 | 最近字幕在线观看第一季 | av线上免费观看 | 黄色小网站在线 | 91人人澡 | 91精品在线免费观看 | 国产精品高潮呻吟久久av无 | 91pony九色丨交换 | 成年人av在线播放 | 一区二区三区高清 | 亚洲区另类春色综合小说校园片 | 激情欧美一区二区免费视频 | 不卡视频一区二区三区 | 91九色最新 | 最近中文字幕免费大全 | 在线观看免费 | 黄色片网站| 又湿又紧又大又爽a视频国产 | 天天操天天干天天玩 | 天天爱天天插 | 就要色综合 | 日本在线观看中文字幕无线观看 | 日韩电影在线观看一区二区 | 日本在线观看一区二区三区 | 免费观看全黄做爰大片国产 | 91精品国产92久久久久 | 久草在线视频看看 | 狠狠色噜噜狠狠狠合久 | 99视频国产在线 | 天天操天天舔天天干 | 九九热在线精品 | 日韩啪啪小视频 | 四虎国产精品成人免费影视 | 国产亚洲激情视频在线 | 深爱五月激情五月 | a级片久久 | 久久人人爽人人爽人人片av免费 | 成人av免费在线观看 | 日韩无在线 | 久久久亚洲影院 | 国产在线 一区二区三区 | 狠狠激情中文字幕 | 91成人亚洲 | www麻豆视频 | 四虎国产精品免费 | 欧美 国产 视频 | 中文字幕色综合网 | 91九色视频在线 | 久久久久久久久久久免费av | 日免费视频 | 日韩精品免费在线观看视频 | 国产成人高清av | 久久精品一区二区三区四区 | 看片网站黄色 | av电影在线不卡 | 福利视频一区二区 | 亚洲欧洲国产日韩精品 | 久久视频二区 | 五月天色站 | 亚洲国产精品成人综合 | 一区三区视频 | 99精品国产99久久久久久福利 | 在线成人小视频 | 婷婷在线网 | 97人人视频 | 91手机视频 | 免费福利视频网站 | 久久99爱视频 | adc在线观看| 天天操天天添天天吹 | 中文字幕视频 | 国产日韩欧美在线一区 | 日日夜夜操av | 在线观看午夜 | 色婷婷亚洲婷婷 | 女人高潮特级毛片 | 就操操久久 | 欧美一级乱黄 | av福利超碰网站 | 国产成人精品一区二区在线 | 中文字幕在线一区观看 | 99国产成+人+综合+亚洲 欧美 | 五月婷婷在线视频观看 | 黄色小说在线免费观看 | 国产精品久久久久av福利动漫 | av在线影视| 91日韩精品视频 | 丝袜少妇在线 | 亚洲精品乱码久久久久久蜜桃91 | 丁香婷婷深情五月亚洲 | 黄色国产大片 | 人人澡人人干 | 亚洲国产精品成人av | 亚洲国产精品一区二区久久,亚洲午夜 | 中文在线www | 国产高清视频在线 | 天天干视频在线 | 韩国av一区 | 97色国产 | 欧美在线视频一区二区 | 亚洲成人第一区 | 五月天六月丁香 | 91久久国产自产拍夜夜嗨 | 日韩视频免费在线 | 国产精品入口a级 | 亚洲黄色三级 | 亚洲视频 中文字幕 | 开心丁香婷婷深爱五月 | 在线激情av电影 | 欧美日韩精品在线观看 | 国产美女久久久 | 91在线播放视频 | 国产精品不卡 | 美女视频一区 | 69亚洲精品 | 91精品婷婷国产综合久久蝌蚪 | 天天操天天操 | 亚洲精品在线观看的 | 成人毛片一区 | 亚洲日本国产精品 | 成年免费在线视频 | 久久久久久国产精品美女 | 国产一级视频 | 国产精品18毛片一区二区 | 深爱激情亚洲 | 五月婷久久 | 国产高清在线观看 | 天天精品视频 | 欧美激情xxxx性bbbb | 日韩精品一区二区三区在线视频 | 色综合五月| 伊人午夜视频 | 国产精品mv在线观看 | 国产露脸91国语对白 | 日本99热 | 亚洲第一区精品 | 亚洲精品视频在线观看免费视频 | 国产美女网站在线观看 | 精品亚洲成人 | 蜜桃麻豆www久久囤产精品 | 丁香五月缴情综合网 | 六月丁香婷婷久久 | 丁香5月婷婷久久 | 人人干免费 | 中文字幕国产视频 | 91一区二区三区久久久久国产乱 | 日韩a级黄色 | 五月婷婷操 | 国产第一页在线观看 | 久久久黄视频 | av丁香| 欧美一级片免费播放 | 久久少妇免费视频 | 六月丁香综合网 | 日韩午夜在线播放 | 午夜免费在线观看 | 九九久久久久久久久激情 | 超碰人人av| 国产日韩在线一区 | 久久九九免费 | 久久五月婷婷丁香 | 91精品国产自产老师啪 | 国产99久久久欧美黑人 | 欧美日韩在线观看一区二区 | 中文字幕一区二区三区视频 | 999视频网站 | 91精品国产欧美一区二区成人 | 五月天com | 国产高清区 | 久久这里只有精品视频首页 | 网站在线观看日韩 | 国产小视频免费观看 | 免费看污在线观看 | 中文字幕亚洲综合久久五月天色无吗'' | 久久久久高清毛片一级 | 麻豆视频一区 | 在线亚州 | 中文理论片 | 成片人卡1卡2卡3手机免费看 | 天天射天天艹 | 成人小视频在线免费观看 | 国产在线中文 | 久久久福利视频 | 99视频播放 | 日韩大片在线免费观看 | 久久国产成人午夜av影院宅 | 青青视频一区 | 在线视频日韩精品 | 91av在线视频免费观看 | 久久黄色小说视频 | 亚洲精品动漫成人3d无尽在线 | 超碰免费成人 | av观看在线观看 | 狠狠网站 | 成人a在线观看 | 一区二区三区免费在线观看 | 久久久久久久免费看 | 婷婷视频导航 | 日韩理论片在线 | www.夜夜操.com | 日精品在线观看 | 久草在线官网 | 色婷婷天天干 | 色在线免费视频 | 精品在线视频播放 | 成年人免费av网站 | 99av国产精品欲麻豆 | 久久丁香网| 一本一道久久a久久精品 | 精品无人国产偷自产在线 | 日日躁你夜夜躁你av蜜 | 高清免费在线视频 | 激情五月婷婷丁香 | 黄色av一区 | 日韩精品首页 | 亚洲黄色小说网址 | 欧美在线视频二区 | 久久不见久久见免费影院 | 欧美一区二区视频97 | 夜又临在线观看 | 国产成人精品一区在线 | 亚洲精品国产精品99久久 | 日本韩国中文字幕 | 91九色在线播放 | 在线 成人 | 婷婷色网址 | 久av电影 | 亚洲精品小区久久久久久 | 亚洲人成人天堂h久久 | 中文字幕免费观看全部电影 | 国内精品久久久久久久久久久久 | 午夜久久电影网 | 久久国产精品色av免费看 | 国产精品一区二区电影 | 日韩在线理论 | 中文字幕在线观看完整 | 超碰国产在线播放 | 亚洲精品视频第一页 | 成人国产精品一区二区 | 麻豆一精品传二传媒短视频 | 国产成人精品国内自产拍免费看 | 在线看片中文字幕 | 日韩激情片在线观看 | 特级xxxxx欧美 | 国产成a人亚洲精v品在线观看 | 九九激情视频 | 69成人在线 | 国产成人亚洲在线观看 | 免费观看xxxx9999片 | 在线不卡的av | 久久久亚洲国产精品麻豆综合天堂 | 成年人视频在线免费 | 国产中文字幕大全 | 国产精品免费观看网站 | 美女黄频在线观看 | 日韩午夜电影院 | 亚洲综合色播 | 久草在线在线 | h文在线观看免费 | 91网在线观看 | 天堂av在线 | 亚洲电影av在线 | 蜜桃视频精品 | 五月天婷婷综合 | 探花视频免费观看高清视频 | 91人人澡| 久久亚洲精品国产亚洲老地址 | 久久久久欧美精品999 | 久久国产精品一区二区 | 久久视频网 | 欧美色一色| 亚洲精品人人 | 激情视频国产 | 亚洲国产婷婷 | 国产一级二级视频 | 欧美午夜性| 91亚洲精品乱码久久久久久蜜桃 | 亚洲女欲精品久久久久久久18 | 五月婷婷在线视频观看 | 午夜精品视频一区二区三区在线看 | 中文字幕在线视频一区二区三区 | 国产一区二区电影在线观看 | 日日天天 | 伊香蕉大综综综合久久啪 | 日韩午夜在线播放 | 亚洲1级片| 欧美91精品久久久久国产性生爱 | 国产精品久久一区二区三区不卡 | 91视频观看免费 | 国内揄拍国内精品 | 婷婷成人在线 | 亚洲三级国产 | 日韩欧美在线一区二区 | 2018好看的中文在线观看 | 天天干,天天射,天天操,天天摸 | 国产高清 不卡 | www.久艹| 日韩网站免费观看 | 日本字幕网 | 99久久精品久久久久久动态片 | 18岁免费看片 | 国产精品美女视频 | 国产成人黄色在线 | 欧美在线观看视频一区二区 | 国产午夜精品av一区二区 | 懂色av懂色av粉嫩av分享吧 | 国产成人一级电影 | 日本久久久影视 | 国产精品美女免费视频 | 日韩精品免费在线观看视频 | 国产成人久久精品77777 | 欧美成人一区二区 | 精品国产福利在线 | 中国一级片在线 | 色视频网页| 免费在线观看成人 | 十八岁以下禁止观看的1000个网站 | 综合激情伊人 | 黄网站色欧美视频 | 韩国一区二区三区在线观看 | 天天综合网在线观看 | 成人理论电影 | 天堂av在线免费 | av免费在线网站 | 亚洲国产精品成人va在线观看 | 久久理论电影 | 亚洲无吗视频在线 | 91高清完整版在线观看 | 免费一级日韩欧美性大片 | 91成人蝌蚪| 久久亚洲美女 | 黄网站免费看 | 免费看片网页 | 久久社区视频 | 国产精品刺激对白麻豆99 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 国产高清在线观看av | 免费精品人在线二线三线 | 成人午夜免费福利 | 亚洲欧洲日韩 | 黄色天堂在线观看 | 国产精品一区二区三区视频免费 | 久久久五月天 | 欧美视频在线观看免费网址 | 久久伊人精品一区二区三区 | 久草成人在线 | 蜜桃av观看| 久草视频中文在线 | 九九热在线视频 | 97色资源 | 国产精品九九久久久久久久 | 亚洲爱爱视频 | 色噜噜在线观看 | 婷婷色站| 97在线播放视频 | 久久av观看 | 91av欧美 | 在线观看亚洲国产 | 国产糖心vlog在线观看 | 免费一级片观看 | 91色吧 | 91亚洲精品久久久蜜桃借种 | 色精品视频 | 人交video另类hd | 午夜精品福利一区二区三区蜜桃 | 亚洲视频资源在线 | 久草在线视频中文 | 免费看黄的| 成人亚洲免费 | 一本一本久久a久久精品牛牛影视 | 在线观看精品 | 久久国精品 | 久久精品三 | 欧美不卡视频在线 | 国产亚洲资源 | www视频免费在线观看 | 国产精品一区二区久久精品爱微奶 | 成人9ⅰ免费影视网站 | 丁香六月五月婷婷 | 91成品视频 | 欧美另类美少妇69xxxx | 国产一级h| 国产视频在线播放 | 国产黄色一级大片 | 97热在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 日韩特黄一级欧美毛片特黄 | 一区二区三区电影大全 | 91丨九色丨勾搭 | 亚洲精品 在线视频 | 天天看天天干 | 免费观看的黄色片 | 国产一区二区三区在线免费观看 | 久草新在线 | 在线观看一级片 | 成年人免费在线 | 九九综合久久 | 国产精品一区二区三区电影 | 亚洲砖区区免费 | 五月综合激情 | 久久久香蕉视频 | 色小说av | 日本中文字幕视频 | 一区二区三区视频在线 | 日韩精品1区2区 | 97精产国品一二三产区在线 | 国内视频 | 99久热在线精品 | 欧美aa在线观看 | 在线观看av中文字幕 | av黄色国产 | 香蕉视频在线网站 | 久久久久久久久久久成人 | 午夜精品久久久久久久99水蜜桃 | 久草视频99 | 欧美aⅴ在线观看 | 黄色大全视频 | 91成人天堂久久成人 | 国产在线综合视频 | 国产在线观看一 | 日韩中文字幕免费在线观看 | 正在播放久久 | 天天搞天天干 | 999热线在线观看 | 玖玖玖国产精品 | 天天操人| 日韩高清一 | 中文字幕一区二区三区四区在线视频 | 久久99最新地址 | 超碰97人人爱 | 伊人干综合 | 十八岁免进欧美 | 五月开心婷婷网 | 超碰97国产精品人人cao | 一区二区欧美在线观看 | 久久久www免费电影网 | 色综合天天色 | 精品国产亚洲一区二区麻豆 | 伊人伊成久久人综合网站 | 色综合激情久久 | 96香蕉视频 | 天天射日 | 综合精品久久 | 久久久久99精品成人片三人毛片 | 亚洲天堂精品视频在线观看 | 91成人小视频 | 亚洲免费婷婷 | 少妇高潮流白浆在线观看 | 亚洲一区二区精品3399 | 天天插综合 | 四虎在线永久免费观看 | 日韩区欠美精品av视频 | 国产一级特黄电影 | 亚洲成av人片| 激情综合中文娱乐网 | 狠狠操导航 | 亚洲精品久久激情国产片 | 天天操夜夜操国产精品 | 亚洲 欧美 精品 | 国产成人久久精品77777综合 | v片在线播放| 999久久久久 | 色婷婷九月 | 国产r级在线观看 | 天天草夜夜 | 久久久999精品视频 国产美女免费观看 | 久久精品在线视频 | 啪嗒啪嗒免费观看完整版 | 色午夜 | 怡红院成人在线 | 天天射网 | 99电影| 久久免费激情视频 | 五月天九九 | 四虎国产精品成人免费影视 | 爱情影院aqdy鲁丝片二区 | 人人澡人人草 | 一本一本久久a久久精品综合妖精 | 天天骚夜夜操 | 久久爱资源网 | 毛片网免费 | 国产成a人亚洲精v品在线观看 | 亚洲无吗av | 国产精品三级视频 | 91av在| 色播激情五月 | 国产 视频 久久 | 国产一级视频在线免费观看 | 日韩精品中字 | 精品一区二区免费在线观看 | 久久精品中文字幕少妇 | 91精品国产电影 | 欧美孕妇视频 | 国内精品久久久久影院一蜜桃 | 久久69精品 | av国产网站 | 日韩三级视频在线观看 | 91成人精品一区在线播放69 | 日韩av电影免费观看 | 国产区 在线 | 91精品免费看 | 草草草影院 | 一区二区不卡在线观看 | 91免费看片黄 | 久久伦理 | 日本中文在线播放 | 婷婷五天天在线视频 | 国产婷婷在线观看 | 日本 在线 视频 中文 有码 | 日韩av影视 | 激情五月六月婷婷 | 激情五月开心 | 国产精品18久久久久久久久久久久 | 国产黄网在线 | 九九热精 | 免费看成年人 | 中文字幕第一页在线vr | 国产尤物一区二区三区 | 日韩精品视频免费专区在线播放 | 人人狠狠综合久久亚洲 | 国产中文字幕一区二区 | 午夜影院日本 | 久久91久久久久麻豆精品 | 美女中文字幕 | 美女国内精品自产拍在线播放 | 免费在线观看中文字幕 | 久久精品国产亚洲精品2020 | 亚洲成 人精品 | 久久久免费少妇 | a精品视频 | 91看片在线看片 | 国产成人免费精品 | 日韩一区二区三区不卡 | 麻豆成人小视频 | 在线免费日韩 | av韩国在线 | 精品国产免费一区二区三区五区 | 丰满少妇在线观看 | 久久久精品| 久草青青在线观看 | 韩日三级av | 波多野结衣在线中文字幕 | 黄色高清视频在线观看 | 国产+日韩欧美 | 欧美日本中文字幕 | 999成人 | 91成人在线免费观看 | 免费看十八岁美女 | 狠狠狠狠狠狠天天爱 | 日韩一区二区三区不卡 | 免费观看成年人视频 | 成人福利在线 | 六月丁香在线视频 | 伊人视频 | 视频成人永久免费视频 | 日日夜夜添 | 久久久亚洲麻豆日韩精品一区三区 | 久久专区 | 91丨九色丨蝌蚪丨对白 | 日韩免费观看视频 | 91精品小视频 | 天天拍天天爽 | 色综合中文字幕 | 国产精品高潮呻吟久久久久 | 色爱区综合激月婷婷 | 天天操天天色天天射 | 五月综合激情网 | 国产精品美乳一区二区免费 | 日本久久久精品视频 | 丁香婷婷综合激情 | 欧美黑人巨大xxxxx | 福利视频一二区 | 国产精品资源 | 欧美aaa级片 | 99精品热视频只有精品10 | 国产成人一区二区三区电影 | 久久不卡电影 | 麻豆影视网 | 中文字幕 国产视频 | 久久综合九色综合97_ 久久久 | 国产成人精品一区二区在线 | 97免费在线视频 | 黄色小视频在线观看免费 | 久久国产精品久久精品国产演员表 | 日韩中文字幕电影 | 四虎免费av| 四虎免费在线观看视频 | 亚洲人在线视频 | 精品免费| 国产不卡在线播放 | 亚洲国产日韩一区 | 欧美一级日韩三级 | 91免费看黄色 | 日韩理论电影网 | 91经典在线 | 精品欧美一区二区在线观看 | 国产精品18久久久 | 精品一区二三区 | 国产精品自产拍在线观看中文 | 97视频免费| 日韩高清在线一区二区 | 国产精品久久久一区二区 | 久久综合九色综合欧美就去吻 | 激情 婷婷 | 亚洲视屏一区 | 91亚洲欧美| 三级在线视频观看 | 一本一本久久a久久 | 久影院| 天天拍天天色 | 中文字幕乱视频 | 天天操天天干天天插 | 国产一卡二卡四卡国 | 国产黄色成人av | 中文字幕在线播放视频 | 国产亚洲资源 | 国产成人在线看 | 日本黄区免费视频观看 | 黄色国产在线 | 日韩91在线 | 中文字幕在线观看三区 | sesese图片 | www久久国产 | 日韩a级黄色 | 精品亚洲va在线va天堂资源站 | 亚洲在线观看av | 久久99精品久久只有精品 | 婷婷丁香九月 | 99精品在线观看视频 | 特级a老妇做爰全过程 | 日韩精品久久久 | 97超碰成人在线 | 特级毛片aaa| 亚洲精品一区二区三区在线观看 | 精品一区二区久久久久久久网站 | 五月天亚洲激情 | www.黄色 | 人人干人人艹 | 亚洲精品777| 亚洲精品高清一区二区三区四区 | 成人国产网址 | 成人影片在线播放 | 综合在线亚洲 | 国产精品资源 | 中文字幕av免费在线观看 | 美女激情影院 | www.色五月.com| 成人午夜网址 | 亚洲综合激情小说 | 国产午夜在线观看视频 | 激情在线免费视频 | 日韩在线观看视频网站 | 亚洲视频精选 | 亚洲va在线va天堂va偷拍 | 欧美精品亚洲精品日韩精品 | 久久综合九色综合欧美就去吻 | 国产一区在线播放 | 黄色三级久久 | 日躁夜躁狠狠躁2001 | 日韩在线视频一区二区三区 | 久久免费黄色大片 | 亚洲九九影院 | 在线观看涩涩 | 一级大片在线观看 | 午夜婷婷在线观看 | 亚洲开心激情 | 欧美a级片网站 | 成 人 免费 黄 色 视频 | 日日爱网站| 久久激情视频 | 激情五月婷婷激情 | 高清av中文在线字幕观看1 | 夜夜夜夜夜夜操 | 国产亚洲va综合人人澡精品 | 69精品视频在线观看 | 国产对白av| 超碰资源在线 | 免费美女久久99 | 欧美永久视频 | 久草在线手机观看 | 国产精品亚洲片夜色在线 | 操操操日日日 | 国产一区黄色 | 91av视频免费在线观看 | 天天操天天干天天摸 | 午夜av在线免费 | 成年人精品 | 国产 日韩 欧美 自拍 | 久久草在线精品 | 欧美激情视频一区二区三区免费 | 久久伊人国产精品 | 中文字幕av有码 | 亚洲精品视频免费看 | 国产精品永久 | 亚洲精品视频在线观看免费 | 综合久久影院 | 91视频久久久久 | 国产黄色在线看 | 91大神dom调教在线观看 | 中文字幕亚洲精品日韩 | 激情久久久 | 国产高清一区二区 | 中文字幕在线观看视频免费 | 色99在线| 精品一区久久 | 日韩无在线 | 国产 日韩 欧美 自拍 | 一区精品久久 | 国产在线播放一区二区 | 亚洲国产一区二区精品专区 | 97精品国自产拍在线观看 | 手机在线中文字幕 | 成人在线免费观看网站 | 亚洲九九九在线观看 | 色狠狠干 | 九色91在线| 精品久久久久久久久久久久久久久久久久 | 男女激情免费网站 | 国产精品久久电影网 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 久久视频这里有久久精品视频11 | 久久综合九色综合久久久精品综合 | 国产第一页在线观看 | 国产在线精品国自产拍影院 | 午夜在线国产 | 久久在线免费观看视频 | 免费看网站在线 | 四虎www | 亚洲电影图片小说 | v片在线看 | 欧美一级特黄高清视频 | 日日夜夜亚洲 | av中文在线 | 涩涩伊人| 亚洲涩涩涩 | 在线导航av | 国产一区二区三区四区大秀 | 国产在线观看免费av | 国产资源网站 | 国产成人精品午夜在线播放 | 国产精品99精品久久免费 | 国产在线高清精品 | 在线观影网站 | 国产精品免费视频网站 | 国产精品一区久久久久 | 欧美一级黄色视屏 | 久久人人爽人人爽人人 | 久久久久福利视频 | 成人三级av| 麻豆久久一区二区 | 欧美激情精品久久久久久变态 | 开心激情久久 | 国产亚洲午夜高清国产拍精品 | 狠狠天天| 国产又粗又猛又黄又爽的视频 | 草久视频在线观看 | 丝袜美腿在线播放 | 91精品国| 久久久国产精品成人免费 | 国产99久久久精品视频 | 天天色成人| www久草| 成人av电影免费观看 | 久久精品站 | av免费观看网址 | 狠狠色综合欧美激情 | 日日躁你夜夜躁你av蜜 | 久久久精品福利视频 | 久久久久久久久久网站 | 免费黄a| 黄色a一级片 | 成年性视频 | 午夜电影久久久 | 日韩一二三区不卡 | 欧美 亚洲 另类 激情 另类 | www.狠狠 | 人人干人人爽 | 欧美91精品国产自产 | 国产999精品久久久 免费a网站 | 五月天综合网站 | 国内视频在线 | 久久精品99久久 | 99av国产精品欲麻豆 | 欧美精品一区二区在线观看 | 日韩欧美一区二区三区在线观看 | 亚洲日日日 | 日本久久精 | 五月开心激情网 | 国产一区免费看 | 日本高清久久久 | 国产色资源 | 在线观看国产福利片 | 亚洲干 | 免费精品在线 | 超碰电影在线观看 | 激情动态 | 国产伦精品一区二区三区免费 | 日本黄色免费观看 | 亚洲国产理论片 | 国产亚洲午夜高清国产拍精品 | 久青草视频在线观看 | 国产成人在线观看 | 五月天综合 | 亚洲毛片久久 | 国产婷婷一区二区 | 免费看黄在线网站 | 欧美少妇xxx | 高潮毛片无遮挡高清免费 | 中文字幕免费高 | 91av福利视频 | 日韩在线视频播放 | 最新日韩精品 | 香蕉视频最新网址 | 天天躁日日躁狠狠躁av麻豆 | 四虎最新入口 | 国产精品99久久久久久宅男 | 激情五月婷婷丁香 | www.天天综合 | 久久久91精品国产一区二区三区 | 国产中文字幕视频在线观看 | 国产婷婷在线观看 | 国产一区二区三区免费在线 | 久久久久久久影院 | 免费亚洲电影 | 欧美激情视频一区二区三区 | 欧美老人xxxx18 | 色多多视频在线观看 | 国产精品久久久久久久久免费 | 国产精品久久久久久久久久妇女 | 国产精品毛片一区二区三区 | 欧美色婷婷 | 国产精品九色 | 91精品国产成人观看 | 国产精品一区二区av日韩在线 | 天天操天天拍 | 日韩免费在线观看视频 | 久久成人欧美 | 中文字幕888| 久久综合九色综合欧美狠狠 | 久久美女免费视频 | 国产精品 国产精品 | 国产原创在线观看 | 亚洲综合色丁香婷婷六月图片 | 国产精品18久久久久久不卡孕妇 | 久久香蕉国产精品麻豆粉嫩av | 超碰97国产精品人人cao | 五月天六月丁香 | 国产精品6| 久久精品国产免费看久久精品 | 综合视频在线 | 久久久久一区二区三区四区 | 综合网在线视频 | 人人爱人人射 | 1024手机在线看 | 欧美精品中文在线免费观看 | 欧美日韩在线视频免费 | 国产精品二区三区 | 国产亚洲精品久久久久久久久久久久 | 最近免费观看的电影完整版 | 黄色一及电影 | 四虎在线观看视频 | 福利一区二区三区四区 | 国产精品九九九 | 精品久久久久久亚洲综合网站 | 日韩欧美在线综合网 | 99在线热播精品免费 | 久久爱992xxoo| 国产成人精品日本亚洲999 | 国产美腿白丝袜足在线av | 在线观看黄色av | 亚洲无人区小视频 | 天天操天天干天天摸 | 亚洲综合激情网 | 粉嫩av一区二区三区四区在线观看 | av在线免费在线观看 | 国产福利91精品张津瑜 | 国产精品一区在线观看你懂的 | 日韩午夜电影院 | 精品一区二区电影 | 中文字幕 国产精品 | 91精品久久久久久久99蜜桃 | 国产精品成人一区二区 | 一区二区精品在线 | 日韩视频a | 国产精品剧情在线亚洲 | 国产亚洲精品中文字幕 | 中文字幕之中文字幕 | 91在线视频免费 | 成人影片在线免费观看 | 国产99久久久精品 | 99久久er热在这里只有精品66 | 91超国产 | 91亚洲国产成人久久精品网站 | 国产精品v a免费视频 | 欧美日本一二三 | 欧美性久久久久久 | 欧美污污视频 | 99一区二区三区 | 久久免费视频这里只有精品 | 午夜精品久久久久久久99热影院 | a资源在线| 超碰日韩在线 | 亚洲国产伊人 | 日韩精品视频在线观看网址 | 国产日韩在线播放 | 玖玖玖影院 | 国产亚洲资源 | 日日干天天干 | 在线国产一区二区三区 | 永久免费av在线播放 | 丝袜av网站 | 国产九色视频在线观看 | 91传媒在线看| 久久成人久久 | 成人黄色av网站 | 一区二区三区污 | av电影免费在线看 | 天天综合人人 | 国产精品福利无圣光在线一区 | 亚洲欧美日韩精品久久奇米一区 | 国产在线精品二区 | 久久精品123| 99国产精品免费网站 | 在线观看av小说 | 国产欧美中文字幕 | 国产精品免费麻豆入口 | 免费看国产精品 | 久久人91精品久久久久久不卡 | 欧美伦理一区二区三区 | 亚洲一区视频免费观看 | 精品亚洲午夜久久久久91 | 亚洲91视频 | 中文字幕在线久一本久 | 国产一区二区在线免费视频 | 中文在线www | 粉嫩av一区二区三区四区 | 久久艹影院 | 最新av免费 | 日韩免费在线一区 | 97av色 | 黄色中文字幕 | 欧美三级免费 | av看片在线| 国产精品国产三级国产专区53 | 久久久www成人免费精品 | 亚洲在线黄色 | 国产中文字幕av | 亚洲综合视频在线播放 | 黄色的视频 | 天天爱av导航 | 在线观看国产成人av片 | 久久精品影片 | 1000部国产精品成人观看 | 91精品国产一区二区三区 | 国产精品2区 | 久久久久久久久久网站 | 久草青青在线观看 | 日韩乱码在线 | 99r在线精品 | 在线观看视频色 | 日韩另类在线 | 欧美精品在线观看免费 | 国产免费精彩视频 | 狠狠干婷婷色 | 999一区二区三区 | 欧美精品xxx | 中文字幕av在线电影 | 麻花天美星空视频 | av超碰免费在线 | 国产视频资源在线观看 | 美女免费黄视频网站 | 久久精品99国产精品酒店日本 | 欧美成人91 | 天天干天天射天天操 | .精品久久久麻豆国产精品 亚洲va欧美 |