你能在不增加任何新函数的情况下对我的两个多项式的乘法函数提供一点帮助吗?我的程序工作,但它只将P的所有元素与Q的第一个元素相乘,然后,我想把q的指针移到第二个元素,直到最后一个,但我不知道怎么做。这是乘法的函数:
void multiply(Position Z, Position P, Position Q) {
P = P->next;
Q = Q->next;
while (P != NULL&&Q!=NULL) {
Z->coeff = P->coeff * Q->coeff;
Z->exp = P->exp + Q->exp;
sortedInput(Z, Z->coeff , Z->exp);
P = P->next;
while(Q!= NULL) {
Z->coeff = P->coeff * Q->coeff;
Z->exp = P->exp + Q->exp;
sortedInput(Z, Z->coeff , Z->exp);
Q = Q->next;
}
}
}
整个代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct polinom* Pozicija;
struct polinom {
int koef;
int exp;
Pozicija next;
};
void citaj(Pozicija, char*);
void ispis(Pozicija);
void sortUnos(Pozicija, int, int);
void zbroji(Pozicija, Pozicija, Pozicija);
void pomnozi(Pozicija, Pozicija, Pozicija);
int main() {
struct polinom P1, P2, Z, U;
P1.next = NULL;
P2.next = NULL;
Z.next = NULL;
U.next = NULL;
citaj(&P1, "P1.txt");
printf("Prvi polinom: ");
ispis(&P1);
citaj(&P2, "P2.txt");
printf("Drugi polinom: ");
ispis(&P2);
printf("\nZbroj:");
zbroji(&Z, &P1, &P2);
ispis(&Z);
printf("\nUmnozak: ");
pomnozi(&U, &P1, &P2);
ispis(&U);
}
void citaj(Pozicija P, char* ime) {
FILE* dat;
int k, e;
Pozicija q = NULL;
q = (Pozicija)malloc(sizeof(struct polinom));
dat = fopen(ime, "r");
if (dat == NULL)
printf("Greska!\n");
else {
while (feof(dat) == 0) {
fscanf(dat, "%d %d", &k, &e);
sortUnos(P, k, e);
q->koef = k;
q->exp = e;
}
}
fclose(dat);
}
void ispis(Pozicija P) {
P = P->next;
while (P != NULL)
{
printf("%dx^%d", P->koef, P->exp);
P = P->next;
if (P != NULL)
printf("+");
}
printf("\n");
}
void sortUnos(Pozicija P, int k, int e) {
Pozicija q;
while (P->next != NULL && P->next->exp > e)
P = P->next;
q = (Pozicija)malloc(sizeof(struct polinom));
q->exp = e;
q->koef = k;
q->next = P->next;
P->next = q;
}
void zbroji(Pozicija Z, Pozicija P, Pozicija Q) {
P = P->next;
Q = Q->next;
while (P != NULL && Q != NULL) {
if (P->exp == Q->exp)
{
Z->koef = P->koef + Q->koef;
Z->exp = P->exp;
sortUnos(Z, Z->koef, Z->exp);
P = P->next;
Q = Q->next;
}
else if (P->exp < Q->exp) {
Z->koef = Q->koef;
Z->exp = Q->exp;
sortUnos(Z, Z->koef, Z->exp);
Q = Q->next;
}
else if (P->exp > Q->exp) {
Z->koef = P->koef;
Z->exp = P->exp;
sortUnos(Z, Z->koef, Z->exp);
P = P->next;
}
}
if (P == NULL) {
while (Q != NULL) {
Z->koef = Q->koef;
Z->exp = Q->exp;
sortUnos(Z, Z->koef, Z->exp);
Q = Q->next;
}
}
else if (Q == NULL) {
while (P != NULL)
{
Z->koef = P->koef;
Z->exp = P->exp;
sortUnos(Z, Z->koef, Z->exp);
P = P->next;
}
}
}
void pomnozi(Pozicija Z, Pozicija P, Pozicija Q) {
P = P->next;
Q = Q->next;
while (P != NULL&&Q!=NULL) {
Z->koef = P->koef * Q->koef;
Z->exp = P->exp + Q->exp;
sortUnos(Z, Z->koef, Z->exp);
P = P->next;
while(Q!= NULL) {
Z->koef = P->koef * Q->koef;
Z->exp = P->exp + Q->exp;
sortUnos(Z, Z->koef, Z->exp);
Q = Q->next;
}
}
}
发布于 2020-12-06 04:26:29
这段代码有一些相当严重的问题。
pomnozi
在多个方面被打破了。外部循环首先将P
的第一个成员乘以Q
的第一个成员,然后立即推进P
,这样就再也看不到第一个成员了。但是,您需要将Q
.P
的所有成员乘以P = P->next
之后,才能推进P = P->next
,如果在内环后将P = P->next
移动到一个位置,则P
的成员将被Q
的第一个成员乘以两次。你根本不需要外乘。所有的工作都应该在内部循环中完成,P
的一个成员,pomnozi
的内环超过了Q
的成员。一旦Q
耗尽,代码应该返回,并将Q
乘以P
的下一个成员,但是它不能,因为Q
现在是NULL
,没有办法恢复它。您需要记住Q
是什么,并且在外部Q
的每一次迭代中重新初始化它,都不会检查多项式是否已经有一个具有给定指数的成员,因此,试图乘以例如(x+1) * (x+1)
(假设pomnozi
是固定的)将导致在结果中插入两次x
。通过使用交互式调试器,您应该能够自己找到这些东西。
还有其他问题。例如,第一个节点实际上不包含任何有意义的数据的链接列表的表示非常容易出错并具有误导性。
https://stackoverflow.com/questions/65167635
复制