C++利用单链表实现一元多项式的加、乘操作

提示:一元多项式中的数据项含有两个数据分别是系数与指数,为了简单起见,系数与指数都为整数。

定义单链表的数据结构和结点的数据结构。


#include <iostream.h>

typedef struct
{
	int xi;//系数
	int zhi;//指数
}unit;

typedef struct LNode
{
	unit data; //结点的数据部分
	struct LNode *next;
} LinkList;

1.初始化单链表

//初始化链表
void InitList(LinkList *&L)
{
	L = new LinkList;
	L->next = NULL;
}

2.插入结点到有序单链表中

根据指数的大小,从大到小进行插入

void InsertList(LinkList *&L,unit e)
{
	LinkList *r,*s;//r是循环用的结点指针,s是插入的新结点
	r = L;
	//寻找新插入结点的位置
	while(r->next!=NULL && e.zhi < r->next->data.zhi)//以指数决定插入的位置
		r = r->next;
	if(r->next != NULL && e.zhi == r->next->data.zhi)//指数相等
		r->next->data.xi += e.xi;  //系数相加
	else
	{
		s = new LinkList;
		s->data.xi = e.xi;	s->data.zhi = e.zhi;
	//将e的值赋给s指针所指结点
		s->next = r->next;
		r->next = s;
	}
}

3.遍历单链表

一元多项式存在多种特殊情况

第一种特殊情况:系数为1,指数为0,只输出1。

第二种特殊情况:指数为1时,输出‘X’。

//遍历线性表
void DispList(LinkList *L)
{
	LinkList *p = L->next;
	int j = 0;
	while(p)
	{
		if(p->data.xi == 1 && p->data.zhi == 0)//系数为1,指数为0
		   cout<<"1";
		if(p->data.xi != 0 && p->data.xi != 1)
			cout<<p->data.xi;
		if(p->data.xi != 0)
		{
			if(p->data.zhi > 1)
				cout<<"X^"<<p->data.zhi;
			else if(p->data.zhi < 0)
				cout<<"X^("<<p->data.zhi<<')';
			else
				if(p->data.zhi == 1)
					cout<<'X';
		}
		if(p->next != NULL && p->next->data.xi > 0)
			cout<<'+';
		p = p->next;

	}
	cout<<endl;
}

4.两个多项式相加

在单链表L的基础上,进行相加。

//两个多项式相加
void AddList(LinkList *&L,LinkList *Lc)
{
	LinkList *b = Lc->next;
	while(b != NULL)
	{
		InsertList(L,b->data);//从Lc表中取出每一个节点插入到L中
		b = b->next;
	}
}

5.两个多项式相乘

单链表Lc的一个项的系数和指数需要乘以单链表Lb的所有项,将相乘得到的数据存入一个新表La,之后再由单链表Lc的下一个项进行操作。

void Cheng(LinkList *&La,LinkList *&Lb,LinkList *Lc)
{
	LinkList *b,*c = Lc->next;
	unit e;
	while(c != NULL)  //取Lc表中的每一个节点
	{
		b = Lb->next;  
		while(b != NULL)   //取Lb表中的每一个节点
		{
			e.xi = c->data.xi * b->data.xi;    //系数相乘
			e.zhi = c->data.zhi + b->data.zhi;   //指数相加,得到节点相乘的值 
			InsertList(La,e);  //再将该节点插入到La中
			b = b->next;
		}
		c = c->next;
	}
}

=================================================

主函数

因为要生成有两个多项式,所以外循环 while 代表多项式的个数。

void main()
{
	LinkList *La,*Lb,*L;
	InitList(La);InitList(Lb);InitList(L);
	int i,j = 0;
	unit k;
	while(j++ < 2)
	{
		i = 0;
		do
		{		
			cout<<"请输入第"<<j<<"个多项式第"<<++i<<"项的系数(按0退出):";
			cin>>k.xi;
			cout<<"请输入第"<<j<<"个多项式第"<<i<<"项的指数:";
			cin>>k.zhi;
			cout<<endl;
			if(j == 1)
				if(k.xi != 0)
					InsertList(La,k);
			if(j == 2)
				if(k.xi != 0)
					InsertList(Lb,k);
		}while(k.xi != 0);
	}
	cout<<"第一个一元多项式为:F(X)=";DispList(La);
	cout<<"第二个一元多项式为:G(X)=";DispList(Lb);
	cout<<"多项式相乘为:";
	Cheng(L,La,Lb);
	DispList(L);
	cout<<"多项式相加为:";
	AddList(La,Lb);
	DispList(La);
}

猜你喜欢

转载自blog.csdn.net/henry594xiaoli/article/details/124389606
今日推荐