123 124 125 126 127 128 | for (j = 0;j < SIZE; j++) { if (! strcmp (userID[j], searchname)) { state = Y; break ; } } |
依陣列的索引,依序比對每個元素是否與搜尋目標相同,如果找到就把變數 state 設成 Y ,然後用 break 陳述跳出迴圈,迴圈變數 j 會記錄找到的索引值。
現在我們來將線性搜尋寫成函數,先思考比較簡單的例子,於整數陣列中搜尋整數,例如以下的整數陣列
int testa[10] = {3, 2, 8, 1, 9, 4, 7, 6, 5, 0}; |
我們自然希望函數可以找到與目標相符的元素就回傳索引值,因此設定回傳值為整數型態,參數需要陣列、陣列大小及搜尋目標,函數原型如下
int nsearch( int array[], int size, int target); |
這裡用為參數的陣列 array[] 並不需要提供元素個數,因為陣列名稱等同於指標,需要中括弧 [] 說明是陣列即可,所以另外需要表示陣列大小的參數 size ,以及搜尋目標的參數 target 。實際的搜尋整數陣列的函數如下
int nsearch( int array[], int size, int target) { int i; for (i = 0; i < size; i++) { if (target == array[i]) { return i; } } return -1; } |
若是找到目標,函數 nsearch() 直接回傳索引值,若是 for 迴圈走完一次都沒有找到目標,函數回傳 -1 當警示值。
如果是搜尋字元陣列,這跟搜尋整數陣列極為相似,例如打算對以下的字元陣列進行搜尋
char testb[10] = { 'd' , 't' , '7' , '#' , 'c' , 'q' , 'n' , ' ' , 'o' , 'v' }; |
函數原型如下
int csearch( char array[], int size, char target); |
搜尋字元陣列的函數定義如下
int csearch( char array[], int size, char target) { int i; for (i = 0; i < size; i++) { if (target == array[i]) { return i; } } return -1; } |
回到我們登入程式的例子,我們需要的是逐一比對字串的搜尋函數,假設要搜尋以下的二維字元陣列
char testc[10][10] = { "john" , "mary" , "tommy" , "lily" , "blue" , "park" , "tony" , "sam" , "bill" , "bruse" }; |
二維字元陣列也就是字串陣列,這跟下面的指標陣列是相同的
char *testc[10] = { "john" , "mary" , "tommy" , "lily" , "blue" , "park" , "tony" , "sam" , "bill" , "bruse" }; |
字串陣列中的 testc[0] 是指向 "john" 的第一個字元 'j' 的指標,類似的,二維字元陣列的 testc[0] 也是等同指向 "john" 的第一個字元 'j' 的指標,而 testc[0][0] 則表示 'j' 這個字元型態的元素。
利用二維字元陣列當作函數的參數,必須提供每個陣列元素的大小,也就是第二個索引值。搜尋字串陣列的函數原型宣告如下
int ssearch( char array[][10], int size, char *target); |
搜尋字串陣列的函數定義如下
int ssearch( char array[][10], int size, char *target) { int i; for (i = 0; i < size; i++) { if (! strcmp (array[i], target)) { return i; } } return -1; } |
注意,字串是字元陣列,只有基本資料型態及指標的變數可以直接用 == 運算子測試相等,若是這裡用
if (array[i] == target) |
這樣是比較 array[i] 與 target 的記憶體位址是否相同,而非比對兩個是否含有相同元素的字串。
完整的範例程式碼及編譯執行,請繼續參考
問題與討論
- 為什麼搜尋不同型態的陣列要設計成不同的函數?
- 為什麼沒找到目標要給搜尋函數回傳 -1 ?
- 為什麼比較字串的想等不能用 == 運算子?
沒有留言:
張貼留言