C 使用动态内存的插入排序
我不知道如何将参数传递给C 使用动态内存的插入排序,c,dynamic,C,Dynamic,我不知道如何将参数传递给insertSort。我也不确定是否正确使用了scanf 我希望动态数组如下所示: #包括 #包括 #包括 void insertSort(int-LENGTH,int*arr) { 内部温度; 对于(int i=0;i让我们一次只取一个。首先,您的insertSort不是插入排序。插入排序实现如下所示: void insertSort(int LENGTH, int *arr) { for (int i = 1; i < LENGTH; i++)
insertSort
。我也不确定是否正确使用了scanf
我希望动态数组如下所示:
#包括
#包括
#包括
void insertSort(int-LENGTH,int*arr)
{
内部温度;
对于(int i=0;i让我们一次只取一个。首先,您的insertSort
不是插入排序。插入排序实现如下所示:
void insertSort(int LENGTH, int *arr)
{
for (int i = 1; i < LENGTH; i++)
{
int tmp = arr[i], j;
for (j = i; j >= 1 && tmp < arr[j-1]; j--)
arr[j] = arr[j-1];
arr[j] = tmp;
}
}
void insertSort(int-LENGTH,int*arr)
{
for(int i=1;i=1&&tmp
接下来,当您测试函数等时,放弃用户输入,只需使用一组固定的数据作为测试用例来测试您的函数,例如
int main(void) {
int arr[] = { 10, 2, 8, 5, 4, 6, 7, 3, 9, 1 },
nmemb = (int)(sizeof arr/sizeof *arr);
insertSort (nmemb, arr);
for (int i = 0; i < nmemb; i++)
printf ("%3d", arr[i]);
putchar ('\n');
}
int main(无效){
int arr[]={10,2,8,5,4,6,7,3,9,1},
nmemb=(int)(sizeof arr/sizeof*arr);
插入排序(nmemb,arr);
对于(int i=0;i
最后,scanf
。除非验证其返回值,否则无法开始正确使用scanf
。此外,在您的情况下,如果用户键入的是“十”
而不是数字10
,会发生什么情况?请尝试一下
任何时候进行用户输入时,必须考虑输入缓冲区中保留的每个字符(stdin
),尤其是使用scanf
(或系列)进行输入时由于scanf
处理输入或匹配失败的方式。当任何一种情况发生时,都不会再读取更多字符,任何有问题的字符都会留在输入缓冲区中未读——只是等待下次尝试读取时再次咬你(如果你在循环中获取输入,通常会导致无限循环)
(这是建议使用面向行的函数(如fgets
或POSIXgetline
)进行用户输入的主要原因之一)
如果使用正确,可以使用scanf
。这意味着您每次都要负责检查scanf
的返回值。您必须处理三种情况
(return==EOF)
用户通过按Ctrl+d(或windows Ctrl+z,但请参见)生成手动EOF来取消输入
(return==预期的转换次数)
表示读取成功——然后由您检查输入是否满足任何附加条件(例如正整数、正浮点等);以及
否则,您必须处理匹配或输入失败,并且必须说明可能留在输入缓冲区中的每个字符。(通常,您将在输入缓冲区中向前扫描,直到发现'\n'
或EOF
丢弃任何剩余的无关字符)
如果您完成了您的工作,您可以根据需要成功地使用scanf
。您的scanf
使用看起来基本正常。insertSort()的参数
不要。该函数需要一个int
和一个int*
。而是提供一个int*
和一个int**
。去掉参数列表中的&
运算符。memset(arr,0,LENGTH)
仅将arr
的第一个10字节设置为零。您使用sizeof(int)*LENGTH
进行分配,为什么不使用memset
进行同样的操作呢?(不,如果您没有正确使用scanf
,则无法验证返回并处理(1)EOF,(2)匹配或输入失败,以及(3)良好的输入和(4)在上面(2)的情况下清空输入缓冲区)我像insertionSort(LENGTH,arr)和void insertionSort(int*LENGTH,int**arr)一样对它们进行了编辑,但出现了错误…^dynamic_sort.c:11:8:警告:赋值从指针生成整数而不使用强制转换[-Wint conversion]temp=arr[I];//和动态排序。c:41:21:警告:从不兼容的指针类型[-Wincompatible指针类型]insertSort(长度,arr);//排序!谢谢!非常有用,我将尝试编辑它们,但快速提问!对于(j=i;j>=1&&tmpj
循环从i
开始,然后是w从头到尾运行,直到找到tmp
不正确的元素(意味着找到tmp
大于arr
的元素)并插入tmp
(arr[i]
)。通过要求j>=1
确保使用arr[j-1]
测试的索引永远不小于0
)@clearlight,它当然可以被分离,但这是为(j=i;…;j-)
编写简单for循环的一种方便方法,您只需要两个条件来测试j>=1&&tmp
。你可以单独使用j>=1
,然后在循环内测试如果(arr[j-1]
。任何更清楚的都可以。@clearlight,是的,不用担心。我可以告诉你,我从89年起就在这些公司工作过(包括JSC、Rockwell Space Operations等)他们真的没有遵循一个行业标准。著名的短语“代码更像是一个指导原则的集合……”是什么意思?我更喜欢带有条件和函数等的“无拥抱”,在if(
或funcname)之间留有空格(
而不是在预算内。干净易读是关键。我已经为m
int main(void) {
int arr[] = { 10, 2, 8, 5, 4, 6, 7, 3, 9, 1 },
nmemb = (int)(sizeof arr/sizeof *arr);
insertSort (nmemb, arr);
for (int i = 0; i < nmemb; i++)
printf ("%3d", arr[i]);
putchar ('\n');
}