线性表实现之多项式

多项式ADT:

设一元整系数多项式:

每一项多项式的形式是coef*x^exp,coef为该项的系数,exp是变元x的指数。
我们将一个多项式看成是一个线性表,线性表的元素就是多项式的项,下面采用一种带表头的单循环链表表示多项式。
多项式的项是系数coef和指数exp的偶对,这样多项式的项可表示为Term=<coef,exp>

typedef struct term
{
	int Cofe,Exp;
}Term;

typedef Term T;

typedef struct node
{
	T Element;
	struct node* Link;
}Node;
//现在每个结点有三部分信息:Coef,Exp,Link。约定降幂排列,表头的Exp=-1.
//多项式数据类型Ploynomial定义为:
typedef struct polynomial
{
	Node* First;
}Polynomial;

建立空多项式并初始化:

void CreatePolynomial(Polynomial* list)
{
	T x;
	x.Coef = 0;
	x.Exp = -1;
	list->First = NewNode2(x);
	list->First->Link = list->First;//结点指向自身
}

多项式的项的输入和输出函数:

T* InputElement()
{
	static T a;
	printf("\nEnter a term(Coef,Exp)\n");
	scanf("%d %d",&a.Coef,&a.Exp);
	return &a;
}

void PrintElement(T x)
{
	if(x.Coef != 0)
	{
		printf("%d",x.Coef);
		switch(x.Exp)
		{
			case 0:break;
			case 1:printf("X");break;
			default:printf("X^%d",x.Exp);break;
		}
	}
}

增加项函数

void AddTerms(Polynomial* list)
{
	char c;
	Node* p,*q=list->First;
	printf("\nAdd a term into a polynomial.\n");
	printf("\nAnother term?y/n");
	while((c = getchar()) == '\n');
	while(tolower(c)!='n')
	{
		p = NewNode1();
		p->Link = q->Link;
		q->Link = p;
		q = p;//临时指针指向下一个结点,为循环创造条件。
		printf("Another term?y/n");
		while((c=getchar())=='\n');
	}
}

打印多项式:

void PrintPolynomial(Polynomial list)
{
	BOOL IsFirst = TRUE;
	Node* p = list->First->Link;//因为第一个结点为空表头,因此指向第二个结点
	printf("\nThe Ploynomial is: \n");
	for(;p!=list.First;p = p->Link)
	{
		if(!IsFirst && p->Element.Coef>0)//如果不是表头并且系数不为0要手动输出加号
			printf("+");//输出“+”
		IsFirst = FALSE;//防止开头输出+号
		PrintElement(p->Element);
	}
	printf("\n");
}

多项式相加

多项式q(x) = q(x)+p(x),设指针p,q分别指向多项式p(x)和q(x)当前正在比较的项,指针P1指向*q的前驱结点。
若此时指针q指向的项正在与p指向的项比较。若p指向的项的幂数大于q指向的项的幂数,则复制此时p指向的项插入在q1指针之后。q1移到新项,q不动,p后移一项。
若p指向的项的幂数等于q指向的项的幂数,则将两项系数相加,将合并的项插入在P1后一项,p1后移当新项,q,p均向后移动一项。
若p指向的项的幂数小于q指向的项的幂数,则将q指向的当前想保存在结果项q(x),q,q1向后移一项,p不动。
则具体描述如下:

int exp_comp(T x,T y)//该函数比较两个项的指数的大小
{
	if(x.Exp == y.Exp)
		return 0;
	else if(x.Exp > y.Exp)
		return 1;
	else
		return -1;
}

void PopAdd(Polynomial A,Polynomial* B)//相加多项式A和B
{
	Node* q,*q1,*p,T x;
	p = A.First->Link;q = B.First->Link;
	q1 = q->Link;
	while(p->Element.Exp >= 0)//如果幂数小于0的话,则表示处理结束,因为为循环列表,表头幂数为-1
	{
		switch(exp_comp(p>Element,q->Element))//比较对应项幂数
		{
			case -1:
				q1 = q;q = q->Link;break;
			case 0;
				q->Element.Coef = q->Element.Coef + p->Element.Coef;
				if(q->Element.Coef == 0)//若相加后两项抵消
				{
					q2 = q; //将临时结点指针指向q,为下面的删除作准备
					q1 = q->Link;//q1指向q的后一项。即删除结点q之后,q1向后移一项
					q = q->Link;//q向后移一项
					free(q2);//删除结点
					p = p->Link;
				}
				else
				{
					q1 = q; //直接向后移指针,因为前面已经改变了q多项式项的系数
					q = q->Link;
					p = p->Link;
				}
				break;
			case 1:
				x.Coef = p->Element.Coef;//复制数据
				x.Exp = P->Element.Exp;
				q2 = NewNode2(x);//新建结点
				q2->Link = q;//新结点插在p1后面
				q1->Link = q2;//q1向后移一项
				q1 = q2;
		}
	}
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<iostream> using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef struct { float coef; int expn; } term,ElemType; typedef struct polynomail { ElemType term; struct polynomail *next; }polynomail, *linklist; Status locatelem(linklist l,ElemType e,linklist &q) { linklist p,m; p=l->next; if(!p) { q=l; return FALSE; } if((p->term).expn>e.expn) {q=l;return FALSE;} else if(p->next) { while(p->next) { m=p->next; if((p->term).expn>e.expn) { q=l; return FALSE; } else if((m->term).expn>e.expn) { q=p;return FALSE;} else p=m; } q=p;return FALSE; } else{ q=p;return FALSE;} } void makenode(linklist &s,ElemType e) { s=(linklist)malloc(sizeof(polynomail)); s->term=e; } void creatpolyn(linklist &p,int m) { linklist h,q,s; ElemType e; p=(linklist)malloc(sizeof(polynomail)); p->next=NULL; for(int i=0;i<m;i++) { printf("输入一元多项式的系数\n"); scanf("%f",&e.coef); printf("输入一元多项式的指数\n"); scanf("%d",&e.expn); if(!locatelem(p,e,q)) { makenode(s,e); s->next=q->next; q->next=s; } } } void destroypolyn(linklist &p) { linklist q; while(p) { q=p->next; free(p); p=q; } } void printpolyn(linklist p) { linklist q; q=p->next; while(q) { printf("+%fX^",((q->term).coef)); printf("%d",((q->term).expn)); q=q->next; } printf("\n"); } int polynlength(linklist p) { linklist q; q=p->next; int i=0; while(q) { i++; q=q->next; } return i; } void add(linklist &pa;,linklist pb) { float sum; linklist qa,qb,qc; qa=pa->next; qb=pb->next; qc=pa; while(qa&&qb;) { if(qa->term.expn>qb->term.expn) { qc->next=qb;qc=qb;qb=qb->next; } else if(qa->term.expn<qb->term.expn) { qc->next=qa;qc=qa;qa=qa->next; } else { sum=qa->term.coef+qb->term.coef; if(sum) { qa->term.coef=sum; qc->next=qa;qc=qa; qa=qa->next; qb=qb->next; } else { qa=qa->next; qb=qb->next; } } } qc->next=qa?qa:qb; free(pb); } void sub(linklist pa,linklist pb) { float sum; linklist qa,qb,qc; qa=pa->next; qb=pb->next; qc=pa; while(qa&&qb;) { if(qa->term.expn>qb->term.expn) { qc->next=qb;qc=qb;qb=qb->next; } else if(qa->term.expn<qb->term.expn) { qc->next=qa;qc=qa;qa=qa->next; } else { sum=qa->term.coef-qb->term.coef; if(sum) { qa->term.coef=sum; qc->next=qa;qc=qa; qa=qa->next; qb=qb->next; } else { qa=qa->next; qb=qb->next; } } } qc->next=qa?qa:qb; free(pb); } void mul(linklist pa,linklist pb,linklist &ps;) { linklist qa,qb,pc,qc,qd,qf; qa=pa->next; qf=qb=pb->next; ps=(linklist)malloc(sizeof(polynomail));ps->next=NULL; pc=(linklist)malloc(sizeof(polynomail));pc->next=NULL;qc=pc; for(qa;qa!=NULL;qa=qa->next) { pc=(linklist)malloc(sizeof(polynomail));pc->next=NULL;qc=pc; qb=qf; for(qb;qb!=NULL;qb=qb->next) { qd=(linklist)malloc(sizeof(polynomail)); qd->next=NULL; qd->term.coef=qb->term.coef*qa->term.coef; qd->term.expn=qb->term.expn+qa->term.expn; qc->next=qd;qc=qc->next; } add(ps,pc); } } void main() { int n; linklist a,b,c,d,f,g,h,i,j,k,o,z; int m,l; printf("输入多项式的个数 "); scanf("%d",&m); creatpolyn( a,m); d=a; printf("得到多项式\n"); printpolyn(d); printf("输入多项式的个数 "); scanf("%d",&l); creatpolyn( b,l); f=b; printf("得到多项式\n"); printpolyn(d); printf("两项式的和\n"); g=a;h=b; add(g,h); printpolyn(g); printf("两项式的差\n"); i=a;j=b; sub(i,j); printpolyn(i); printf("两项式的积\n"); k=a;o=b; mul(k,o,z); printpolyn(z); scanf("%d",&n); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值