顺序表的使用

没有什么特别的,只是自己感觉这两个小算法比较特别,让自己知道问题也可以这么考虑

/********************************************

 * 文件名称: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;

}

你可能感兴趣的:(顺序)