1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| /*example1: 交换一个数组中最大的元素和最小的元素 元素为整数*/ #include "hanshu.h" //定义core函数,交换作用 void swap(ElementType &x, ElementType &y) { //记住传入的是地址 //常用的交换思路 ElementType tmp = x; x = y; y = tmp; } //遍历,交换,只用遍历一遍,相对简单 void SwapMaxMin(SqList &L) { int i, maxi, mini; maxi = mini = 0; for (i = 1; i < L.length; i++) { if (L.elem[i] > L.elem[maxi]) maxi = i; else if (L.elem[i] < L.elem[mini]) { mini = i; } swap(L.elem[maxi], L.elem[mini]); } } /*example2: 删除线性表中自i个元素起的k个元素*/
void DeleteK(SqList &L, i, k) { ElemType e; int tmp = i + k;
int j; //判断数据是否合法 if (i < 1 || k < 1 || L.length < (i + k - 1)) { printf("\n数据不足,输入有误"); return 0; } /*思路一:定位后一个一个的删除 for (; i <= tmp;i++){ ListDelete_Sq(L, i, e); }*/ //思路二:一次行删除k个单位的数据 for (j = i + k - 1; j < L.length; j++) //一直让k+i后的元素链接到i的后面 L.elem[j - k] = L.elem[j]; L.length -= k; return 1; }
/*example3: 将顺序表中所有的奇数移动到偶数前面的算法,每个元素都是 互不相等的整数,要求时间最少,空间复杂度最小
两头同时进行扫描。当i=j时,作为扫描完成的条件,当i为偶数的时候,交换 i和j的位置 */ //选择排序 void Move(SqList &L) { int i = 0, j = L.length - 1; while (i < j) { while (L.elem[i] % 2 == 1) i++; //一直找到一个偶数 while (L.elem[j] % 2 == 0) j--; //一直找到一个偶数 if (i < j) //交换 swap(L.elem[i], L.elem[j]); } } /* example4:
删除顺序表中的所有值为负的元素,已知L中值为负的元素可能 有多个 //sovel1:重建一个表,遍历,当找到符合要求的元素的时候就将 它放在新的表中 //solve2:遍历,利用SqlistDelete函数,一个一个的删除 */ void(Sqlist &L) { //没必要建立一个新的,自己给自己赋值就行了 Sqlist tmp; int i = 0, j = 0; while (L.elem[i] > 0) { L.elem[j] = L.elem[i]; //赋值 j++; } L.length = j; //修改表中参数 }
/*example5: 将顺序表中的整数序列循环左移p个位置,即将表中的数据序列 从x0,x1,x2,x3,x4,...xn-1,变换为xp,xp+1,xp+2,xp+3...,xn-1,x0,x1,x2....xp-1; */ void reverse(int R[], int m, int n) //先将R[m....n]逆置 { int i; int tmp; for (i = 0; i < (n - m + 1) / 2; i++) { tmp = R[m + i]; //将R[m+i]与R[n-i]进行交换 R[m + i] = R[n - i]; R[n - i] = tmp; } } int ListReverse(int R[], int n, int p) //循环左移 { if (p <= 0 || p >= n) return 0; else { reverse(R, 0, p - 1); reverse(R, p, n - 1); reverse(R, 0, n - 1); return 1; } }
|