前一篇的顺序表的删除只考虑了删除一个值,当顺序表有多个相同的值要删除的时候就得删除多次了
删除一个值后得继续判断后面的值是否相同,所以删除一个值得时候要把后面的值向前移动,移动后继续遍历
#include <stdio.h>
#define N 50
int a[N]={0};
void CreateArr(int *a, int len) //创建顺序表
{
printf("请输入%d个整型数据:\n",len);
for(int i=0; i<len; i++)
scanf("%d",&a[i]);
printf("数据输入完毕.\n");
}
void PrintArr(int *a, int len) //输出顺序表
{
printf("输出数据.\n");
for(int j=0; j<len; j++)
printf("%-3d",a[j]);
printf("\n");
}
int DeleteElement(int *a, int len, int val) //按值删除(多个值相同的情况)
{
int i, j;
for(i=0; i<len; i++) //遍历数组
{
if(a[i]==val) //查找到要删除的值就把后面的值向前移
{
for(j=i; j<len; j++)
{
a[j] = a[j+1];
}
--len; //前移后长度减1
--i; //前移后要从找到删除值的位置重新判断
}
}
return len;
}
void main()
{
int n;
int val;
printf("请问你想输入几个整型数据.\n");
scanf("%d", &n);
CreateArr(a, n);
PrintArr(a, n);
printf("请输入你要删除的数据:\n");
scanf("%d", &val);
n=DeleteElement(a, n, val);
PrintArr(a, n);
}