c语言实现多项式加减法(两种方法)

多项式的每一项用一个结构体存储    在这里主要介绍两种方法实现加减法  (有什么建议想法 评论哦)

 第一种方法是将f2多项式中的每一项分别和f1中的每一项比对      如果f1中有和f2当前一项指数相同的项    将系数相加    如果没有    将这一项插入到f1的最前面     继续判断f2的下一项

void addPolyn(Test *f1,Test *f2) {        //f1 f2为两个多项式链表  含头结点
	head = f1;p = f1->next; q = f2->next;
	while (q!=NULL) {
		p = f1->next;		//每次都将指针指向A的第一项
		int flag = 0;		//B多项式每后移一项都赋flag为0
		while (p!=NULL){
			if (p->expn==q->expn) {
				flag = 1;		//做为后面是插入还是系数相加的判断条件
				s = p;		//多项式A里面要是有与当前多项是B中的一个指数相同的话  用s保存下来
			}
			p = p->next;
		}
		if (flag == 1) {		//如果A中存在与B中当前一项系数相同的项
			s->coef = s->coef + q->coef;		//将相同系数的项指数相加
		}
		else {		//如果不存在
			r = (Test *)malloc(length);		//将当前项复制到一块新的结构体中
			r->coef = q->coef;
			r->expn = q->expn;

			r->next = head->next;		//将B当前项插入A中
			head->next = r;
		}
		q = q->next;		//进行B的下一项的判断	
	}

	ListSort(f1);//输入随机  有序无序都可以
}

第二种方法是先将两个多项式合并      然后排序    将指数相同的项的系数相加至它的前一项    然后跳过该节点    (本来想将无序链表直接实现删除多余项   但是出了点bug   暂时不好解决^-^)

void addPolyn1(Test *f1, Test *f2) {
	head = mergeList(f1, f2);		//连接链表
	ListSort(head);		//从小到大排序
	p = head->next;		//从头结点后的项开始
	q = p;
	while (p->next!=NULL) {
		q = p;		//每一次都是两个挨着的项进行判断
		if (p->expn==q->next->expn) {		//如果该项和后一项指数值相等
			p->coef = p->coef + q->next->coef;		//系数相加

			r = q->next;		//用一个指针指向后面的一项 
			p->next = r->next;		//跨过后面的一项
		}
		else {
			p = p->next;	//如果该项和后面一项指数不相等  将指针后移一位  继续判断
		}
	}
}

减法和加法的思路一样    先将后一个链表的系数全变为负的   在进行相加 

void subPolyn(Test *f1,Test *f2) {
	p = f1->next; q = f2->next;
	while (q!= NULL) {		//将B中的每一项的系数变为负的
		q->coef=-q->coef;
		q = q->next;
	}
	addPolyn(f1, f2);		//再进行相加
}

void subPolyn1(Test *f1,Test *f2) {
	p = f1->next; q = f2->next;
	while (q != NULL) {		//将B中的每一项的系数变为负的
		q->coef = -q->coef;
		q = q->next;
	}

	addPolyn1(f1, f2);
}

 最后附上整段代码

// 稀疏多项式加减.cpp: 定义控制台应用程序的入口点。

#include "stdafx.h"
#include<stdlib.h>
#define length sizeof(struct node)

typedef struct node
{
	float coef;		//系数
	int expn;	//指数
	struct node *next;
} Test;

Test *head, *p, *q, *r,*s;//定义遍历指针

					   //带有头结点的链表
Test *Create()//这是一个具有头结点的链表
{
	int List_Size;
	head = (Test *)malloc(length);	//首先创建一个头结点
	p = head;	//用遍历指针先指向头结点
	p->next = (Test *)malloc(length);
	p = p->next;
	printf("请输入多项式的长度:");
	scanf("%d", &List_Size);

	if (List_Size>0)
	{
		for (int i = 1; i<List_Size; i++)
		{
			p->next = (Test *)malloc(length);
			p = p->next;
		}
		p->next = NULL;
		return head;
	}
	else
	{
		printf("链表的长度必须大于0\n");
	}
	return head;
}

void InitList(Test *List_Head)//初始化链表
{
	if (List_Head->next != NULL)
	{
		p = List_Head->next;
		while (p != NULL)
		{
			printf("请输入系数,指数:");
			scanf("%f,%d", &p->coef,&p->expn);		
			p = p->next;
		}
	}
	else
	{
		printf("链表为空,无法初始化\n");
	}
}

int ListLength(Test *List_Head)
{
	int List_Length = 0;
	if (List_Head->next != NULL)
	{
		p = List_Head->next;
		while (p != NULL)
		{
			if (p->coef != 0) {
				List_Length++;
			}		//系数不等于0   长度+1
			p = p->next;
		}
	}
	else
	{
		printf("链表为空,长度为0");
	}
	return List_Length;
}

void ListSort(Test *List_Head)//排序  由小到大  
{
	if (List_Head->next != NULL)
	{
		q = p = List_Head->next;//指向头结点后的第一个结点
		int temp; float temp1;
		while (q->next != NULL)
		{
			while (p->next != NULL)
			{
				p = p->next;
				if (q->expn > p->expn)
				{
					temp = q->expn;
					q->expn = p->expn;
					p->expn = temp;		//交换系数

					temp1 = q->coef;
					q->coef = p->coef;
					p->coef = temp1;		//交换指数
				}
			}//循环一次  最小的被交换到前面
			q = q->next;//指针向后推一个   继续排后面的
			p = q;
		}
	}
	else
	{
		printf("链表为空,无法排序");
	}
}
void Display(Test *List_Head)
{
	if (List_Head->next != NULL)
	{

		int List_Length;
		List_Length = ListLength(List_Head);//得到多项式的长度

		printf("F=");
		p = List_Head->next;
		
		
		while (p != NULL)
		{
			if (List_Length == 0) {		//如果多项式长度为零  输出0  跳出循环
				printf("0");
				break;
			}
			if (p->coef == 0) {
				p = p->next;
				continue;
			}		//如果系数为0不输出  跳到下一个
			if (p->coef<0) {
				printf("(%2.2fX^%d)", p->coef, p->expn);
			}
			else {
				printf("%2.2fX^%d", p->coef, p->expn);
			}
			if (p->next != NULL) {
				printf("+");
			}		//是最后一个的话就不输出+
			p = p->next;
		}
		printf("\n");
	}
	else
	{
		printf("链表为空,无法展示\n");
	}

	printf("\n");
}

Test *mergeList(Test *f1, Test *f2) {
	p = f1->next; q = f2->next;
	while (p->next!= NULL) {
		p = p->next;
	}
	p->next = q;
	head = f1;
	return head;
}

void addPolyn(Test *f1,Test *f2) {
	head = f1;p = f1->next; q = f2->next;
	while (q!=NULL) {
		p = f1->next;		//每次都将指针指向A的第一项
		int flag = 0;		//B多项式每后移一项都赋flag为0
		while (p!=NULL){
			if (p->expn==q->expn) {
				flag = 1;		//做为后面是插入还是系数相加的判断条件
				s = p;		//多项式A里面要是有与当前多项是B中的一个指数相同的话  用s保存下来
			}
			p = p->next;
		}
		if (flag == 1) {		//如果A中存在与B中当前一项系数相同的项
			s->coef = s->coef + q->coef;		//将相同系数的项指数相加
		}
		else {		//如果不存在
			r = (Test *)malloc(length);		//将当前项复制到一块新的结构体中
			r->coef = q->coef;
			r->expn = q->expn;

			r->next = head->next;		//将B当前项插入A中
			head->next = r;
		}
		q = q->next;		//进行B的下一项的判断	
	}

	ListSort(f1);//输入随机  有序无序都可以
}

void addPolyn1(Test *f1, Test *f2) {
	head = mergeList(f1, f2);		//连接链表
	ListSort(head);		//从小到大排序
	p = head->next;		//从头结点后的项开始
	q = p;
	while (p->next!=NULL) {
		q = p;		//每一次都是两个挨着的项进行判断
		if (p->expn==q->next->expn) {		//如果该项和后一项指数值相等
			p->coef = p->coef + q->next->coef;		//系数相加

			r = q->next;		//用一个指针指向后面的一项 
			p->next = r->next;		//跨过后面的一项
		}
		else {
			p = p->next;	//如果该项和后面一项指数不相等  将指针后移一位  继续判断
		}
	}
}

void subPolyn(Test *f1,Test *f2) {
	p = f1->next; q = f2->next;
	while (q!= NULL) {		//将B中的每一项的系数变为负的
		q->coef=-q->coef;
		q = q->next;
	}
	addPolyn(f1, f2);		//再进行相加
}

void subPolyn1(Test *f1,Test *f2) {
	p = f1->next; q = f2->next;
	while (q != NULL) {		//将B中的每一项的系数变为负的
		q->coef = -q->coef;
		q = q->next;
	}

	addPolyn1(f1, f2);
}

int main()
{
	Test *List_A, *List_B;
	List_A = Create();
	InitList(List_A);
	Display(List_A);
	
	List_B = Create();
	InitList(List_B);
	Display(List_B);
	
	addPolyn(List_A,List_B);
	//addPolyn1(List_A, List_B);
	//subPolyn(List_A, List_B);
	//subPolyn1(List_A, List_B);
	Display(List_A);
}

 

 

  • 12
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值