设计一个函数
void delitem(SEQTABLE* st, int item)
在顺序表st中,删除值为item的所有元素,要求算法复杂度为O(n)。函数中只能有一个循环语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#define MAX 20

/*设计一个函数
void delitem(SEQTABLE* st, int item)
在顺序表st中,删除值为item的所有元素,要求算法复杂度为O(n)。函数中只能有一个循环语句。*/
//其中SEQTABLE是如下结构体:

typedef struct {
int n; //顺序表元素个数
int data[MAX + 1]; //存放元素的数组,下标从1开始
} SEQTABLE;

void delitem(SEQTABLE* st, int item)//声明函数
{
int i, m = 0;//定义遍历数组下标i,初始化计数值
for (i = 0; i <= st->n; i++)//遍历顺序表
{
if (st->data[i] == item)//如果该元素值为item
m++;//计数+1
else
st->data[i - m] = st->data[i];//将不为item的元素向前挪动相应的m个位置,即覆盖删除值为item的元素
}
st->n -= m;//顺序表元素个数减去相应删除的元素个数
}

//如下的main函数执行后
int main()
{
int i;

SEQTABLE st = { 9, {0,5,7,9,8,7,2,6,7,9} };
delitem(&st, 7);

for (i = 1; i <= st.n; i++)
{
printf("%4d", st.data[i]);
}
printf("\n");
return 0;
}
/*执行的结果为
5 9 8 2 6 9*/