C语言编程题: 编写函数,从一个已经排序的数组中删去某数后,该数组仍然有序.

提示:要分3种情况,若该数是数组中的最后一个数,则直接删除;若该数是数组中的第一个数,则将它删除后其余的都往前移;若该数在数组中间,则将它删除后,后面的数都要往前移。 给个详细有说明的每一步最好解释下,要用递归法, 我上课没听懂........ 好的追加100分

#include <stdio.h>
#include <stdlib.h>

int compear(void *, void *);
int delEle(int *, int, int);
int main(int argc, char *argv[])
{
int len = 10;
int arrs[10] = {4, 1, 5, 2, 7, 3, 9, 0, 6, 8};
int i;

qsort(arrs, 10, sizeof(int), compear);

for(i = 0; i < 10; i++)
printf("%d ", arrs[i]);

printf("\n");
len = delEle(arrs, 2, len);//delete 2
printf("\n");
len = delEle(arrs, 11, len);//delete 11 but doesn't exist
rdel(arrs, 2, len, 0);
return 1;
}

int compear(void *a, void *b)
{
int *ma = (int *)a, *mb = (int *)b;
if(*ma > *mb)
return 1;
if(*ma == *mb)
return 0;
if(*ma < *mb)
return -1;
}

int delEle(int *arr, int ele, int len)
{
int i, j, found = 0, mlen = len;
for(i = 0; i < len; i++){
if(arr[i] == ele){
for(j = i; j < len - 1; j++){
arr[j] = arr[j + 1];
}
found = 1;
mlen--;
}
}

if(found == 0)
printf("element %d doesn't exists!\n", ele);
for(i = 0; i < mlen; i++)
printf("%d ", arr[i]);
return mlen;//return the length of the arrays
}
//递归删除
int rdel(int *ar, int ele, int len, int flag)//flag为是否前面删除过元素的标记
{
int tmp;

if(len == 1)//数组结束
return *ar;
if(*ar == ele || flag == 1){//发现删除元素或前面删过元素 后面的元素全部前移一位
tmp = *ar;
*ar = rdel(ar + 1, ele, len - 1, 1);
return tmp;
}else{
rdel(ar + 1, ele, len - 1, 0);//前面未删 跳过
}
递归这个比较粗糙 没有边界检查,删最后一个可能有点问题 自己修改下好了
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-31
int Del(char *a,int n,int e) //a为数组名,n表示数组长度,e表示要删除元素
{
int i=0,j;
while(i<n) //i从0到n
{
if(a[i]==e) //如果是要删除的元素
{
j=i; //删除a[i],就是将其后面的元素前移
while(j<n-1)
a[j]=a[j+1];
n--; //数组长度减1
i--; //当前元素是后面移来的,下次应该是判断当前元素是否为e,因为后面有i++,所以需要i--
}
i++;
}
return n; //返回删除元素后数组长度
}
//这个函数无论哪种情况都可以完成呀。

...已知一个排好序的数组,删除一个数使数组仍然有序。(要程序不要方法...
include <stdio.h>int main(){int v[10] = {0,1,2,3,4,5,6,7,8,9};int i,p,n = 10;printf("删除前:");for(i = 0; i < n; ++i)printf("%3d",v[i]);printf("\\n");do{printf("输入要删除的数据下标(0 - %d):",n);scanf("%d",&p);if(p >= 0 && p <...

C语言编写函数,从一个排好序的整型数组中删去某数
include <stdio.h>void deletex(int a[],int &n,int x){int i; for(i=0;i<n&&a[i]<x;i++); if(i==n||a[i]>x) {printf("fail!\\n"); return;} for(;i<n;i++)a[i]=a[i+1]; n--; for(i=0;i<n;i++) printf("%d ",a[i]); printf("\\n"); }int...

C语言编程:有一个已排好序的数组,现输入一个数插入到数组中,要求插入该...
main(){ int a[100],n=10,i,j,x;\/*输入10个数*\/ for (i=0;i<n;i++) scanf("%d", &a[i]);\/*输入1个数*\/ scanf("%d",&x);\/*找到需要插入的位置j*\/ for (i=0;i<n;i++) if (a[i]<x) j=i+1;\/*把j之后的数据后移*\/ for (i=n;i>j;i--) a[i]=a[i-...

C语言,删除数组中的一个数,删除后显示其他剩余数字。
戍卒(I)= I 下一 因此,数组的值是0,1,2,4 ..

c语言程序设计:有一个已排好序的数组,要求输入一个数后,按原来排序的规...
为了把一个数按大小插入已排好序的数组中,应首先确定排序是从大到小还是从小到大进行的。设排序是从大到小进序的,则可把欲插入的数与数组中各数逐个比较,当找到第一个比插入数小的元素i时,该元素之前即为插入位置。然后从数组最后一个元素开始到该元素为止,逐个后移一个单元。最后把插入数...

C程序编写,将一个数插入到一个已经有序的数组里,要求保持有序
源程序如下:define _CRT_SECURE_NO_WARNINGS include<stdio.h> int main(){ int i, j, t, k;\/\/定义循环变量 const int n = 10;\/\/定义数组元素个数 int a[n], b[n + 1];\/\/定义两个数组 printf("您喜欢的有序数组:\\n");\/\/输入数组序列文字提 for (i = 0; i < n; i++)...

C语言中,有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它...
C语言,有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中。解:include int main(){ int a[11]={1,4,6,9,13,16,19,28,40,100};int temp1,temp2,number,end,i,j;printf("array a:\\n");for (i=0;i<10;i++)printf("%5d",a[i]);printf("\\n");pri...

c语言:编写程序,在有序的数列中查找某数,若该数在此数列中则输出它的...
题目:试编写一个程序完成:有15个数按从下到大的顺序存放在一个数组中.输入一个数,要求折半查找法找出该数是数组中第几个元素的值.如果该数不在数组中,输出“不在表。===下面是C代码,其中数组没有设计为录入,而是固定数组=== \/\/输出的序列是从0开始算的,也就是输出的是所在数组的索引...

C语言编程:一个已经排好序的数组,往里插一个数,并找出他插到哪里...
2013-01-04 C语言有一个已排好序的整型数组,有10个元素,要求从键盘输入... 97 2014-05-11 c语言程序编写 有一个已排好序的数组,由键盘又输入一个数,要... 103 2020-06-03 有一个已排好序的数组,要求输入一个数后,将此数插入到数组中,... 2015-01-04 c语言向一个已经排好序的数组中插入一...

C语言编程,在一维数组中删去其中的偶数,让奇数紧缩排列并输出(只有一...
include <stdio.h>int Remove(int a[], int len);void print_arr(int a[], int n);int main(void){int a[] = {1, 2, 3, 4, 5};int l;if (l = Remove(a, 5))print_arr(a, l);return 0;}int Remove(int a[], int len){int i, j;ifor (i = 0, j = 0; i ...

相似回答