沒有什麼特別的,只是本身感受這兩個小算法比較特別,讓本身知道問題也能夠這麼考慮node
/******************************************** * 文件名稱:proc_sqlist.c * 文件描述:習題練習 * 文件做者:by Wang.J,in 2013.11.17 * 文件版本:1.0 * 修改記錄: *********************************************/ #include <stdio.h> #include "sqlist.h" /* 存在一個順序表,設計一個算法,刪除其中全部值等於x的元素. 要求算法的時間複雜度爲O(n),空間複雜度爲O(1). */ /* 方法一:掃描順序表L,重建一個不包含x值得全部元素的新順序表 */ /*=================================================== * 函數名稱:delnode1 * 函數功能:使用方法一實現功能 * 函數參數:sqlist *L 已經存在的順序表 elemtype x 參考元素 * 返 回 值:void * 創 建 人:by Wang.J,in 2013.11.17 * 修改記錄: ====================================================*/ void delnode1(sqlist *L, elemtype x) { int k = 0, i = 0; //k記錄值不等於x的元素個數 for (i = 0; i < L->len; i++) { if (x != L->data[i]) { //元素的值若是不等於x則插入L中 L->data[k] = L->data[i]; k++; //不等於x的個數+1 } } L->len = k; //新順序表的長度等於新的元素的個數,儘管後面可能還有元素,可是已經表示爲沒有了 } /* 方法二:用k記錄順序表中x元素的個數,一邊掃描L一遍統計k,並將不爲x 的元素前移k個位置,最後修正L的長度 */ /*=================================================== * 函數名稱:delnode2 * 函數功能:使用方法二實現功能 * 函數參數:sqlist *L 已經存在的順序表 elemtype x 參考元素 * 返 回 值:void * 創 建 人:by Wang.J,in 2013.11.17 * 修改記錄: ====================================================*/ void delnode2(sqlist *L, elemtype x) { int k = 0, i = 0; for (i = 0; i < L->len; i++) { if (x == L->data[i]) k++; else L->data[i-k] = L->data[i]; } L->len -= k; }