【c++版数据结构】之用带头节点的单链表实现一元多项式(C语言版)

所实现的一元多项式的结构如下图所示:



若只对多项式进行“求值”等不改变多项式系数和指数的运算,采用类似顺序表的顺序存储结构即可,否则应采用链式存储结构,本文因为要进行一元多项式的加法,加法,乘法,故采用的是链式存储结构

注意:本程序输入表达式时,需要按照(x的次幂)升序输入

Polynomail.h

#include<stdio.h>
#include<assert.h>
struct Node
{
	int coef; //系数
	int expn; //指数
};
//节点结构
typedef struct PolynNode
{
	Node data;
	struct PolynNode *link;
}PolynNode;

typedef PolynNode* Polynmail;

void InitPolyn (Polynmail &head);
void CreatPolyn(Polynmail &head, int n);
void push_back (Polynmail &head, PolynNode *s);
void ShowPolyn (Polynmail head);

void AddPolyn(Polynmail &head, Polynmail pa, Polynmail pb);
void SubPolyn(Polynmail &head, Polynmail pa, Polynmail pb);
void MulPolyn(Polynmail &head, Polynmail pa, Polynmail pb);

int lenth(Polynmail head);
void destory(Polynmail &head);

Polynomail.cpp

#include"Polynomail.h"

void InitPolyn(Polynmail &head)
{
	PolynNode *s = new PolynNode;
	assert(s != NULL);
	s->data.coef = 0;
	s->data.expn = -1;
	s->link = NULL;
	head = s;
}

void push_back(Polynmail &head, PolynNode *s)
{
	PolynNode *p = head;
	while (p->link != NULL)
	{
		p = p->link;
	}
	p->link = s;
	
}
//创建一元多项式
void CreatPolyn(Polynmail &head, int n)
{
	int c;
	int e;
	for (int i = 0; i < n; ++i)
	{
		printf("请输入第%d项的系数和指数 >", i + 1);
		scanf_s("%d%d", &c, &e);
		PolynNode *s = new PolynNode;
		s->data.coef = c;
		s->data.expn = e;
		s->link = NULL;
		push_back(head, s);
	}
}
//打印一元多项式
void ShowPolyn(Polynmail head)
{
	PolynNode *s = head->link;
	while (s != NULL)
	{
		if (s->data.expn == 0)//5x^0 ---->5
		{
			printf("%d", s->data.coef);
		}
		else if (s->data.expn == 1)//5x^1---->5x
		{
			printf("%dx", s->data.coef);
		}
		else//正常结果直接打印
		{
			printf("%dx^%d", s->data.coef, s->data.expn);	
		}
		//下一项存在且系数为正数,需打印正号(负数会自带符号)
		s = s->link;
		if (s != NULL && s->data.coef > 0)
		{
			printf("+");
		}
		
	}
	printf("\n");
}
//表达式pa + pb的结果保存在head中
void AddPolyn(Polynmail &head, Polynmail pa, Polynmail pb)
{
	PolynNode *sa = pa->link;
	PolynNode *sb = pb->link;
	PolynNode *s;

	while (sa != NULL && sb != NULL)
	{
		s = new PolynNode;
		s->link = NULL;
		//sa节点的指数 < sb节点的指数 ----------->
		//1:将sa节点中的数据插入到结果中 2:指向下一个pa节点
		if (sa->data.expn < sb->data.expn)
		{
			s->data.coef = sa->data.coef;
			s->data.expn = sa->data.expn;
			sa = sa->link;
		}
		//sa节点的指数 > sb节点的指数 ----------->
		//1:将sb节点中的数据插入到结果中 2:指向下一个pb节点
		else if (sa->data.expn > sb->data.expn)
		{
			s->data.coef = sb->data.coef;
			s->data.expn = sb->data.expn;
			sb = sb->link;
		}
		//sa节点的指数 == sb节点的指数
		//1:将二者系数的和即相同的指数插入到结果中 2:pa、pb都指向下一个节点
		else if (sa->data.expn == sb->data.expn)
		{
			s->data.coef = sb->data.coef + sa->data.coef;
			s->data.expn = sb->data.expn;
			sb = sb->link;
			sa = sa->link;
		}
		//若所加结果的系数为0,不用插入结果中,反之需要插入到结果中
		if (s->data.coef != 0)
		{
			push_back(head, s);
		}
	}
	//将pa 或者pb当中表达式较长的剩余节点全部插入到结果中
	if (sa != NULL)
	{
		while (sa != NULL)
		{
			s = new PolynNode;
			s->link = NULL;
			s->data.coef = sa->data.coef;
			s->data.expn = sa->data.expn;
			push_back(head, s);
			sa = sa->link;
		}
	}
	if (sb != NULL)
	{
		while (sb != NULL)
		{
			s = new PolynNode;
			s->link = NULL;
			s->data.coef = sb->data.coef;
			s->data.expn = sb->data.expn;
			push_back(head, s);
			sb = sb->link;
		}
	}
}
//表达式pa - pb的结果保存在head中
void SubPolyn(Polynmail &head, Polynmail pa, Polynmail pb)
{
	PolynNode *sa = pa->link;
	PolynNode *sb = pb->link;
	PolynNode *s;

	while (sa != NULL && sb != NULL)
	{
		s = new PolynNode;
		s->link = NULL;
		//sa - sb sa中存在而sb中不存在的节点,相减后为正
		if (sa->data.expn < sb->data.expn)
		{
			s->data.coef = sa->data.coef;
			s->data.expn = sa->data.expn;
			sa = sa->link;
		}
		//sa - sb sb中存在而sa中不存在的节点,相减后为负
		else if (sa->data.expn > sb->data.expn)
		{
			s->data.coef = -(sb->data.coef);
			s->data.expn = sb->data.expn;
			sb = sb->link;
		}
		//sa - sb 两者都存在的节点,结果 = 二者相减后的结果
		else if (sa->data.expn == sb->data.expn)
		{
			s->data.coef = sb->data.coef - sa->data.coef;
			s->data.expn = sb->data.expn;
			sb = sb->link;
			sa = sa->link;
		}
		if (s->data.coef != 0)
		{
			push_back(head, s);
		}
		
	}
	if (sa != NULL)
	{
		while (sa != NULL)
		{
			s = new PolynNode;
			s->link = NULL;
			s->data.coef = sa->data.coef;//sa - sb sa中存在而sb中不存在的节点,相减后为正
			s->data.expn = sa->data.expn;
			push_back(head, s);
			sa = sa->link;
		}
	}
	if (sb != NULL)
	{
		while (sb != NULL)
		{
			s = new PolynNode;
			s->link = NULL;
			s->data.coef = -(sb->data.coef);//sa - sb sb中存在而sa中不存在的节点,相减后为负
			s->data.expn = sb->data.expn;
			push_back(head, s);
			sb = sb->link;
		}
	}
}
int lenth(Polynmail head)
{
	int count = 0;
	PolynNode *s = head->link;
	while (s != NULL)
	{
		count++;
		s = s->link;
	}
	return count;
}
//表达式pa * pb的结果保存在head中
void MulPolyn(Polynmail &head, Polynmail pa, Polynmail pb)
{
	PolynNode *sb = pb->link;
	while (sb != NULL)//sb中的每一个节点和sa中的所有节点相乘
	{
		PolynNode *sa = pa->link;//因为sb的每个节点都要和sa中的全部节点相乘,所以sb的每个节点
		while (sa != NULL)       //相乘时,sa总要从头开始
		{
			//创建相乘后的节点
			PolynNode *p = new PolynNode;
			p->data.coef = (sa->data.coef)*(sb->data.coef);//系数相乘
			p->data.expn = (sa->data.expn)+(sb->data.expn);//指数相加
			p->link = NULL;
			//寻找已存在的节点中是否存在与刚创建的节点(指数)相同的节点
			PolynNode *s = head->link;
			while (s != NULL && (s->data.expn) != (p->data.expn))
			{
				s = s->link;
			}
			//不存在指数相同的节点,直接尾插即可
			if (s == NULL)
			{
				push_back(head, p);
			}
			//存在指数相同的节点,修改系数即可
			else
			{
				s->data.coef += p->data.coef;
			}
			//(sb的当前节点)为乘以sa中的下一个节点做准备
			sa = sa->link;
		}
		//为sb中的下一个节点乘以sa的全部节点做准备
		sb = sb->link;
	}
}
void destory(Polynmail &head)
{
	PolynNode *s = head->link;
	while (s != NULL)
	{
		head->link = s->link;
		delete s;
		s = head->link;
	}
	delete head;
	head = NULL;
}

main.cpp

#include"Polynomail.h"
#include<cstdlib>
int main()
{
	Polynmail pa;
	Polynmail pb;
	Polynmail pc;

	InitPolyn(pa);
	InitPolyn(pb);
	InitPolyn(pc);
	
	int select = 1;
	int n;
	while (select)
	{
		printf("*****************************************\n");
		printf("* [1]创建多项式pa       [2]创建多项式pb *\n");
		printf("* [3]打印多项式pa       [4]打印多项式pb *\n");
		printf("* [5]AddPolyn           [6]SubPolyn     *\n");
		printf("* [7]MulPolyn           [8]打印多项式pc *\n");
		printf("* [0]退出系统           [0]退出系统     *\n");
		printf("*****************************************\n");

		scanf_s("%d", &select);
		switch (select)
		{
		case 1:
			printf("请输入多项式的项数:>");
			scanf_s("%d", &n);
			CreatPolyn(pa, n);
			break;
		case 2:
			printf("请输入多项式的项数:>");
			scanf_s("%d", &n);
			CreatPolyn(pb, n);
			break;
		case 3:
			printf("pa = ");
			ShowPolyn(pa);
			break;
		case 4:
			printf("pb = ");
			ShowPolyn(pb);
			break;
		case 5:
			AddPolyn(pc, pa, pb);
			break;
		case 6:
			SubPolyn(pc, pa, pb);
			break;
		case 7:
			MulPolyn(pc, pa, pb);
			break;
		case 8:
			printf("pc = ");
			ShowPolyn(pc);
			break;
		default:
			break;
		}
	}
	destory(pa);
	destory(pb);
	destory(pc);
	system("pause");
	return 0;
}


  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值