資料期末複習
阿新 • • 發佈:2020-12-23
1 //基於鄰接表 2 struct vertexnode 3 { 4 int vertex; 5 edgenode * firstedge; 6 }; 7 struct edgenode 8 { 9 int adjvex; 10 edgenode *next; 11 }; 12 struct vertexnode adjlist[100]; 13 int visited[100]; 14 void GS(int a[], int n, int e) 15 { 16 int i, k,j; 17 for (i=0;i<n;++i) 18 {19 adjlist[i].vertex = a[i]; 20 adjlist[i].firstedge = NULL; 21 } 22 for (k = 0; k < e; k++) 23 { 24 cin >> i >> j; 25 edgenode* s = new edgenode; 26 s->adjvex = j; 27 s->next = adjlist[i].firstedge; 28 adjlist[j].firstedge = s;29 } 30 } 31 void DFS(int v) 32 { 33 cout << adjlist[v].vertex; visited[v] = 1; 34 edgenode *p = adjlist[v].firstedge; 35 while (p!=NULL) 36 { 37 int j = p->adjvex; 38 if (visited[j]==0) 39 { 40 DFS(j); 41 } 42 p = p->next;43 } 44 } 45 void BFS(int v) 46 { 47 int front = -1, rear = -1; 48 int Q[100]; 49 cout << adjlist[v].vertex; visited[v] = 1; Q[++rear] = v; 50 while (front!=-1) 51 { 52 v = Q[++front]; 53 edgenode *p = adjlist[v].firstedge; 54 while (p!=NULL) 55 { 56 int j; 57 j=p->adjvex; 58 if (visited[v]==0) 59 { 60 cout << adjlist[j].vertex; visited[j] = 1; Q[++rear] = j; 61 } 62 p=p->next; 63 } 64 } 65 }
1 //基於鄰接矩陣 2 int vertex[100]; 3 int edge[100][100]; 4 int visited[100]; 5 int n = 10, e = 10; 6 void GZ(int a[], int n, int e) 7 { 8 int i, j, k; 9 for (i=0;i<n;++i) 10 { 11 vertex[i] = a[i]; 12 } 13 for (i = 0; i < n; ++i) 14 { 15 for (j=0;j<n;++j) 16 { 17 edge[i][j] = 0; 18 } 19 } 20 for (k=0;k<e;++k) 21 { 22 cin >> i >> j; 23 edge[i][j] = 1; 24 edge[j][i] = 1; 25 } 26 } 27 void DFS(int v) 28 { 29 int i; 30 cout << vertex[v]; visited[v] = 1; 31 for (i=0;i<n;++i) 32 { 33 if (edge[v][i]==1&&visited[i]==0) 34 { 35 DFS(i); 36 } 37 } 38 } 39 void BFS(int v) 40 { 41 int front = -1, rear = -1, i, j, Q[100]; 42 cout << vertex[v]; visited[v] = 1; Q[++rear] = v; 43 while (front!=rear) 44 { 45 v = Q[++front]; 46 for (j = 0; j < n; ++j) 47 { 48 if (edge[v][j]==1&&visited[j]==0) 49 { 50 cout << vertex[j]; visited[j] = 1; Q[++rear] = j; 51 } 52 } 53 } 54 }
1 //堆排序 2 void sift(int a[], int pos, int size) 3 { 4 int child; 5 int tmp = a[pos]; 6 for (;pos*2+1<size;pos=child) 7 { 8 child = pos * 2 + 1; 9 if (child != size - 1 && a[child + 1] > a[child]) 10 { 11 child++; 12 } 13 if (a[child] > tmp) 14 { 15 a[pos] = a[child]; 16 } 17 else break; 18 } 19 a[pos] = tmp; 20 } 21 void heap(int a[], int size) 22 { 23 int i; 24 for (i=size/2-1;i>=0;--i) 25 { 26 sift(a, i, size); 27 } 28 for (i=size-1;i>0;--i) 29 { 30 swap(a[0], a[i]); 31 sift(a, 0, i); 32 } 33 }
1 //堆排序 2 void sift(int a[], int pos, int size) 3 { 4 int child; 5 int tmp = a[pos]; 6 for (;pos*2+1<size;pos=child) 7 { 8 child = pos * 2 + 1; 9 if (child != size - 1 && a[child + 1] > a[child]) 10 { 11 child++; 12 } 13 if (a[child] > tmp) 14 { 15 a[pos] = a[child]; 16 } 17 else break; 18 } 19 a[pos] = tmp; 20 } 21 void heap(int a[], int size) 22 { 23 int i; 24 for (i=size/2-1;i>=0;--i) 25 { 26 sift(a, i, size); 27 } 28 for (i=size-1;i>0;--i) 29 { 30 swap(a[0], a[i]); 31 sift(a, 0, i); 32 } 33 }
1 //選擇排序 2 void straight(int a[], int size) 3 { 4 int pos, j, min; 5 for (pos=0;pos<size-1;++pos) 6 { 7 min = pos; 8 for (j=pos+1;j<size;++j) 9 { 10 if (a[j]<a[min]) 11 { 12 min = j; 13 } 14 } 15 if (pos!=min) 16 { 17 swap(a[pos], a[min]); 18 } 19 } 20 }
1 //希爾排序 2 void shell(int a[], int size) 3 { 4 int gap, pos, j, tmp; 5 for (gap=size/2;gap>0;gap/=2) 6 { 7 for (pos=gap;pos<size;pos++) 8 { 9 tmp = a[pos]; 10 for (j=pos-gap;j>=0&&a[j]>tmp;j-=gap) 11 { 12 a[j + gap] = a[j]; 13 } 14 a[j + gap] = tmp; 15 } 16 } 17 }
1 //折半查詢 2 int binary(int a[], int size, int k) 3 { 4 int low = 1, high = size - 1, mid; 5 while (low<=high) 6 { 7 mid = (low + high) / 2; 8 if (a[mid]==k) 9 { 10 return mid; 11 } 12 if (k<a[mid]) 13 { 14 high = mid - 1; 15 } 16 else 17 { 18 low = mid + 1; 19 } 20 } 21 return 0; 22 }
1 //單鏈表刪除 2 struct Node 3 { 4 int data; 5 Node * next; 6 }; 7 Node *first; 8 int Delete(int i) 9 { 10 Node *p = first;int count = 0; 11 while (p!=NULL&&count<i-1) 12 { 13 p = p->next; 14 count++; 15 } 16 if (p==NULL&&p->next==NULL) 17 { 18 throw"位置"; 19 } 20 else 21 { 22 Node *q = p->next; 23 int x = q->data; 24 p->next = q->next; 25 delete q; 26 return x; 27 } 28 }
1 //單鏈表的插入 2 struct Node 3 { 4 int data; 5 Node *next; 6 }; 7 Node *first; 8 void insert(int i, int x) 9 { 10 Node *p = first; 11 int count = 0; 12 while (p!=NULL&&count<i-1) 13 { 14 p = p->next; 15 count++; 16 } 17 if (p=NULL) 18 { 19 throw"位置"; 20 } 21 else 22 { 23 Node *s = new Node; 24 s->data = x; 25 s->next = p->next; 26 p->next = s; 27 } 28 }
1 //單鏈表的逆置 2 struct Node 3 { 4 int data; 5 Node *next; 6 }; 7 Node *first; 8 void Reverse() 9 { 10 Node *p = first->next,*u; 11 first->next = NULL; 12 while (p) 13 { 14 u = p->next; 15 p->next = first->next; 16 first->next = p; 17 p = u; 18 } 19 }
1 //二叉樹的遍歷 2 struct BiNode 3 { 4 int data; 5 BiNode *left, *right; 6 }; 7 BiNode *bt; 8 void Preorder(BiNode *bt) 9 10 { 11 if (bt) 12 { 13 cout << bt->data; 14 Preorder(bt->left); 15 Preorder(bt->right); 16 } 17 } 18 void Inorder(BiNode *bt) 19 { 20 if (bt) 21 { 22 Inorder(bt->left); 23 cout << bt->data; 24 Inorder(bt->right); 25 } 26 } 27 void Postorder(BiNode *bt) 28 { 29 if (bt) 30 { 31 Postorder(bt->left); 32 Postorder(bt->right); 33 cout << bt->data; 34 35 } 36 } 37 void Leverorder(BiNode *bt) 38 { 39 int rear = -1, front = -1; 40 BiNode *Q[100]; 41 if (bt==NULL) 42 { 43 return; 44 } 45 Q[++rear] = bt; 46 while (front!=rear) 47 { 48 BiNode *q; 49 q = Q[++front]; 50 if (q->left!=NULL) 51 { 52 Q[++rear] = q->left; 53 } 54 if (q->right!=NULL) 55 { 56 Q[++rear] = q->right; 57 } 58 } 59 }
1 struct BiNode 2 { 3 int data; 4 BiNode *left,*right; 5 }; 6 struct BiNode *bt; 7 //求結點數 8 int size(BiNode *bt) 9 { 10 if (bt==NULL) 11 { 12 return 0; 13 } 14 else 15 { 16 return 1 + size(bt->left) + size(bt->right); 17 } 18 } 19 //求高度 20 int height(BiNode *bt) 21 { 22 if (bt==NULL) 23 { 24 return 0; 25 } 26 int lh = height(bt->left); 27 int rh = height(bt->right); 28 return 1 + (lh > rh ? lh : rh); 29 } 30 //求葉子數 31 int leafNum(BiNode *bt) 32 { 33 if (bt==NULL) 34 { 35 return 0; 36 } 37 if ((bt->left==NULL)&&(bt->right)==NULL) 38 { 39 return 1; 40 } 41 else 42 { 43 return leafNum(bt->left) + leafNum(bt->right); 44 } 45 }
1 //統計只有一個孩子的結點個數 2 struct BiNode 3 { 4 int data; 5 BiNode *left,*right; 6 }; 7 struct BiNode *bt; 8 void count(BiNode *bt, int *n) 9 { 10 if (bt) 11 { 12 if ((bt->left==NULL)&&(bt->right!=NULL)|| (bt->right == NULL) && (bt->left != NULL)) 13 { 14 (*n)++; 15 return; 16 } 17 count(bt->left, n); 18 count(bt->right, n); 19 } 20 }
1 //判斷單鏈表是否遞增 2 struct Node 3 { 4 int data; 5 Node *next; 6 }; 7 Node *first; 8 bool increase() 9 { 10 Node *p = first->next,*q; 11 while (p->next) 12 { 13 q = p->next; 14 if (p->data<q->data) 15 { 16 p = q; 17 } 18 else 19 { 20 return false; 21 } 22 } 23 return true; 24 }