C语言实现一元多项式加法运算(链表)

C语言 专栏收录该内容
17 篇文章 0 订阅

C语言实现一元多项式加法运算(链表)

完成如下操作
①输入并建立一元稀疏多项式;(输入格式自定)
例如:4 - 12x3 + 123x5 - 80x10
②输出所建立的一元多项式;(输出格式自定)
例如:12 - 3x + x3 + 230x12
③ 实现两个多项式相加运算并输出;.
④ 实现两个多项式相减运算并输出;

实验要求
程序运行后显示一个文本方式的用户界面
··························································
一元多项式加法
0:退出
1:输入并建立多项式
2:输出多项式
3:将两个多项式相加并输出
4:将两个多项式相减并输出
·························································
详细思路见代码注释

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
	int coef;//系数
	int expn;//指数
	struct Node *next;
} LNode; //LNode为创建的多项式链表类型

struct elem {
	int coef;
	int expn;
} List[100],change;   //List[]构建链表,change用来交换List[]中的某两项

LNode* create(int n);
LNode* add(LNode *p1,LNode *p2); //相加
LNode* sub(LNode *p1,LNode *p2); //相减
void print(LNode *p1);


int main() {
	while(1) {
		int choose;
		int z=2;
		LNode *head2[2];     //head2[]为两多项式的头结点
		int n,i,j;
		int k=1;
		printf("\n\n");//与上次的输出结果保持间隔,便于美观
		printf("	______________________________________________\n");//菜单输出
		printf("	|                     MENU                    |\n");
		printf("	|             1.输入并建立多项式              |\n");
		printf("	|             2.输出多项式                    |\n");
		printf("	|             3.将两个多项式相加运算并输出    |\n");
		printf("	|             4.将两个多项式相减运算并输出    |\n");
		printf("	|             0.  quit                        |\n");
		printf("	|_____________________________________________|\n");
		printf("Please choose your function: ");
		scanf("%d",&choose);
		switch(choose) {
			case 0:
				exit(0);
				break;
			case 1:
				while(z) {
					printf("请输入该多项式的项数\n");
					scanf("%d",&n);
					printf("请输入各项的系数与指数\n");
					i=1;
					for(i=1; i<=n; i++)
						scanf("%d%d",&List[i].coef,&List[i].expn);
					i=1;
					j=1;
					for(i; i<n; i++)
						for(j=i+1; j<=n; j++) {
							if(List[j].expn < List[i].expn) {  //将输入的指数按升序排列 ,排序算法
								change.coef = List[i].coef;
								change.expn = List[i].expn;
								List[i].coef = List[j].coef;
								List[i].expn = List[j].expn;
								List[j].coef = change.coef;
								List[j].expn = change.expn;
							}
						}
					head2[k] = create(n);
					k++;
					z--;
				}
				break;
			case 2:
				print(head2[1]);
				printf("\n");
				print(head2[2]);
				printf("\n");
				break;
			case 3:
				LNode *pp;
				pp=add(head2[1],head2[2]);
				printf("结果为:\n");
				print(pp);
				system("pause");
				break;
			case 4:
				LNode* ppp;
				ppp=sub(head2[1],head2[2]);
				printf("结果为:\n");
				print(ppp);
				system("pause");
				break;
		}
	}
	return 0;
}

//创建链表
LNode* create(int n) {
	LNode *head;
	LNode *s,*L;              //*s表示新创建的空表,*L表示当前的链表,用来连接两空表
	L=s=NULL;
	head=(LNode *)malloc(sizeof(LNode));
	head->next = 0;                 //定义空链表
	L =  (LNode *)malloc(sizeof(LNode));
	n--;
	L->coef = List[1].coef;          //复制
	L->expn = List[1].expn;
	head->next = L;
	int i = 2;
	while(n) {
		s=(LNode *)malloc(sizeof(LNode));
		L->next=s;
		s->coef=List[i].coef;
		s->expn=List[i].expn;
		L=s;
		n--;
		i++;
	}
	L->next=0;
	return head;
}

//进行加法运算
LNode* add(LNode *p1,LNode *p2) { //将多项式p1与p2相加,结果存在第三个链表中(第三个链表由该函数创建)

	p1=p1->next;
	p2=p2->next;
	LNode *head;
	LNode *L,*s;
	head=(LNode *)malloc(sizeof(LNode));
	head->next=NULL;
	L=head;
	while(p1&&p2) {          //遍历两表,根据情况判断表的长短是否相同,是否缺项多项,建立一个新的链表来存取内容
		if(p1->expn > p2->expn) { //比较指数大小,将指数和系数较小的存入新表
			s=(LNode *)malloc(sizeof(LNode));
			L->next=s;
			s->coef=p2->coef;
			s->expn=p2->expn;
			L=s;
			p2=p2->next;
		}
		if(p1->expn < p2->expn) { //比较指数大小,将指数和系数较小的存入新表
			s=(LNode *)malloc(sizeof(LNode));
			L->next=s;
			s->coef=p1->coef;
			s->expn=p1->expn;
			L=s;
			p1=p1->next;
		}
		if(p1->expn == p2->expn) { //相等可以直接相加
			s=(LNode *)malloc(sizeof(LNode));
			L->next=s;
			s->coef=p1->coef + p2->coef;
			s->expn=p1->expn;
			L=s;
			p1=p1->next;
			p2=p2->next;
		}
	}
	while(p1) { //p1有剩余
		s=(LNode *)malloc(sizeof(LNode));
		L->next=s;
		s->coef=p1->coef;
		s->expn=p1->expn;
		L=s;
		p1=p1->next;
	}
	while(p2) { //p2有剩余
		s=(LNode *)malloc(sizeof(LNode));
		L->next=s;
		s->coef=p2->coef;
		s->expn=p2->expn;
		L=s;
		p2=p2->next;
	}
	L->next=NULL;
	return head;
}

//进行减法运算
//减法运算时要将第二个表的多出来的部分按照相反数输出
LNode* sub(LNode *p1,LNode *p2) { //将多项式p1与p2相加,结果存在第三个链表中(第三个链表由该函数创建)
	p1=p1->next;
	p2=p2->next;
	LNode *head;
	LNode *L,*s;
	head = (LNode *)malloc(sizeof(LNode));
	head->next = NULL;
	L = head;
	while(p1&&p2) {          //遍历两表,根据情况判断表的长短是否相同,是否缺项多项,建立一个新的链表来存取内容
		if(p1->expn > p2->expn) { //比较指数大小,将指数和系数较小的存入新表
			s=(LNode *)malloc(sizeof(LNode));
			L->next = s;
			s->coef = p2->coef;
			s->expn = p2->expn;
			L = s;
			p2 = p2->next;
		}
		if(p1->expn < p2->expn) { //比较指数大小,将指数和系数较小的存入新表
			s=(LNode *)malloc(sizeof(LNode));
			L->next = s;
			s->coef = p1->coef;
			s->expn = p1->expn;
			L = s;
			p1 = p1->next;
		}
		if(p1->expn == p2->expn) { //相等可以直接相加
			s = (LNode *)malloc(sizeof(LNode));
			L->next = s;
			s->coef = p1->coef - p2->coef;
			s->expn = p1->expn;
			L = s;
			p1 = p1->next;
			p2 = p2->next;
		}
	}
	while(p1) { //p1有剩余
		s=(LNode *)malloc(sizeof(LNode));
		L->next=s;
		s->coef=p1->coef;
		s->expn=p1->expn;
		L=s;
		p1=p1->next;
	}
	while(p2) { //p2有剩余
		s=(LNode *)malloc(sizeof(LNode));
		L->next=s;
		s->coef= -p2->coef;
		s->expn=p2->expn;
		L=s;
		p2=p2->next;
	}
	L->next=NULL;
	return head;
}

//输出结果
void print(LNode *p1) {   //输出表
	p1=p1->next;
	while(p1) {
		printf("+ %d X`%d  ",p1->coef,p1->expn);
		p1=p1->next;
	}
}

发现有如下bug
**1:**上述程序只能讲系数赋值为整形变量,改进后可将系数赋值为浮点型
**2:**上述程序无法处理 0 个项数的情况,改进后可将某一多项式设置为 0
**3:**上述程序的结果显示为系数为 0 也会显示出指数,改进后结果为0 的只显示一个 0

下面是改进程序

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
	float coef;//系数 
	int expn;//指数
	struct Node *next;
}LNode;  //LNode为创建的多项式链表类型

struct elem
{
	float coef;
	int expn;
}List[100],change;    //List[]构建链表,change用来交换List[]中的某两项

LNode* create(int n);
LNode* add(LNode *p1,LNode *p2); //相加 
LNode* sub(LNode *p1,LNode *p2); //相减 
void print(LNode *p1);

int main()
{
	while(1)
	{
		int choose;
		int z=2;
		LNode *head2[2];     //head2[]为两多项式的头结点
		int n,i,j;
		int k=1; 
		printf("\n\n");//与上次的输出结果保持间隔,便于美观 
		printf("	______________________________________________\n");//菜单输出 
		printf("	|                     MENU                    |\n");
		printf("	|             1.输入并建立多项式              |\n");               
		printf("	|             2.输出多项式                    |\n");
		printf("	|             3.将两个多项式相加运算并输出    |\n");
		printf("	|             4.将两个多项式相减运算并输出    |\n");
		printf("	|             0.  quit                        |\n");
		printf("	|_____________________________________________|\n");
		printf("请选择您将要执行的程序: ");
		scanf("%d",&choose);
		switch(choose)
		{
			case 0:exit(0); break;
			case 1:
				while(z)                                        
				{
					i=1;j=1;
					printf("请输入该多项式的项数\n");//如果输入的项数为 0 呢? 
					scanf("%d",&n);
					
					if(n>0)
					{
						printf("请输入各项的系数与指数\n");
						for(i=1;i<=n;i++)
						scanf("%f %d",&List[i].coef,&List[i].expn);
						for(i;i<n;i++)
							for(j=i+1;j<=n;j++)
							{
								if(List[j].expn < List[i].expn)    //将输入的指数按升序排列 ,排序算法 
								{
									change.coef = List[i].coef;
									change.expn = List[i].expn;
									List[i].coef = List[j].coef;
									List[i].expn = List[j].expn;
									List[j].coef = change.coef;
									List[j].expn = change.expn;
								}
							}
					    head2[k] = create(n); 
						k++;z--;
					}
					  
					if(n==0)
					{
						n=1;
						printf("请把项数与指数均设置为 0 \n");	
						for(i=1;i<=n;i++)
						scanf("%f %d",&List[i].coef,&List[i].expn);
						if(List[i-1].coef == 0 && List[i-1].expn == 0)
						{
							LNode *head;                                    
							LNode *s,*L;              //*s表示新创建的空表,*L表示当前的链表,用来连接两空表
							L=s=NULL;
							head=(LNode *)malloc(sizeof(LNode));
							head->next = 0;                 //定义空链表 
							L =  (LNode *)malloc(sizeof(LNode));
							n--;                                            
							L->coef = List[1].coef;          //复制
							L->expn = List[1].expn;
							head->next = L;
							int i = 2;             
							while(n)
							{
								s=(LNode *)malloc(sizeof(LNode));
								L->next=s;
								s->coef=List[i].coef;
								s->expn=List[i].expn;
								L=s;
								n--;
								i++;
							}
							L->next=0;
							
							k++;
							z--;
						}
						else
						{
							printf("输入错误,请重新启动程序\n");
							exit(0);
						}
					}
					
					if(n<0)
					{
						printf("输入错误,请重新启动程序\n");
						exit(0);
					}
				}		
				break;
			case 2:
				print(head2[1]);
				printf("\n");
				print(head2[2]); 
				printf("\n");
				break;
			case 3:
				LNode *pp;
				pp=add(head2[1],head2[2]);
				printf("结果为:\n");
				print(pp);
				system("pause");
				break; 
			case 4:
				LNode* ppp;
				ppp=sub(head2[1],head2[2]);
				printf("结果为:\n");
				print(ppp);
				system("pause");
				break;
		}
	 } 
	return 0;
 } 
 
//创建链表 
 LNode* create(int n)       
{
	LNode *head;                                    
	LNode *s,*L;              //*s表示新创建的空表,*L表示当前的链表,用来连接两空表
	L=s=NULL;
	head=(LNode *)malloc(sizeof(LNode));
	head->next = 0;                 //定义空链表 
	L =  (LNode *)malloc(sizeof(LNode));
	n--;                                            
	L->coef = List[1].coef;          //复制
	L->expn = List[1].expn;
	head->next = L;
	int i = 2;             
	while(n)
	{
		s=(LNode *)malloc(sizeof(LNode));
		L->next=s;
		s->coef=List[i].coef;
		s->expn=List[i].expn;
		L=s;
		n--;
		i++;
	}
	L->next=0;
	return head;
}

//进行加法运算 
LNode* add(LNode *p1,LNode *p2)   //将多项式p1与p2相加,结果存在第三个链表中(第三个链表由该函数创建)
{  
	p1=p1->next;              
	p2=p2->next;
	LNode *head;              
	LNode *L,*s;
	head=(LNode *)malloc(sizeof(LNode));
	head->next=NULL;
	L=head;
	while(p1&&p2)            //遍历两表,根据情况判断表的长短是否相同,是否缺项多项,建立一个新的链表来存取内容 
	{
		if(p1->expn > p2->expn)//比较指数大小,将指数和系数较小的存入新表 
		{
			s=(LNode *)malloc(sizeof(LNode));
			L->next=s;
			s->coef=p2->coef;
			s->expn=p2->expn;
			L=s;
			p2=p2->next;
		}
		if(p1->expn < p2->expn)//比较指数大小,将指数和系数较小的存入新表 
		{
			s=(LNode *)malloc(sizeof(LNode));
			L->next=s;
			s->coef=p1->coef;
			s->expn=p1->expn;
			L=s;
			p1=p1->next;
		}
		if(p1->expn == p2->expn)//相等可以直接相加 
		{
			s=(LNode *)malloc(sizeof(LNode));
			L->next=s;
			s->coef=p1->coef + p2->coef;
			s->expn=p1->expn;
			L=s;
			p1=p1->next;
			p2=p2->next;
		}
	}
	while(p1)//p1有剩余 
	{
		s=(LNode *)malloc(sizeof(LNode));
		L->next=s;
		s->coef=p1->coef;
		s->expn=p1->expn;
		L=s;
		p1=p1->next;
	}
	while(p2)//p2有剩余 
	{
		s=(LNode *)malloc(sizeof(LNode));
		L->next=s;
		s->coef=p2->coef;
		s->expn=p2->expn;
		L=s;
		p2=p2->next;
	}
	L->next=NULL;
	return head;
}

//进行减法运算 
//减法运算时要将第二个表的多出来的部分按照相反数输出,目前还没有更改 
LNode* sub(LNode *p1,LNode *p2)   //将多项式p1与p2相加,结果存在第三个链表中(第三个链表由该函数创建)
{  
 
	p1=p1->next;              
	p2=p2->next;
	LNode *head;              
	LNode *L,*s;
	head = (LNode *)malloc(sizeof(LNode));
	head->next = NULL;
	L = head;
	while(p1&&p2)            //遍历两表,根据情况判断表的长短是否相同,是否缺项多项,建立一个新的链表来存取内容 
	{
		if(p1->expn > p2->expn)//比较指数大小,将指数和系数较小的存入新表 
		{
			s=(LNode *)malloc(sizeof(LNode));
			L->next = s;
			s->coef = p2->coef;
			s->expn = p2->expn;
			L = s;
			p2 = p2->next;
		}
		if(p1->expn < p2->expn)//比较指数大小,将指数和系数较小的存入新表 
		{
			s=(LNode *)malloc(sizeof(LNode));
			L->next = s;
			s->coef = p1->coef;
			s->expn = p1->expn;
			L = s;
			p1 = p1->next;
		}
		if(p1->expn == p2->expn)//相等可以直接相加 
		{
			s = (LNode *)malloc(sizeof(LNode));
			L->next = s;
			s->coef = p1->coef - p2->coef;
			s->expn = p1->expn;
			L = s;
			p1 = p1->next;
			p2 = p2->next;
		}
	}
	while(p1)//p1有剩余 
	{
		    s=(LNode *)malloc(sizeof(LNode));
			L->next=s;
			s->coef=p1->coef;
			s->expn=p1->expn;
			L=s;
			p1=p1->next;
	}
	while(p2)//p2有剩余 
	{
		    s=(LNode *)malloc(sizeof(LNode));
			L->next=s;
			s->coef= -p2->coef;
			s->expn=p2->expn;
			L=s;
			p2=p2->next;
	}
	L->next=NULL;
	return head;
}

//输出结果 
void print(LNode *p1)     //输出表
{
	p1=p1->next;
	while(p1)
	{
		if(p1->coef != 0)
			printf("+ %.2f X`%d  ",p1->coef,p1->expn);
		if(p1->coef == 0)
			printf("+ 0 ");
		p1=p1->next;
	}
}

欢迎大家继续提出改进意见~

©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

Kingdeguo

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值