本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Description
通过有序对输入多项式的各个项,利用单链表存储该一元多项式,并建立的2个存储一元多项式的单链表,然后完成2个一元多项式的相加,并输出相加后的多项式。
要求: 一个主函数和三个子函数,包括:
(1) 多项式输入函数——链表建立函数
(2) 多项式相加函数——链表的合并
(3) 多项式输出函数——链表的输出
Input
输入数据有多组,对于每组测试数据,第一行一个整数n,表示第一个多项式La的项数;接下来n行,每行表示多项式的一项,包含两个元素,表示系数和指数;接下来一个整数m,表示第二个多项式Lb的项数;接下来m行,每行表示多项式的一项,包含两个元素,表示系数和指数;两个多项式的输入都是按指数从小到大。(n,m<=1000)
Output
La与Lb相加之后的多项式。 按指数从小到大输出,每行一项,用空格把系数和指数分开。
Sample Input
3
1 2
2 3
3 4
3
4 3
2 5
4 6
Sample Output
1 2
6 3
3 4
2 5
4 6
代码区:
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstdlib>//malloc函数需要这个头文件
using namespace std;
typedef struct LinkList//重命名结构体(方便一点)
{
int xi;//系数
int zhi;//指数
LinkList * next;//指向下一个结点
}LinkList;
LinkList* InitList()//创建链表 返回值为结构体指针
{
LinkList *q=(LinkList *)malloc(sizeof(LinkList));//创建头结点
q->next=NULL;//初始化头结点,将其next指向NULL
return q;//返回已创建的头结点
}
void InsertList(LinkList *L,int x,int y)//插入函数
{
LinkList *p=L; //将P等于L,以免以下操作将头结点改变
while(p->next)
p=p->next; //将链表一直推到最后一个结点
LinkList *q=(LinkList *)malloc(sizeof(LinkList)); //创建一个新结点
q->next=NULL;//惯例嘻嘻,将next指针设定为NULL
q->xi=x;//将系数存入结点
q->zhi=y;//将指数存入结点
p->next=q;//使p(也就是链表的最后一个结点)指向新创建的结点,实现插入新结点
}
LinkList* UnionList(LinkList *A,LinkList *B)
//实现函数将两个链表按指数从小到大合并起来(传入值为两个链表的头结点)
{
LinkList *p1=A->next;//定义一个p1等于A链表的第一个结点
LinkList *p2=B->next;//定义一个p2等于B链表的第一个结点
LinkList *head=InitList();//创建一个头结点为head
LinkList *p3=head;//p3等于新链表的头结点
while(p1&&p2)//当两个链表的值都还有时(都不为空)
{
if(p1->zhi<p2->zhi)//当p1指数小于p2时,需要排在前面
{
p3->next=p1;//即将p3的下一个指向p1
p3=p3->next;//p3指向下一个结点
p1=p1->next;//p1的值已经存入p3,所以将p1等于p1的下一个结点
}
else if(p1->zhi>p2->zhi) //当p2的指数小于p1的时,p2排在前面
{
p3->next=p2;//同上
p3=p3->next;
p2=p2->next;
}
else//当指数相等时
{
if(p1->xi+p2->xi==0)//如果两个系数相加为零,则该结点不进去p3链表
{
p1=p1->next;
p2=p2->next;
//两个结点各自向后一个结点
}
else//当系数不相等时
{
p1->xi+=p2->xi;//将p1和p2的系数相加存放至p1结点中
p3->next=p1;//将相加后的p1结点链至p3链表之后
p3=p3->next;//现有结点已经装了所以将p3向后一个结点
p1=p1->next;
p2=p2->next;
//p1,p2两个结点各自向后一个结点
}
}
}
if(p1) p3->next=p1;//如果p1,p2其中一个为空时,找出不为空的那个链表链入p3链表中
else p3->next=p2;
return head;//返回p3的头结点
}
void ListPrint(LinkList *L)//打印输出结点信息
{
LinkList *p=L->next;//p为头结点L的下一个结点
while(p)//当p链表不为空时,输出
{
cout << p->xi << ' ' << p->zhi << endl;
p=p->next;//指向下一个结点
}
}
int main()
{
int n,x,y;
while(cin >> n)//输入第一多项式项数
{
LinkList *A=InitList();//创建A链表头结点
while(n--)
{
cin >> x >> y;//输入系数和指数
InsertList(A,x,y);//调用插入函数
}
cin >> n;//输入第二多项式项数
LinkList *B=InitList();//创建B链表头结点
while(n--)
{
cin >> x >> y;
InsertList(B,x,y);
}
LinkList *C=UnionList(A,B);//将AB两个链表合并成,链表C
ListPrint(C);//输出相加后的系数和项数
}
return 0;
}
新手上路,有错请指正