情况一:数据集合无重复值
设有数据集合 Data = { 3, 2, 5, 8, 4, 7, 6, 9}, 无序且不重复
目标
- 给定key值,在 Data 中删除
解决
-
第一步:查找 key
-
第二步:判断是否找到
- 找到,则进行删除
- 未找到
代码(个人推荐第三种盒第四种)
main函数部分
int main(void)
{
int a[8] = {3, 2, 5, 8, 4, 7, 6, 9};
int key, n;
key = 7;
n = DelKeyNode(a, 8, key);
for(int i = 0; i < n; i ++)
printf("%5d", a[i]);
return 0;
}
- 第一种
int DelKeyNode(int a[], int n, int key)
{
int i, j;
for(i = 0; i < n && a[i] != key; i ++);
if(i == n)
{
printf("未找到");
return n;
}
else
{
for(j = i; j < n-1; j ++)
a[j] = a[j+1]; // 说一下当时在这块遇到的bug: j+1 与 j ++ 的输出情况不同
return n-1;
}
}
缺点:双窗口出去
- 第二种
int DelKeyNode(int a[], int n, int key)
{
int i, j;
for(i = 0; i < n && a[i] != key; i ++);
if(i == n)
{
printf("未找到");
}
else
{
for(j = i; j < n-1; j ++)
a[j] = a[j+1];
n --;
}
return n;
}
单一出口
- 第三种
int DelKeyNode(int a[], int n, int key)
{
int i, j;
for(i = 0; i < n && a[i] != key; i ++);
if(i == n)
{
printf("未找到");
}
else
{
for(; i < n-1; i ++)
a[i] = a[i+1];
n --;
}
return n;
}
单一出口+剑走偏锋
- 第四种
int DelKeyNode(int a[], int n, int key)
{
int i, j;
int swap;
for(i = 0; i < n-1; i ++)
{
if (a[i] == key)
{
swap = a[i];
a[i] = a[i+1];
a[i+1] = swap;
}
}
return n-1;
}
情况二:数据集合含重复值
设有数据集合 Data = { 3, 2, 5, 3, 4, 7, 6, 9, 3, 3}
目标
- 给定key值,在 Data 中删除
解决
- 边找边删
代码
main函数部分
int main(void)
{
int a[10] = {3, 2, 5, 3, 4, 7, 6, 9, 3, 3};
int key, n;
key = 3;
n = DelKeyNode(a, 10, key);
for(int i = 0; i < n; i ++)
printf("%5d", a[i]);
return 0;
}
- 方法一
int DelKeyNode(int a[], int n, int key)
{
int i = 0, j;
while(i<n)
{
if(a[i] != key)
i ++;
else
{
for(j = i; j < n-1; j ++)
a[j] = a[j+1];
n--;
}
}
return n;
}
- 方法二:空间换时间
int DelKeyNode(int a[], int n, int key)
{
int b[n], j, i;
j = 0;
for(i = 0; i < n; i ++)
{
if (a[i] != key)
{
b[j] = a[i];
j ++;
}
}
for(i = j; i >= 0; i --)
{
a[i] = b[i];
}
return j;
}
- 方法三
int DelKeyNode(int a[], int n, int key)
{
int i = 0, j;
while(i != n)
{
for(i = 0; i<n && a[i] != key; i ++);
if(i < n)
{
for(j = i; j < n-1; j ++)
{
a[j] = a[j+1];
}
n --;
}
}
return n;
}
- 方法四
int DelKeyNode(int a[], int n, int key)
{
int i, j;
for(i = 0, j = 0; i < n; i++)
{
if( a[i] != key)
{
a[j] = a[i];
j ++;
}
}
return j;
}
至于代码解释及方法解释,有时间再补。