线性表的应用之多项式的表示与相加

这篇博客详细介绍了如何使用C语言实现一元多项式的表示、建立、相加和打印。通过typedef定义结构体ploy来表示多项式,利用链表结构存储系数和指数。输入格式为1+2x^1+2x^2等,多项式相加时,按照指数相同则系数相加,指数不同则链表合并的原则进行。最后,提供了打印多项式的函数,能够区分正负并按格式输出。
摘要由CSDN通过智能技术生成

在这里插入图片描述

一元多项式的表示

typedef struct ploy {
	double coef; //系数部分
	int exp;  //指数部分
	struct ploy* next; 
}ploy;

一元多项式的建立

输入的格式是 1+2x^1+2x^2这样的格式以#结束。

ploy* create_ploy() {
	ploy* head,*s,*p;
	head = (ploy*)malloc(sizeof(ploy));
	head->next = NULL;
	s = head;
	char ch;
	int flag = 0; //记录的是除了数字与+之外输入的字母个数
	int key = 2;//标记正负
	p = (ploy*)malloc(sizeof(ploy));
	while (~scanf_s("%c", &ch,1)) {
		if (ch == '#')
			break;
		if (ch == '+'||ch =='-') {
			if (flag == 1)  //表明输入的是7x这样的情况
				s->exp = 1; //x指数尾1的情况
			p = (ploy*)malloc(sizeof(ploy)); //建立新节点
			flag = 0;
			if (ch == '+')
				key = 1;
			else
				key = 0;
		}
		if (isdigit(ch)) {
			if (flag == 0) {
				if(key)
				p->coef = ch - '0';
				else if(key ==0)
					p->coef = -(ch - '0');
				p->exp = 0; //默认指数是-1
				s->next = p;
				s = p;
			}
			else if (flag == 2) //指数不为0
				s->exp = ch - '0';
		}
		else if(ch!='+'&&ch!='-')
			flag++;//记得加上
	}
	s->next = NULL; //最后一个结点指向空
	return head;
}

一元多项式相加

实质是:

  • 指数不同是链表的合并
  • 指数相同,系数相加;若为0,去掉该结点;若不为0,修改结点的系数域。
ploy* add(ploy* La, ploy* Lb) {
	ploy* pa, * pb, * pc,*q,*head;
	head = (ploy*)malloc(sizeof(ploy));
	head->next = NULL;
	pc = head;
	pa = La->next;
	pb = Lb->next;
	while (pa && pb) {
		if (pa->exp == pb->exp) { //指数相同
			pa->coef = pa->coef + pb->coef; //系数相加
			if ((int)pa->coef == 0) { //系数相加为0
				q = pa; //删除pa指向的结点
				pa = pa->next;
				free(q);
			}
			else //系数相加不为0
			{
				pc->next = pa;
				pc = pa;
				pa = pa->next;
			}
			q = pb;  //删除pb所指的结点
			pb = pb->next;
			free(q);
		}
		else if (pa->exp < pb->exp) {
				pc->next = pa;
				pc = pa;
				pa = pa->next;
			}//将pa所指的结点合并,pa指向下一个结点
		else {
				pc->next = pb;
				pc = pb;
				pb = pb->next;
		}//将pb所指的结点合并,pb指向下一个结点
	}
	//那个链没有处理完,就处理
	if (pa)pc->next = pa; 
	else pc->next = pb;
	return head;
}

一元多项式的打印

void show(ploy* head) {
	ploy* p = head->next;
	while (p->next) {
			if (p->coef > 0.0) { //分为正负打印
				if (p->exp == 0)
					printf("+%.2lf", p->coef);
				else if (p->exp == 1)
					printf("+%.2lfx", p->coef);
				else
					printf("+%.2lfx^%d", p->coef, p->exp);
			}
			else {
				if (p->exp == 0)
					printf("-%.2lf", p->coef);
				else if (p->exp == 1)
					printf("-%.2lfx+", p->coef);
				else
					printf("-%.2lfx^%d+", p->coef, p->exp);
			}
		p = p->next;
	}
	//最后一个
	if(p->coef>0.0)
	printf("+%.2lfx^%d\n", p->coef, p->exp);
	else
		printf("-%.2lfx^%d\n", p->coef, p->exp);

}

完整代码

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<ctype.h>
typedef struct ploy {
	double coef; //系数部分
	int exp;  //指数部分
	struct ploy* next; 
}ploy;

ploy* create_ploy() {
	ploy* head,*s,*p;
	head = (ploy*)malloc(sizeof(ploy));
	head->next = NULL;
	s = head;
	char ch;
	int flag = 0; //记录的是除了数字与+之外输入的字母个数
	int key = 2;//标记正负
	p = (ploy*)malloc(sizeof(ploy));
	while (~scanf_s("%c", &ch,1)) {
		if (ch == '#')
			break;
		if (ch == '+'||ch =='-') {
			if (flag == 1)  //表明输入的是7x这样的情况
				s->exp = 1; //x指数尾1的情况
			p = (ploy*)malloc(sizeof(ploy)); //建立新节点
			flag = 0;
			if (ch == '+')
				key = 1;
			else
				key = 0;
		}
		if (isdigit(ch)) {
			if (flag == 0) {
				if(key)
				p->coef = ch - '0';
				else if(key ==0)
					p->coef = -(ch - '0');
				p->exp = 0; //默认指数是-1
				s->next = p;
				s = p;
			}
			else if (flag == 2) //指数不为0
				s->exp = ch - '0';
		}
		else if(ch!='+'&&ch!='-')
			flag++;//记得加上
	}
	s->next = NULL; //最后一个结点指向空
	return head;
}

ploy* add(ploy* La, ploy* Lb) {
	ploy* pa, * pb, * pc,*q,*head;
	head = (ploy*)malloc(sizeof(ploy));
	head->next = NULL;
	pc = head;
	pa = La->next;
	pb = Lb->next;
	while (pa && pb) {
		if (pa->exp == pb->exp) { //指数相同
			pa->coef = pa->coef + pb->coef; //系数相加
			if ((int)pa->coef == 0) { //系数相加为0
				q = pa; //删除pa指向的结点
				pa = pa->next;
				free(q);
			}
			else //系数相加不为0
			{
				pc->next = pa;
				pc = pa;
				pa = pa->next;
			}
			q = pb;  //删除pb所指的结点
			pb = pb->next;
			free(q);
		}
		else if (pa->exp < pb->exp) {
				pc->next = pa;
				pc = pa;
				pa = pa->next;
			}//将pa所指的结点合并,pa指向下一个结点
		else {
				pc->next = pb;
				pc = pb;
				pb = pb->next;
		}//将pb所指的结点合并,pb指向下一个结点
	}
	//那个链没有处理完,就处理
	if (pa)pc->next = pa; 
	else pc->next = pb;
	return head;
}

void show(ploy* head) {
	ploy* p = head->next;
	while (p->next) {
			if (p->coef > 0.0) { //分为正负打印
				if (p->exp == 0)
					printf("+%.2lf", p->coef);
				else if (p->exp == 1)
					printf("+%.2lfx", p->coef);
				else
					printf("+%.2lfx^%d", p->coef, p->exp);
			}
			else {
				if (p->exp == 0)
					printf("-%.2lf", p->coef);
				else if (p->exp == 1)
					printf("-%.2lfx+", p->coef);
				else
					printf("-%.2lfx^%d+", p->coef, p->exp);
			}
		p = p->next;
	}
	//最后一个
	if(p->coef>0.0)
	printf("+%.2lfx^%d\n", p->coef, p->exp);
	else
		printf("-%.2lfx^%d\n", p->coef, p->exp);

}

int main() {
	ploy* head,*head1,*head2;
	head1 = create_ploy();
	getchar();
	head2 = create_ploy();
	show(head1);
	show(head2);
	head = add(head1, head2);
	show(head);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值