一元多项式的表示及相加(链表)

一元多项式的表示及相加(链表)

类型定义

#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;
}
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值