线性结构2 一元多项式的乘法与加法运算

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include <iostream>
using namespace std;
typedef struct Node List;
struct Node
{
	int m;
	int n;
	List * next;
};

List *CreatList();				//创建链表
List *FunSum(List*p, List*q);	//求和函数
List *FunMult(List*p, List*q);	//求乘积函数
void traverse(List *p);			//遍历链表

int main()
{
	List *L1, *L2;
	List *sum, *mult;

	L1 = CreatList();
	L2 = CreatList();
	mult = FunMult(L1, L2);
	traverse(mult);
	printf("\n");
	sum = FunSum(L1, L2);
	traverse(sum);
	system("pause");
	return 0;
}

List * CreatList()
{
	List *p;
	p = (List*)malloc(sizeof(struct  Node));
	List *t2=p,*t1;
	int len;
	cin >> len;
	for (int i = 0; i < len;i++)
	{
		t1 = (List *)malloc(sizeof(struct Node));
		cin >> t1->m;
		cin >> t1->n;
		t2->next = t1;
		t2 = t2->next;
	}
	t2->next = nullptr;
	return p;
}

List * FunSum(List * p, List * q)
{
	List *head = (List *)malloc(sizeof(List));//新链表
	List *temp1 = p->next;//指向当前处理的节点
	List *temp2 = q->next;
	List *temp, *temp3 = head;
	List *temp4 = head;		//比temp3慢一步的指针
	while (NULL != temp1 && NULL != temp2)
	{
		temp = (List *)malloc(sizeof(List));//新节点
		temp3->next = temp;
		temp3 = temp3->next;//待插入结点位置
		if (temp1->n > temp2->n)
		{
			temp->m = temp1->m;
			temp->n = temp1->n;
			temp1 = temp1->next;
		}
		else if (temp1->n == temp2->n)
		{
			temp->n = temp2->n;
			temp->m = temp2->m + temp1->m;
			if (0 == temp->m)		//如果系数为0,那么这一项不存在
			{
				temp3 = temp4;		//temp3返回到上一个节点
				free(temp);			//释放这个新节点,否则内存泄漏
			}
			temp2 = temp2->next;
			temp1 = temp1->next;
		}
		else if (temp1->n < temp2->n)
		{
			temp->m = temp2->m;
			temp->n = temp2->n;
			temp2 = temp2->next;
		}
		temp4 = temp4->next;
	}
	if (NULL == temp1)
	{
		while (NULL != temp2)
		{
			temp = (List *)malloc(sizeof(List));
			temp3->next = temp;
			temp3 = temp3->next;
			temp->m = temp2->m;
			temp->n = temp2->n;
			temp2 = temp2->next;
		}
		temp3->next = NULL;
	}
	else
	{
		while (NULL != temp1)
		{
			temp = (List *)malloc(sizeof(List));
			temp3->next = temp;
			temp3 = temp3->next;
			temp->m = temp1->m;
			temp->n = temp1->n;
			temp1 = temp1->next;
		}
		temp3->next = NULL;
	}

	return head;
}

List * FunMult(List * p, List * q)
{
	List *head = (List *)malloc(sizeof(List));
	List *temp1, *temp2;
	temp1 = p->next;
	temp2 = q->next;
	if (NULL == temp1 || NULL == temp2)		//如果其中一个多项式是0,那么乘积是0
	{
		head->next = NULL;
		return head;
	}
	List *temp3, *temp4;
	temp3 = temp4 = head;
	List * temp = NULL;

	while (NULL != temp1)		//用q的第一个元素乘以p的每一个元素,生成的第一轮的表
	{
		temp = (List *)malloc(sizeof(List));
		temp->m = temp1->m * temp2->m;
		temp->n = temp1->n + temp2->n;
		temp3->next = temp;
		temp3 = temp3->next;
		temp1 = temp1->next;
	}
	temp3->next = NULL;
	temp2 = q->next->next;
	while (NULL != temp2)	//在第一轮的表的基础上进行乘积插入
	{
		temp1 = p->next;
		while (NULL != temp1)
		{
			temp4 = head;
			temp3 = head->next;
			temp = (List *)malloc(sizeof(List));
			temp->m = temp2->m * temp1->m;
			temp->n = temp2->n + temp1->n;
			while (NULL != temp3)
			{
				//直到temp->n >= temp3->n时才插入
				if (temp->n > temp3->n)
				{
					temp->next = temp3;
					temp4->next = temp;
					break;
				}
				else if (temp->n == temp3->n)
				{
					temp3->m += temp->m;
					if (0 == temp3->m)	//如果系数为0,那么删除这一项
					{
						temp4->next = temp3->next;	//将链表接起来
						free(temp3);	//释放掉
					}
					free(temp);			//释放掉
					break;
				}
				temp4 = temp4->next;
				temp3 = temp3->next;
			}
			if (NULL == temp3)
			{
				temp4->next = temp;
				temp->next = NULL;
			}
			temp1 = temp1->next;
		}
		temp2 = temp2->next;
	}

	return head;
}

void traverse(List * p)
{
	List *temp = p->next;
	if (NULL == temp)
	{
		printf("0 0");
		return;
	}
	else
	{
		printf("%d %d", temp->m, temp->n);
		temp = temp->next;
	}
	while (NULL != temp)
	{
		printf(" %d %d", temp->m, temp->n);
		temp = temp->next;
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值