C语言编程题: 编写函数,从一个已经排序的数组中删去某数后,该数组仍然有序.
提示:要分3种情况,若该数是数组中的最后一个数,则直接删除;若该数是数组中的第一个数,则将它删除后其余的都往前移;若该数在数组中间,则将它删除后,后面的数都要往前移。给个...
提示:要分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);//前面未删 跳过
}
递归这个比较粗糙 没有边界检查,删最后一个可能有点问题 自己修改下好了
#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);//前面未删 跳过
}
递归这个比较粗糙 没有边界检查,删最后一个可能有点问题 自己修改下好了
展开全部
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; //返回删除元素后数组长度
}
//这个函数无论哪种情况都可以完成呀。
{
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; //返回删除元素后数组长度
}
//这个函数无论哪种情况都可以完成呀。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询