一元多项式的表示及相加(链表)
类型定义
#include<bits/stdc++>
using namespace std;
#include <cstdlib>//malloc函数需要这个头文件
一元多项式的存储结构
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;
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链表不为空时,输出
printf("%d %d\n",p->xi,p->zhi);
p = p->next; //指向下一个结点
}
}
完整代码实现
#include<bits/stdc++>
using namespace std;
#include <cstdlib>//malloc函数需要这个头文件
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;
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链表不为空时,输出
printf("%d %d\n",p->xi,p->zhi);
p = p->next; //指向下一个结点
}
}
int main() {
int n, x, y;
while (scanf("%d",&n)) { //输入第一多项式项数
LinkList *A = InitList(); //创建A链表头结点
while (n--) {
scanf("%d%d",&x,&y);//输入系数和指数
InsertList(A, x, y); //调用插入函数
}
scanf("%d",&n);//输入第二多项式项数
LinkList *B = InitList(); //创建B链表头结点
while (n--) {
scanf("%d%d",&x,&y);
InsertList(B, x, y);
}
LinkList *C = UnionList(A, B); //将AB两个链表合并成,链表C
ListPrint(C);//输出相加后的系数和项数
}
return 0;
}