多项式相加运算



多项式相加运算,使用链表实现,代码仍需要改善,这里先初步做个记录

//实现多项式的表示及相加 by Denis
#include <stdio.h>
#include <malloc.h>
#define ture 1
#define false 0

typedef int ElemType;
typedef struct LNode{
	ElemType coef;		//系数
	int expn;           //指数
	struct LNode *next;
}polynomia;

polynomia *CreatPolyn(int nLength)  //m 表示多项式的项数
{
	int i;
	polynomia *Ln_Head,*Ln_tmp1,*Ln_tmp2;
	printf("Creat a polynomia that have %d term\nPlease input the coef and expn for every term\n",nLength);
	Ln_Head = (polynomia *)malloc(sizeof(polynomia));
	Ln_tmp1 = Ln_Head;   /*Save the Head pointor*/

	for(i=0;i<nLength;i++)
	{
		Ln_tmp2 = (polynomia *)malloc(sizeof(polynomia));
		scanf("%d %d",&(Ln_tmp2->coef), &(Ln_tmp2->expn));//Input the data

		//Insert the data to the end odf list
		Ln_tmp1->next = Ln_tmp2;
		Ln_tmp1 = Ln_tmp2;
		Ln_tmp2->next = NULL;

	}
	return Ln_Head;
}

//Insert a term to polynomia
int ListInsert(polynomia *Head, ElemType coef, int expn)
{
	polynomia *P, *Tail;
	P = Head->next;
	//Get the tail pointor of the list
	while(P->next)
	{
		P = P->next;
	}
	Tail = P;
	P = (polynomia *)malloc(sizeof(polynomia));
	P->coef = coef;
	P->expn = expn;
	Tail->next = P;
	P->next = NULL;
	//ListLength++;
	return 0;
}

//Get the how many term in the polynomia
int ListLength(polynomia *Head)
{
	int length=0;
	polynomia *P;
	P = Head->next;
	while(P)
	{
		length++;
		P = P->next;
	}

	return length;
}

//Get the number i data ,and return the pointor
//i must be >0,and <= List's length
polynomia *GetElem(polynomia *Head, int i)
{
	int j=0;
	polynomia *P, *tmp;
	P = Head->next;
	while(P && j!=i)
	{
		tmp = P;//Save the P
		P = P->next;
		j++;
	}
	return tmp;
}

polynomia *LocateElem(polynomia *Head, ElemType E)
{
	polynomia *P;
	P = Head->next;
	while(P)
	{
		if(P->expn== E)//E is in the list
			return P;
		else
			P = P->next;
	}
	return false;//E is not in the list
}

//Union the polynomia_1 and polynomia_2
polynomia *AddPolyn(polynomia *Head1, polynomia *Head2)
{

	int L1_len = ListLength(Head1);
	int L2_len = ListLength(Head2);//计算多项式的项数
	ElemType E1=Head1->next->expn;
	ElemType E2=Head2->next->expn;
	int i=1, j=1;
	polynomia *Tmp_1, *Tmp_2;

	Tmp_1 = Head1->next;
	Tmp_2 = Head2->next;

	printf("Union list_1 and list_2\n");
	for(i=1; i<=L2_len; i++)
	{
		Tmp_2 = GetElem(Head2,i);//获取L2中的第i个元素,并获取该元素地址,打算查看是否该元素在L1中出现
		if(!LocateElem(Head1,Tmp_2->expn))//如果元素不在L1中,则插入该元素
				ListInsert(Head1,Tmp_2->coef, Tmp_2->expn);
		else//否则,存在相同指数项的元素,元素系数相加
		{
			Tmp_1 = LocateElem(Head1,Tmp_2->expn);
			Tmp_1->coef = Tmp_2->coef + Tmp_1->coef;
			//if(Tmp_1->coef == 0)//系数为0的时候,略过该项
				//	Tmp_1 = Tmp_1->next;

		}

	}

	return Head1; 

}

void PrintPolyn(polynomia *Head)
{
	polynomia *P= Head->next;
	int i=0;
	printf("The polynomia is:\n F(X) = ");
	while(P)
	{
		if(P->coef == 0)//系数为0时,跳过该项
		{
			P=P->next;
		}

		if(i == 0)
		{
			//如果系数为 1或者-1,则不显示1
			if(P->coef == 1)
			{
				printf("X^%d", P->expn);
				i++;
			}
			if(P->coef == -1)
			{
				printf("-X^%d", P->expn);
				i++;
			}
			else
			{
				printf("%d*X^%d",P->coef, P->expn);
				i++;
			}
		}
		else
		{
			if(P->coef > 0 && P->coef!=1)
				printf(" + %d*X^%d",P->coef, P->expn);
			if(P->coef < 0 && P->coef!= -1)
				printf("%d*X^%d",P->coef, P->expn);
			//如果系数为 1或者-1,则不显示1
			if(P->coef == 1)
				printf("+X^%d", P->expn);
			if(P->coef == -1)
				printf("-X^%d", P->expn);
		}

		P = P->next;
	}
	printf("\n");

}

void main()
{
	polynomia *Polyn_1, *Polyn_2, *Polyn_3;
	Polyn_1 = CreatPolyn(2);
	PrintPolyn(Polyn_1);
	//ListInsert(Polyn_1,10,10);
//	PrintPolyn(Polyn_1);

	Polyn_2 = CreatPolyn(2);
	Polyn_3 = AddPolyn(Polyn_1, Polyn_2);
	PrintPolyn(Polyn_3);

	getch();

}
时间: 2024-10-14 07:41:46

多项式相加运算的相关文章

利用java List 实现多项式相加,相乘

package com.learn.algorithm.ploy; import java.util.LinkedList; import java.util.List; import java.util.Scanner; /** *多项式 相关 运算 */ public class Ploy { public static void main(String[] args) { List<Node> La = init(); List<Node> Lb = init(); Syst

多项式相加实验代码和报告

一.算法模块分析: 将整个项目可分为四部分: 1.将输入字符串链表分析到单链表 2.单链表化简 3.链表值运算 4.输出 二.模块分块实现: 1.将输入字符串链表分析到单链表 分析: 一元稀疏多项式,包含字符有数字(系数和指数) 系数中小数点,指数符号,变量字母(以x为例) 运算符(+和-,其中加减也可以表示正负数) 通过以上分析可以构建如下结构体以用于存储每个单项 并完成相应标志任务 struct Record{ double factor;//记录系数 - int power;//记录次方

bzoj 3323: [Scoi2013]多项式的运算.

3323: [Scoi2013]多项式的运算 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 412  Solved: 148[Submit][Status][Discuss] Description 某天,mzry1992 一边思考着一个项目问题一边在高速公路上骑着摩托车.一个光头踢了他一脚,摩托车损坏,而他也被送进校医院打吊针.现在该项目的截止日期将近,他不得不请你来帮助他完成这个项目.该项目的目的是维护一个动态的关于x 的无穷多项式F(x) =

双链表&amp;链表合并&amp;多项式相加算法

//单链表的合并 //链表合并 //两个链表必须是有序的 #define Maxsize 5 typedef  int elemtype; typedef struct linklist { elemtype data; struct linklist *next; }Linklist; //建立链表1 Linklist *CreateList1 () { int i,data ; Linklist *head, *p, *q; head=p=(Linklist  *)malloc(sizeof

多项式相加&mdash;&mdash;C++和racket

  多项式相加是一个简单到爆的算法练习,学习链表之后一般会波拉波拉讨论稀疏的.稠密的用什么来表示,最后一般都作为链表的练习题出现.其实用数组表示多项式显然是不合理的,大多数的多项式必然没有如此紧密,链表几乎是唯一的选择. 放在C++这样的语言中,直接构建一个poly结点类,然后构建一个poly类(包含一个头节点),基本就是一个单链表的实现,对于多项式的加法,和有序链表的连接比较像,乘法就更简单了,逐一乘过去就行了. 导致这个过程很简单的原因是类的封装(C 用结构体加一些函数对于这个简单的问题也基

SCOI2013 多项式的运算 (BZOJ 3323)

似乎仍然不能附传送门..权限题T_T... 3323: [Scoi2013]多项式的运算 Time Limit: 12 Sec  Memory Limit: 64 MB Description 某天,mzry1992 一边思考着一个项目问题一边在高速公路上骑着摩托车.一个光头踢了他一脚,摩托车损坏,而他也被送进校医院打吊针.现在该项目的截止日期将近,他不得不请你来帮助他完成这个项目.该项目的目的是维护一个动态的关于x 的无穷多项式F(x) = a0 * x^0 + a1 * x^1 + a2 *

多项式链表多项式相加

//多项式相加 LinkList* add2Link(LinkList*L1, LinkList*L2) { LinkList*p1, *p2; LinkList*head , *pre, *p; head = new LinkList; head->next = NULL; pre = head; p1 = L1->next; p2 = L2->next; while (p1&&p2) { if (p1->exp == p2->exp) { p = new

从多项式相加看线性结构

给出两个多项式: 大家都很清楚多项式相加,即为相同指数项对应相加.那我们如何使用程序来描述两个多项式相加呢?大家首先想到的是用数组描述,多项式的指数使用下标来表示,前面的系数为对应数组中的值.f1(x)表示如下: f2(x)表示如下: 其实只要写个for循环,相同下标的相加即可,非常简单.下面问题来了,如果面对的多项式是类似 这种形式的话,0项太多,上面的这种办法就会很冗余,白白浪费空间.因此需要采取另外的办法来描述.上面的方式问题出在我们使用数组下标用来描述指数,当指数很大的时,就会出现很多系

链表_多项式相加相乘

加法部分运行成功.乘法仍存在问题,找机会解决,欢迎大家指正. 还有一个问题,C语言函数传地址如何传,是否不需要我这样多次申请内存空间?欢迎交流. 代码如下: 1 #include<stdio.h> 2 #include<malloc.h> 3 4 typedef struct PolyNode *Poly;//定义多项式结构体类型 5 struct PolyNode{ 6 int coef; 7 int expon; 8 struct PolyNode *next; 9 }; 10