实验:一元多项式求和

实验内容:一元多项式求和。

        把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。

实验说明:

     一元多项式可以用单链表表示,结点结构图示如下

coefexpnext

     一元多项式算法伪代码如下:

1. 工作指针p、q初始化;

2. while(p存在且q存在)执行下列三种情形之一

        2.1 如果p->exp<q->exp,则指针p后移;

        2.2 如果p->exp>q->exp,则

                 2.2.1 将结点q插入到结点p之前;

                 2.2.2 指针q指向原指结点的下一个结点;

      2.3 如果p->exp=q->exp,则

                 2.3.1 p->coef =p->coef+q->coef;

                 2.3.2 如果p->coef ==0,则执行下列操作,否则,指针p后移;

                         2.3.2.1 删除结点p;

                         2.3.2.2 使指针p指向它原指结点的下一个结点;

                   2.3.3 删除结点q;

                   2.3.4 使指针q指向它原指结点的下一个结点;

 3. 如果q不为空,将结点q链接在第一个单链表的后面;

 

 

#include<stdio.h>
#include<malloc.h>

typedef struct LNode
{
	int coef;//系数
	int exp;//指数
	struct LNode *next;
}LinkNode;

void CreatList(LinkNode *&L)//创建多项式
{
	int m, coef, exp;
	L = (LinkNode*)malloc(sizeof(LinkNode));
	LinkNode *s, *r;
	r = L;
	printf("请输入多项式的项数:\n");
	scanf("%d", &m);
	for (int i = 0; i < m; i++)
	{
		printf("输入第%d项的系数和指数", i + 1);
		scanf("%d%d", &coef, &exp);
		s = (LinkNode *)malloc(sizeof(LinkNode));
		s->coef = coef;
		s->exp = exp;
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
int ListLength(LinkNode*&L)//链表长度
{
	int n = 0;
	LinkNode *p = L;
	while (p->next != NULL)
	{
		n++;
		p = p->next;
	}
	return n;
}

void DispList(LinkNode * L)//输出多项式
{
	int j = 0;
	LinkNode *p = L->next;
	while (p != NULL)
	{
		printf("%dX^%d", p->coef, p->exp);
		j++;
		if (j < ListLength(L)) printf("+");
		p = p->next;
	}
	printf("\n");
}
 LinkNode*ListAdd(LinkNode *p, LinkNode *q)//多项式相加
{
		LinkNode *L, *s, *r;
		p = p->next;
		q = q->next;
		L = (LinkNode *)malloc(sizeof(LinkNode));
		r = L;
		while (p!= NULL && q!= NULL)
		{
			if (p->exp > q->exp)
			{
				s = (LinkNode *)malloc(sizeof(LinkNode));
				s->coef = p->coef;
				s->exp = p->exp;
				r->next = s;
				r = s;
				p = p->next;
			}
			else if(p->exp == q->exp)
			{
				s = (LinkNode *)malloc(sizeof(LinkNode));
				s->coef = p->coef + q->coef;
				s->exp = p->exp;
				if (s->coef == 0) free(s);
				else
				{
					r->next = s;
					r = s;
				}
				p = p->next;
				q = q->next;
			}
			else
			{
				s = (LinkNode *)malloc(sizeof(LinkNode));
				s->coef = q->coef;
				s->exp = q->exp;
				r->next = s;
				r = s;
				q = q->next;
			}
		}
		if (p!= NULL)
			r->next = p;
		else if(q != NULL)
			r->next = q;
		else
			r->next = NULL;
		return L;

}
	

 int main()
 {
	 LinkNode *P, *Q;
	 printf("请输入第1个多项式:\n");
	 CreatList(P);
	 DispList(P);
	 printf("请输入第2个多项式;\n");
	 CreatList(Q);
	 DispList(Q);
	 LinkNode *L = ListAdd(P, Q);
	 printf("最后多项式为:");
		 DispList(L);
	 return 0;
 }


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值