返回给定序列的多数元素(如果存在)
参数
const元素 getMajElDC(const Element * const * sequence,size_t sequenceLength); "
实际上,我只是尝试实施此解决方案:http://www.ece.northwestern.edu/~dda902/336/hw4-sol.pdf
这是我的方法:
const Element* getMajElDC(const Element* const * sequence, size_t,sequenceLength){
printf("1\n");
const Element* element_tmp_right;
const Element* element_tmp_left;
int occurence_left = 0;
int occurence_right = 0;
if (sequenceLength == 1)
return sequence[1];
int mid = (int)sequenceLength/2;
element_tmp_left = getMajElDC(sequence,mid);
if (sequenceLength%2 == 0)
element_tmp_right = getMajElDC(&sequence[mid],mid);
element_tmp_right = getMajElDC(&sequence[mid],mid+1);
if (element_tmp_left == NULL && element_tmp_right != NULL)
return element_tmp_right;
if (element_tmp_right == NULL && element_tmp_left != NULL)
return element_tmp_left;
if (element_tmp_right == NULL && element_tmp_left == NULL)
return NULL;
if (areEqual(element_tmp_left,element_tmp_right))
return element_tmp_left;
for (int i=0;i<sequenceLength;i++){
if( areEqual(sequence[i],element_tmp_left))
occurence_left++;
if (areEqual(sequence[i],element_tmp_right))
occurence_right++;
}
if (occurence_left > mid+1)
return element_tmp_left;
else if (occurence_left > mid+1)
return element_tmp_left;
else
return NULL;
}
当我尝试在codeblocks中运行它时,.exe只是停止工作。就像功能无穷无尽一样。这就是为什么我在开头放置一个printf的原因:我想知道&#34; 1&#34;将出现在应用程序窗口中,它出现很多次,一切都变得疯狂。
我试着查看递归的基本情况,但似乎没有任何问题......
我真的失去了对C的不了解,有没有人知道问题出在哪里?
Ps:areEqual()函数只是一个给定的函数,这里是它的实现,但没有什么特别之处:
bool areEqual(const Element* a, const Element* b)
{
return a->value == b->value;
}
带
struct element_t
{
int value;
};
typedef struct element_t Element;
为了结束我的问题,我事先告诉你,如果遗漏了重要信息,我很抱歉:这是我第一次使用本网站,请放纵!
答案 0 :(得分:0)
你必须使用调试器它会立即显示问题所在。 BTW仔细看看这段代码:
if (sequenceLength == 1)
return sequence[1];
int mid = (int)sequenceLength/2;
element_tmp_left = getMajElDC(sequence,mid);
if (sequenceLength%2 == 0)
element_tmp_right = getMajElDC(&sequence[mid],mid);
element_tmp_right = getMajElDC(&sequence[mid],mid+1);
您在sequenceLength == 1
时关闭递归,但如果使用getMajElDC
调用sequenceLength=0
,将永远不会返回。
考虑修改:
if (sequenceLength == 1)
return sequence[1];
为:
if (sequenceLength <= 1)
return sequence[1];
答案 1 :(得分:0)
请考虑以下代码段:
int mid = (int)sequenceLength/2;
element_tmp_left = getMajElDC(sequence,mid);
if (sequenceLength%2 == 0)
element_tmp_right = getMajElDC(&sequence[mid],mid);
element_tmp_right = getMajElDC(&sequence[mid],mid+1);
请注意,无论getMajElDC
的值如何,始终会调用对sequenceLength
的第三次调用。我怀疑你想写这个:
if (sequenceLength%2 == 0)
element_tmp_right = getMajElDC(&sequence[mid],mid);
else
element_tmp_right = getMajElDC(&sequence[mid],mid+1);