【发布时间】:2023-03-21 17:21:01
【问题描述】:
目标:在 L.H.S 上排列数组的负元素,在 R.H.S 上排列正元素
使用:递归
使用的数据类型:我使用了 Array,但它位于结构内,即 Array ADT
错误:分段错误
#include <stdio.h>
#include <stdlib.h>
struct Array
{
int a[10];
int len;
};
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void NegativeSort(struct Array *arr, int i, int j)
{
if(i < j)
{
if(arr-> a[i] > 0 && arr-> a[j] <= 0)
{
swap(&arr-> a[i], &arr-> a[j]);
NegativeSort(arr, i++, j--);
}
else if(arr-> a[i] >= 0)
NegativeSort(arr, i, j--);
else
NegativeSort(arr, i++, j);
}
}
int main()
{
struct Array arr = {{-1,2,-3,4,-5,6,-7,8},8};
NegativeSort(&arr, 0, 7);
printf("elements are : ");
for(i = 0; i < arr.len - 1; i++)
printf("%d", arr.a[i]);
return 0;
}
【问题讨论】:
-
1) 您的结构数组有 8 个“有效”元素:
arr->a[0]到arr->a[7]。您尝试访问arr->a[8],即0。 -
注明。但即使你把
NegativeSort(&arr,0,1)作为参数,它仍然会给出分段错误错误。 -
修复该错误...从
i访问元素到j-1。我怀疑这与你的无限递归有关。 -
递归函数中的后自增和自减有什么意义?
i和j不再使用,因此它没有做任何有用的事情。您的意思是增加/减少一些其他值,还是预先增加/减少?就目前而言,i和j被原封不动地传递给递归,即它总是像NegativeSort(arr, i, j);一样有效地递归,也许NegativeSort(arr, i, j--);应该是NegativeSort(arr, i, j-1);等等。 -
...如果
(i < j)在第一个函数调用开始时为真,那么它将永远为真,因此无限递归。