您的位置:首页 > 理论基础 > 数据结构算法

《数据结构学习与实验指导》3-4:一元多项式的乘法与加法运算

2017-06-10 23:51 190 查看
实验内容:分别求两个一元多项式的乘积与和。

输入说明:输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数。数字间以空格分隔。

输出说明:输出分2行,分别以指数递降方式输出乘积多项式与和多项式的系数和指数。数字间以空格分隔,但结尾不能有多余空格。

测试用例:

4 3 4 -5 2 6 1 -2 0

3 5 20 -7 4 3 1 |

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1

18 2 -6 1 5 20 -4 4 -5 2 9 1 -20

2 1 2 1 0

2 1 2 -1 0 |

1 4 -1 0

2 2

2 -1000 1000 1000 0

2 1000 1000 -1000 0 |

-1000000 2000 2000000 1000 -1000000 0

0 0

0

1 199 1000 |

0 0

999 1000

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
int cn;
int en;
struct Node *next;
} *PNode, *PLink;

PLink init();
void add(PLink link, int cn, int en);
void insert(PLink link, int cn, int en);
void release(PLink link);
void print(PLink link
4000
);
void plus(PLink link1, PLink link2);
PLink mutiply(PLink link1, PLink link2);

int main() {
int N;
int c, e;
scanf("%d", &N);
PLink link1 = init();
for (int i = 0; i < N; i++) {
scanf("%d %d", &c, &e);
add(link1, c, e);
}
insert(link1, 0, 0);
scanf("%d", &N);
PLink link2 = init();
for (int i = 0; i < N; i++) {
scanf("%d %d", &c, &e);
add(link2, c, e);
}
insert(link2, 0, 0);
PLink link4 = mutiply(link1, link2);
print(link4);
plus(link1, link2);
print(link2);
release(link1);
release(link2);
release(link4);
return 0;
}

PLink init() {
PNode Node_3_4 = (PNode) malloc(sizeof(PNode));
Node->next = NULL;
return Node;
}

void add(PLink link, int cn, int en) {
PNode node = (PNode) malloc(sizeof(PNode));
node->cn = cn;
node->en = en;
node->next = NULL;
PNode p = link;
while (p->next != NULL) {
p = p->next;
}
p->next = node;
}

void insert(PLink link, int cn, int en) {
PNode node = (PNode) malloc(sizeof(PNode));
node->cn = cn;
node->en = en;
node->next = NULL;
PNode pp = link;
PNode p = link->next;
while (p != NULL) {
if (p->en > en) {
pp = pp->next;
p = p->next;
} else if (p->en < en) {
node->next = p;
pp->next = node;
return;
} else {
p->cn += cn;
return;
}
}
pp->next = node;
}

void release(PLink link) {
PNode p = link;
while (p->next != NULL) {
PNode pp = p;
p = p->next;
free(pp);
}
}

void print(PLink link) {
PNode p = link;
if (p->next != NULL) {
p = p->next;
printf("%d", p->cn);
if (p->cn != 0) {
printf(" %d", p->en);
} else {
printf(" 0");
}
}
while (p->next != NULL) {
p = p->next;
if (p->cn != 0) {
printf(" %d %d", p->cn, p->en);
}
}
printf("\n");
}

void plus(PLink link1, PLink link2) {
PNode p = link1;
while (p->next != NULL) {
p = p->next;
insert(link2, p->cn, p->en);
}
}

PLink mutiply(PLink link1, PLink link2) {
PLink link3 = init();
PNode p1 = link1->next;
while (p1 != NULL) {
PNode p2 = link2->next;
while (p2 != NULL) {
int c = p1->cn * p2->cn;
int e = p1->en + p2->en;
insert(link3, c, e);
p2 = p2->next;
}
p1 = p1->next;
}
return link3;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构