C语言编程,删除数组a中值为x的第一个元素。

请编写函数void delSq(int a[], int x, int *length)。该函数的功能是:删除数组a中值为x的第一个元素。函数第一个参数数组a接收的元素保证非递减有序,第二个参数x为要删除元素的值,第三个参数length为当前数组中实际存储元素个数,注意删除值为x元素后保持length值正确。
例如:初始状态,包含6个元素的数组为:{2,4,5,5,7,9},假设x值为5,执行该函数之后,数组变为:{2,4,5,7,9},并且数组长度length由6变为5。

这个题目的解题思路为:因为数组a已非递减有序,所以一般先对其进行二分查找,但要找到第一个x所在的下标,然后再对其进行删除。
int BitSearch(int a[], int x, int left, int right) { /*在数组a的从left到right的区域内二分查找x第一次出现的位置,如果不存在返回-1*/
int mid, i;
while(left <= right) {
mid = (left + right) / 2;
if(a[mid] == x) break;
if(a[mid] > x) right = mid - 1;
if(a[mid] < x) left = mid + 1;
}
if(left > right) return -1;
for(i = mid; i >= left && a[i] == x; i--); //寻找第一个x的位置
return i + 1;
}
void Romove(int a[], int *length, int index) {
int i;
if(index < 0 || index >= *length) return ; //删除的位置越界
for(i = index; i < *length - 1; i++) a[i] = a[i + 1];
*length--;
}

void delSq(int a[], int x, int *length) {
int index = BitSearch(a, x, 0, *length - 1);
Remove(a, length, index);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-24
int main()

{

void delSq(int a[], int x, int *length);

int a[10] = {1,2,3,4,5,6,7,8,9,10};

int x = 5;

int a_length = sizeof(a)/sizeof(int);//整型数组求数组长度

int *length = &a_length;

printf("a_length = %d\n",a_length);

delSq(a, x, length);

return 0;

}

void delSq(int a[], int x, int *length)

{

for (int i = 0; i < 10; i++) {

if (a[i] == x) {//遍历数组,找到要删除的值

for (int j = i; j<10; j++) {

a[j] = a[j+1];//将要删除的值之后的所有元素前移一位

}

}

}

//遍历数组 输出数组中元素

for (int i = 0; i < 9; i++) {

printf("%d\n",a[i]);

}

}
这是对c数组的直接操作 只能这么样了 ,题目要求能够对数组动态的分配空间,我认为用链表来实现比较好
第2个回答  2020-01-07
#include
<stdio.h>
void
main()
{
int
i,n,k,m;
int
a[10]
=
{1,2,3,4,5,6,7,8,9,10};
printf("请输入要删除的数字:\n");
scanf("%d",&n);
printf("删除前的数组为:\n");
for(i=0;i<10;i++)
{
printf("%d
",a[i]);
}
printf("\n");
printf("删除后的数组为:\n");
m=10;
for(i=0;i<10;i++)
{
if(a[i]
==
n)
{
m--;
for(k=i;k<10;k++)
{
a[k]
=
a[k+1];
}
}
}
for(i=0;i<m;i++)
printf("%d
",a[i]);
printf("\n");
}
第3个回答  2013-12-23
#include <stdio.h>void delSq(int a[], int x, int *length);
int main(){ int a[6] = {2,4,5,5,7,9}; int m =6; delSq(a,5,&m); for (int i=0;i<m;i++){ printf (" %d",a[i]); } return 0;}

void delSq(int a[], int x, int *length){ for (int i =0;i<(*length);i++){ if (a[i] == x){ for ( int j=i+1; j<=(*length); j++ ) a[j-1]=a[j]; (*length)--; break; } }}
你看着行吗??