在算法 2.1基础上可以进一步分析线性表长度 v.len 的大小 , 如果v.len的值已经等于MAXSIZE-1, 则不允许进行任何插入操
作。 由于C语言函数的一般参数仅能向被调函数传值, 这个值
在返回时也不会改变, 因此在上面的算法中, 采用指针变量p做 参数, 虽然从被调函数返回时p值不变, 但是p中地址所代表的结 构体的内容发生了变化。 struct sequnce v; v=*p;这两个语 句是为了使程序书写简明易懂, 用v来表示结构体。这样, 操作 是在局部变量v结构体上进行, 因此最后还要用 *p=v; 将改变后 的内容赋值给*p, 由指针变量p将结构带回主调函数。
在下面的删除算法中也是同样处理 , 目的是使算法主体部 分简明扼要。处理此类函数的参数传递问题, 上述方法多用了 一个局部变量, 并不理想。在本节最后的源程序例题中, 使用的 是另一种方法, 也不理想。在此, 问题显得如此麻烦, 主要因为C 语言参数传递的限制。 如果换为C++语言, 通过让&v做参数就 可以解决问题。 2. 删除 要删除线性表中的第i个元素ai, 操作和插入操作类似。 把 元素a i+1, …, an分别向前移动一个位置, 使长度为n的线性表 (a1, …, ai-1, ai, …, an),变成长度为n-1的线性表(a1, …, ai-1, ai+1, …, an)。 在下面的算法中, 仍假设a1存放在v.elem [1]之中。 删除算法见算法2.2。算法2.2
i 1
n 1
pi(n-i+1)
假设qi是删除第i个元素的概率 , 则在长度为n的线性 表中删除一个元素时所需移动元素次数的平均次数为
Ede=