7-2 一元多项式的乘法与加法运算 (20分)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例:
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
5 20 -4 4 -5 2 9 1 -2 0
#include<iostream>
using namespace std;
typedef struct Item
{
int _x;//头结点表示接点数
int _a;
Item *next;
};
void Cteate_poy(Item & item1);
void Delet_poy(Item *item);
void Print(Item* item);
Item* Add_Item(Item *item1, Item *item2)
{
Item *head, *h, *start1 = item1->next, *start2 = item2->next, *temp;
head = new Item;
head->next = NULL;
h = head;
while(start1 != NULL && start2 != NULL)
{
if(start1->_a == start2->_a)
{
if(start1->_x + start2->_x != 0)
{
temp = new Item;
temp->_a = start1->_a;
temp->_x = start1->_x + start2->_x;
temp->next = NULL;
head->next = temp;
head = temp;
}
start1 = start1->next;
start2 = start2->next;
}
else if(start1->_a > start2->_a)
{
head->next = new Item;
head->next->_a = start1->_a;
head->next->_x = start1->_x;
head->next->next = NULL;
head = head->next;
start1 = start1->next;
}
else
{
head->next = new Item;
head->next->_a = start2->_a;
head->next->_x = start2->_x;
head->next->next = NULL;
head = head->next;
start2 = start2->next;
}
}
if(start1 != NULL)
{
while(start1 != NULL)
{
head->next = new Item;
head->next->_a = start1->_a;
head->next->_x = start1->_x;
head->next->next = NULL;
head = head->next;
start1 = start1->next;
}
}
else
{
while(start2 != NULL)
{
head->next = new Item;
head->next->_a = start2->_a;
head->next->_x = start2->_x;
head->next->next = NULL;
head = head->next;
start2 = start2->next;
}
}
return h;
}
Item* take_Item(Item *item1, Item *item2)
{
Item *data = new Item;//总的多项式
Item *item = new Item, *iter_ = item;//中间的多项式
Item *temp = item2->next; //每个乘的数
data->next = NULL;
iter_->next = NULL;
while(temp != NULL)
{
Item *iter1 = item1->next;
Item *iter;
iter_ = item;
while(iter1 != NULL)
{
if(iter1->_x * temp->_x != 0)
{
iter = new Item;
iter->_a = iter1->_a + temp->_a;
iter->_x = iter1->_x * temp->_x;
iter->next = NULL;
iter_->next = iter;
iter_ = iter;
}
iter1 = iter1->next;
}
iter = data;
data = Add_Item(data, item);
Delet_poy(item);
Delet_poy(iter);
temp = temp->next;
}
return data;
}
int main()
{
int n, x, y;
Item item1, item2, *head;
item1.next = NULL;
item2.next = NULL;
Cteate_poy(item1);
Cteate_poy(item2);
head = take_Item(&item1, &item2);
Print(head);
head = Add_Item(&item1, &item2);
Print(head);
}
void Cteate_poy(Item & item1)
{
Item *p, *head = &item1;
int x, y, n;
item1._x = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d %d", &x, &y);
p = new Item;
p->_a = y;
p->_x = x;
p->next = NULL;
head->next = p;
head = p;
item1._x++;
}
}
void Delet_poy(Item *item)
{
Item *head, *tail = item;
item = item->next;
while(item != NULL)
{
head = item->next;
delete item;
item = head;
}
tail->next = NULL;
}
void Print(Item* item)
{
int flag = 0;
if(item->next == NULL)
{
printf("0 0\n");
return;
}
while(item->next != NULL)
{
if(flag)
printf(" %d %d", item->next->_x, item->next->_a);
else
printf("%d %d", item->next->_x, item->next->_a);
item = item->next;
flag++;
}
cout << endl;
}
复习数据结构,遇到了这个题,调代码调了一下午,凉了呀,希望后天的数据结构别凉