0

我必须用 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 **
}  

我面临的问题是未决条款。我如何处理未决条款?
如何正确添加它们?

代码在这里: http: //pastebin.com/70UJdNiQ

4

2 回答 2

2

我已经阅读了你的代码。

您在函数 addPolyomials 中存在内存问题。
这个问题是错误的逻辑造成的:Leeor在他的回答中已经给了你解决方案:你需要else在 2nd 和 3rd ifs 之前添加单词。
如果你不这样做,那么当第一个 if 给出 TRUE 时,会创建一个新指针并将其添加到列表中,并且完成一个前进

因此,当达到 tne 2nd 时if,使用这些新的高级指针完成比较。
这是一个逻辑错误。

通过对程序进行此更改,还存在一些问题。

由于您将 polynomial3 初始化为垃圾,因此最终结果中显示了这一点。
也许您还必须初始化组件 exp 和 coef(为 0?)。

        polynomial3->exp = 0;
        polyoomial3->coef = 0;

main()“创建”多项式2时出现错误。
在那里,您正在使用列表多项式1。
该行必须更改为:

            polynomial2 = addTerm(polynomial2,exp,coef);

通过这些更改,我们可以观察程序的逻辑本身。
我得到了一个无意义的解决方案。
我认为您定义一些“待定”标志的想法是不够的。

您的逻辑似乎将多项式视为按顺序排列的指数。
但是用户不会以这种方式输入多项式。
您问题顶部的示例具有无序的指数(第一个多项式)。

我认为在输入列表时处理您的列表并按顺序排列可能是个好主意。由于术语是一次添加的,因此可以通过从列表顶部搜索列表并正确插入术语来轻松实现。
例如,如果您有5x^2 + 6x^3 + 9,第一步将在列表 polynomial1 的顶部插入 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 的项。

您的程序需要更多改进,但这超出了您的问题范围。

于 2013-09-03T20:40:08.450 回答
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)

于 2013-09-03T19:02:49.213 回答