我必须用C编写一个程序,我必须添加两个单变量多项式。我可以部分地做到这一点,我最终得到了错误的答案。
考虑两个多项式:
5x^2 + 6x^3 + 9
6x^3 + 5x^2 + 3x + 2
我知道答案是什么,手动。这是我的逻辑:
if(term1->exp == term2->exp){ // same power of x
// add them, store them in the final answer linked list
// increment pointers of both the term1 and term2 linkedlist
}
if(term1->exp > term2->exp){ // term1 has higher power of x than term2
// increment term1 linked list in search of lower power of x
// ** term1 is now pending **
}
if(term1->exp < term2->exp){ // term1 has lesser power of x than term2
// increment term2 linked list in search of lower power of x
// ** term2 is now pending **
}
我面临的问题是未决条款。我如何处理待决条款?
如何正确添加它们?
答案 0 :(得分:2)
我已阅读您的代码。
你在addPolyomials函数中有内存问题
这个问题导致了错误的错误: Leeor 已经在他的答案中给出了解决方案:您需要在第2和第3 else
之前添加单词if
。
如果不这样做,则当第一个if为TRUE时,会创建一个新指针并将其添加到列表中,并且提前完成。
因此,当达到第二if
时,使用这些新的高级指针完成比较。
这是一个逻辑错误。
通过对程序进行此更改,还存在一些问题。
由于您将polynomial3初始化为垃圾,因此会在最终结果中显示 也许你必须初始化组件exp和coef(到0?)。
polynomial3->exp = 0;
polyoomial3->coef = 0;
当您“创建”多项式2时,main()
出错
在那里,您正在使用列表多项式1
该行必须更改为:
polynomial2 = addTerm(polynomial2,exp,coef);
随着这些变化,我们可以观察程序的逻辑本身 我得到了一个无意义的解决方案 我认为你定义一些“待定”标志的想法是不够的。
你的逻辑似乎认为多项式就好像它们是有序的指数一样 但是用户不会以这种方式输入多项式 您问题顶部的示例使指数无序(第一个多项式)。
我认为在输入列表时处理您的列表可能是个好主意,将这些条款按顺序排列。由于这些术语是一次添加的,因此可以通过从列表顶部搜索并正确插入术语来轻松实现。
例如,如果您有5x^2 + 6x^3 + 9
,则第一步将在列表多项式1的顶部插入5 2。在下一次迭代中,对6 3将再次插入顶部,在对(5,2)之前,依此类推。你的最终名单是:
(6, 3, next), (5, 2, next), (9, 0, next), NULL
此过程可确保您可以根据需要进行迭代。 (有一个小问题:如果用户输入重复指数会发生什么?在这种情况下,没有新元素添加到列表中:只需添加新系数!)
最后,我们可以分析总和中“未决”的系数问题
注意,只有当两个列表都不为NULL时,while()
才会迭代
当while()
到达目的地时,只有三种情况可能:
(polynomial1 != NULL && polynomial2==NULL)
or well (polynomial2 != NULL && polynomial1==NULL),
or well both are NULL.
检查(polynomial1!= NULL)和(polynomial2!= NULL)就足够了。
在第一种情况下,只需将多项式1的待定项“粘贴”到多项式3即可
在第二种情况下,对多项式2执行相同的操作。
最后,在显示功能中,您可以更好地处理系数为0的术语 可能最好不显示系数为0的术语。
您的计划需要更多改进,但这超出了您的问题范围。
答案 1 :(得分:1)
你不应该用更高的权力推进这个术语,如果它更高(假设你的列表按降序排序),那么你可以将它添加到最终答案并完成它 - 你知道其他列表没有任何匹配的术语。 在伪 -
if (term1->exp == term2->exp) { add and store, advance both }
else if (term1->exp > term2->exp) { add term1 to the result list and advance it }
else { add term2 to the result list and advance it }
然后只处理具有剩余部分的列表(较小的术语)
如果未对列表进行排序,请注意为了找到您需要支付O(N ^ 2)的每个术语的匹配项,请考虑先对两个列表进行排序(对于较低的O(NlogN)惩罚) ,然后如上所述在O(N)
中遍历它们