順序表的使用

沒有什麼特別的,只是自己感覺這兩個小算法比較特別,讓自己知道問題也可以這麼考慮

/********************************************
 * 文件名稱: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章