2.2.1
題目描述:
解題思路:
·這是最基礎的操作,思路大家應該都有,缺少的應該是如何下筆,很多同學都是有思路但是不知道如何下筆,這時候看思路的意義不大,可以直接看答案怎么寫,最好可以直接背下來,等熟悉了代碼操作再進行書寫也不遲
·言歸正傳,我們只需要寫一個循環找到其中最小元素,以及最小元素所在下標,再用末尾元素對其覆蓋即可,最后不要忘記了要對表的長度減一
*基礎比較好的同學可以直接看外部的Del_Min函數,而基礎一般的同學也可以看我在注釋中寫的Del_Min函數,注釋中是我根據王道書中的答案根據C++語法進行修改的(因為C語言太過嚴謹且繁瑣了)
代碼如下
#include <iostream>
#include <vector>using namespace std;void PrintArray(vector<int> v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << '\t';}cout << endl;
}
/*
void Del_Min(SQList& L, Element e) {if (L.length() == 0) {//如果表空則輸出errorcout << "error!" << endl;return;//函數結束}int minn = INT_MAX;//INT_MAX為C++中用法定義minn為int類型所能表達的最大整數int pos = 0;//定義一個中間變量用于存放最小數據所在的位置for (int i = 0; i < L.length(); i++) {if (L[i] < minn) {minn = L[i];pos = i;}}L[pos] = L[length() - 1];//將最后的數字放在最小的數字的位置上L.length--;//千萬不要忘記長度減一,這是很容易遺忘的一點
}
*/
void Del_Min(vector<int>& v, int& min_value) {if (v.empty()) {//判斷表空cout << "順序表為空" << endl;return;}min_value = v[0];int min_pos = 0;//定義中間變量確定最小數據所在位置for (int i = 1; i < v.size(); i++) {if (v[i] < min_value) {min_value = v[i];min_pos = i;}}v[min_pos] = v[v.size() - 1]; //將最后一個元素填補至最小元素位置v.pop_back();//取出數組末尾最后的一個元素,在這里等價于長度減一也就是L.length-1
}int main()
{vector<int> v = { 6,3,4,5,8,9 };int min_value;PrintArray(v);Del_Min(v, min_value);cout << "數組最小值為:" << min_value << endl;PrintArray(v);
}
運行結果
2.2.2
題目描述
解題思路:
·最基本的思路就是找一個臨時變量,將前半部分的變量存入臨時變量,再將后半部分變量存入前半部分變量,最后將臨時變量中存入后半部分變量中,這樣就完成了數據交換,這樣說可能有點懵逼,用代碼表示就是
temp = L.data[i];
L.data[i] = L.data[length-i-1];
L.data[Length-i-1] = temp;
這個思路一定要會,因為以后一定還會遇到
·在這里我提供一個更好的思路,可以直接調用swap()函數,這樣就輕松實現數據交換了
*注釋中的為書上答案修改后答案,基本思想未變,可運行代碼為我取巧的方法
代碼如下:
#include <iostream>
#include <vector>
#include <ctime>using namespace std;void Reverse(vector<int> &v) {int l = 0, r = v.size() - 1;while (l <= r) {swap(v[l], v[r]);//交換v[l],v[r]數據l++, r--;}
}/*
void Reverse(vector<int>& v) {for (int i = 0; i < v.size() / 2; i++) {int temp = v[i];v[i] = v[v.size() - 1 - i];v[v.size() - 1 - i] = temp;}
}
*/void GenerateData(vector<int>& v, int n) {srand(time(NULL));for (int i = 0; i < n; i++) {v.push_back(rand() % 100 + 1);}
}void PrintArray(vector<int> v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << '\t';}cout << endl;
}int main() {vector<int> v;GenerateData(v,10);PrintArray(v);Reverse(v);PrintArray(v);}
運行結果
2.2.3
題目描述
解題思路
·一開的思路是遍歷整個表,如果值相等,那么就將元素刪除,再將表前移,但是這樣會復雜一些,使用課后答案的思路會更簡單,如果遍歷到的值不相等,那就繼續遍歷,相等的值會被自動覆蓋掉,就會簡單且易懂一些
代碼如下:
#include <iostream>
#include <vector>
#include <ctime>using namespace std;void Del_x(vector<int>& v, int x) {int k = 0;for (int i = 0; i < v.size(); i++) {if (v[i] != x) {//如果當前的值不等于x,就把他賦值到k位置,然后k++,也就是k的位置后移v[k++] = v[i];}}v.erase(v.begin() + k, v.end());//刪除k后所有元素
}void GenerateData(vector<int>& v, int n) {srand(time(NULL));for (int i = 0; i < n; i++) {v.push_back(rand() % 100 + 1);}
}void PrintArray(vector<int> v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << '\t';}cout << endl;
}int main() {vector<int> v;GenerateData(v,10);PrintArray(v);Del_x(v,2);PrintArray(v);}
運行結果