qq_花开花谢_0
这个题目中有两个地方需要明确。① 纯C的话, 除非使用动态分配的数组,否则对固定的数组作insert几乎不可能;② 其实insert不一定老老实实地对数组的每个元素作比较大小,那样效率不高。 你可以直接添加到新的数组的末尾, 然后排序一下就可以了。下面给了比较完整的例子, 里面包含两个部分, 即对固定维数的数组作“伪”insert操作, 其实就是拷贝到新的扩展后的数组, 添加, 排序, 然后输出; 另一个部分, 则是利用动态数组, 然后realloc扩展, 注意realloc成功后, 需要把新的地址指向先前的那个动态数组, 这样才是扩容。排序和数组打印都用到了额外的函数, 一并附上了。#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXCHARS 5 /* INT_MAX digits */int insert_static(const int arr[], const unsigned int arr_size, const int val_ins);int insert_dynamic(int **parr, const unsigned int arr_size, const int val_ins);int cmpval(const void * a, const void * b);int print_array(const int *arr, const unsigned int arr_size);int main(int argc, char *argv[]){int arr_input[] = { 40, -10, 100, 90, 20, 25 };int *dyn_arr;unsigned int arrsize;int i;char line[MAXCHARS+1] = {'\0'};int val_insert;/* 1. Get input array size & sort it if not sorted yet */arrsize = sizeof(arr_input)/sizeof(arr_input[0]);qsort(arr_input, arrsize, sizeof(int), cmpval);/* 2. Get a input number for inserting */printf("Input a integer : ");fgets(line, sizeof(line), stdin);sscanf(line, "%d", &val_insert);/* 3. Print the original input array */printf("The original array is : \n");print_array(arr_input, arrsize);/* 4. Static array pseudo inserting */printf("The static array pseduo insert result :\n");insert_static(arr_input, arrsize, val_insert);/* 5. Dynamic array inserting *//* 5a) dynamic allocating */dyn_arr = (int *)malloc(arrsize*sizeof(int));if (dyn_arr == NULL){fputs("Error in memory allocation.", stderr);return -1;}/* 5b) memory copy */memcpy(dyn_arr, arr_input, arrsize*sizeof(int));/* 5c) inserting */printf("The dynamic array inserting result: \n");insert_dynamic(&dyn_arr, arrsize, val_insert);/* 5d) memory release */free(dyn_arr);/* 6. The end... */return 0;}int insert_static(const int arr[], const unsigned int arr_size, const int val_ins){int *pNewArray;unsigned int new_arr_size;new_arr_size = arr_size + 1;pNewArray = (int*)(malloc(new_arr_size * sizeof(int)));if (pNewArray == NULL)return -1;memcpy(pNewArray, arr, arr_size*sizeof(int));pNewArray[arr_size] = val_ins;qsort (pNewArray, new_arr_size, sizeof(int), cmpval);print_array(pNewArray, new_arr_size);free(pNewArray);return 0;}int insert_dynamic(int **parr, const unsigned int arr_size, const int val_ins){int *ptemp;unsigned int new_arr_size;new_arr_size = arr_size + 1;ptemp = (int*)realloc(*parr, new_arr_size*sizeof(int));if (ptemp == NULL)return -1;*parr = (int*)ptemp;(*parr)[new_arr_size-1] = val_ins;qsort ((*parr), new_arr_size, sizeof(int), cmpval);print_array((*parr), new_arr_size);return 0;}int cmpval(const void * a, const void * b){return ( *(int*)a - *(int*)b );}int print_array(const int *arr, const unsigned int arr_size){int i;for (i=0; i<arr_size; i++)printf("%d ",arr[i]);printf ("\n");return 0;}
慕沐林林
题目的意思就是写一个带参函数insert。#include <stdio.h>#include <stdlib.h>int b[20];int* insert(int n,int num,int a[]){//输入的数为n,num为数组的长度,有序的数为a[]int i;for(i=0;i<num;i++){ b[i]=a[i];} //把a数组里的数 复制到 b数组b[num]=n;//把插入的数放在最后一位for(i=num;n<b[i-1];i--){//若新加入的数比前一位数小,就和前一位交换数据int shu; //交换位置过程shu=b[i];b[i]=b[i-1];b[i-1]=shu;}return b;}int main(int argc, char *argv[]){int n;scanf("%d",&n);//输入要插入的数int i;int a[10]={1,11,21,31,41,51,61,71,81,91};int k=sizeof(a)/sizeof(int);//计算数组的长度int a2[k+1]; //定义一个比原数组长度大一的数组insert(n,k,a);//数据都存在全局数组b[20]里了for(i=0;i<k+1;i++)//sizeof(a)/sizeof(int)+1表是比原数组的长度大了一的数a2[i]=b[i]; //存入合适的数组里for(i=0;i<k+1;i++)//显示printf("%d ",a2[i]);system("PAUSE");return 0;}看得懂不?
九州编程
#include <stdio.h>void insert(int *Array,int elem,int len){//该函数实现将元素elem插入到有序数组Array中使得Array任然有序//查找插入位置int i,j;for(i=0;i<len;i++){if(Array[i]>elem)//即找到插入元素的位置即为第i个位置break;}//将原来第i~len-1位置的所有元素向后以一个位置for(j=len-1;j>=i;j--)Array[j+1]=Array[j];//将元素插入到正确的位置即可Array[j+1]=elem;}int main(){//因为要插入元素所以数组空间应该比实际元素空间多一个int a[9]={1,2,3,5,6,7,8,9};int len,insertnum,i;len=sizeof(a)/sizeof(int);//输入数据printf("输入需要插入到数组中的数:");scanf("%d",&insertnum);//执行插入元素insert(a,insertnum,len-1);//遍历输出数组元素printf("插入元素%d后:",insertnum);for(i=0;i<len;i++)printf("%d ",a[i]);printf("\n");return 0;}