欢迎光临散文网 会员登陆 & 注册

【浙江大学】数据结构

2023-02-18 21:32 作者:云宵星海  | 我要投稿

多项式的和与积

#include<iostream>

using namespace std;


typedef struct PolyNode

{

int coef; //常数

int expon; //系数

struct PolyNode* next; //指向下一节点的指针 

}* Polynomial;


Polynomial CreatePolynomial(Polynomial P, int num); //创建多项式

int Compare(int expon1, int expon2); //比较系数大小

Polynomial PolynomialAdd(Polynomial P1, Polynomial P2); // 多项式相加

Polynomial PolynomialMulti(Polynomial P1, Polynomial P2); //多项式相乘

void AttachPolynomial(int coef, int expon, Polynomial* rear); //多项式链接(注意:指针的指针)

void Output(Polynomial P); //输出多项式 


int main(void)

{

Polynomial P1 = NULL, P2 = NULL, Export = NULL;

int x1, x2;

cout << "第一项项数:";

cin >> x1;

P1 = CreatePolynomial(P1, x1);

Output(P1);

cout << "第二项项数:";

cin >> x2;

P2 = CreatePolynomial(P2, x2);

Output(P2);

cout << "多项式的和:";

Export = PolynomialAdd(P1, P2);

Output(Export);

cout << "多项式的积:";

Export = PolynomialMulti(P1, P2);

Output(Export);

return 0;

}


Polynomial CreatePolynomial(Polynomial P, int num)

{

// P = (Polynomial)malloc(sizeof(PolyNode));

Polynomial Q;

P = new PolyNode;

P->next = NULL;

Q = P;

Polynomial temp;

int i;

for (i = 0; i < num; i++) //链接 

{

temp = new PolyNode;

cout << "输入常数:";

cin >> temp->coef;

cout << "输入系数:";

cin >> temp->expon;

/*Q->next = temp;

Q = temp;

temp->next = NULL;*/

AttachPolynomial(temp->coef, temp->expon, &Q);

}

return P;

}

int Compare(int expon1, int expon2)

{

if (expon1 > expon2)

return 1;

else if (expon1 < expon2)

return -1;

else

return 0;

}

Polynomial PolynomialAdd(Polynomial P1, Polynomial P2)

{

Polynomial front, rear;

int sum;

P1 = P1->next;

P2 = P2->next;

rear = new PolyNode;

front = rear; //front记录多项式头节点的位置 

while (P1 && P2)

{

switch (Compare(P1->expon, P2->expon))

{

  case 1:

AttachPolynomial(P1->coef, P1->expon, &rear);

P1 = P1->next;

break;

case -1:

AttachPolynomial(P2->coef, P2->expon, &rear);

P2 = P2->next;

break;

case 0:

sum = P1->coef + P2->coef;

if (sum != 0)

AttachPolynomial(sum, P1->expon, &rear);

P1 = P1->next;

P2 = P2->next;

break;

}

}

while (P1 != NULL) //拼接剩余项 

{

AttachPolynomial(P1->coef, P1->expon, &rear);

P1 = P1->next;

}

while (P2 != NULL)

{

AttachPolynomial(P2->coef, P2->expon, &rear);

P2 = P2->next;

}

rear->next = NULL;

return front;

}

Polynomial PolynomialMulti(Polynomial P1, Polynomial P2)

{

Polynomial front = new PolyNode, rear, temp, TP1, TP2;

int tcoef, texpon;

front->next = NULL;

rear = front;

TP1 = P1;

TP2 = P2;

TP1 = TP1->next;

TP2 = TP2->next;

while (TP2) //先计算出一项的结果,然后再按降序插入

{

AttachPolynomial(TP1->coef * TP2->coef, TP1->expon + TP2->expon, &rear);

TP2 = TP2->next;

}

//Output(front);

TP1 = TP1->next;

while (TP1)

{

rear = front; //指针返回

TP2 = P2->next; //第二项返回

while (TP2)

{

tcoef = TP1->coef * TP2->coef;

texpon = TP1->expon + TP2->expon;

while (rear->next && rear->next->expon > texpon) //比较的是rear的下一项,这样正好可以找到满足的前一项

rear = rear->next;

if (rear->next && rear->next->expon == texpon) //指数相等情况

{

if (rear->next->coef + tcoef) //判断是否等于0,不为零直接加,为0删除

rear->next->coef += tcoef;

else

{

temp = rear->next;

rear->next = temp->next;

delete temp;

}

}

else //小于情况需要往中间插入结点,另外写,无法调用attach函数,

{

temp = new PolyNode;

temp->coef = tcoef;

temp->expon = texpon;

temp->next = NULL;

temp->next = rear->next;

rear->next = temp;

rear = rear->next;

}

TP2 = TP2->next;

}

TP1 = TP1->next;

}

return front;

}

void AttachPolynomial(int coef, int expon, Polynomial* rear)

{

Polynomial P = new PolyNode;

P->next = NULL;

P->coef = coef;

P->expon = expon;

(* rear)->next = P;

*rear = P;

(* rear)->next = NULL;

}

void Output(Polynomial P)

{

P = P->next;

while (P)

{

cout << P->coef << "x" << P->expon;

if (P->next)

{

if (P->next->coef > 0)

{

cout << "+";

}

}

P = P->next;

}

cout << endl;

}

【浙江大学】数据结构的评论 (共 条)

分享到微博请遵守国家法律