一元多项式的加减法(C语言)

要求:以文件形式输入需要进行运算的两个一元多项式,并将结果以文件的形式进行输出。

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

//链表的构成
typedef struct Node{
	float ratio;
	int index;
	struct Node* next;
}*PNode,*LinkList;

//函数声明
void FILE_W();
LinkList Create_Link();
void Sort_Link(LinkList head);
void SUB_List(LinkList llist1,LinkList llist2);
void Add_List(LinkList llist1,LinkList llist2);
void print_2(LinkList head);

1.文件的写入

void FILE_W()
{	
	float ratio;
	int index;
	char M[10];
	printf("请输入文件名:");
	scanf("%s",&M); 
	FILE* fp;										//文件的写入
	fp=fopen(M,"w");
	printf("请输入一元多项式:");
	scanf("%f%d",&ratio,&index);
	while(ratio!=0||index!=0){
		fprintf(fp,"%.2f %d ",ratio,index);
		scanf("%f%d",&ratio,&index);
	}
	fprintf(fp,"%.2f %d ",ratio,index);
	fclose(fp);
}

2.链表结点的创立

LinkList Create_Link()
{
	LinkList head;
	PNode p,q;
	float ratio;
	int index;
	
	head=(struct Node*)malloc(sizeof(struct Node));
	head->next=NULL;
	
	q=head;	
	FILE*fp;
	char M[10];
	printf("请输入要相 加/减 的一元多项式的文件名:");
	scanf("%s",&M);
	fp=fopen(M,"r");
	fscanf(fp,"%f%d",&ratio,&index);

	while(ratio!=0||index!=0){
		p = (struct Node*)malloc(sizeof(struct Node));
		p->next=NULL;
		q->next=p;
		q=p;
		p->index=index;
		p->ratio=ratio;
		fscanf(fp,"%f%d",&ratio,&index);	
	}
	fclose(fp);
	return head;
}

3.将一元多项式进行降幂或升幂的排序

void Sort_Link(LinkList head)			//降幂或升幂排序 
{
	PNode p,q;
	float temp1;
	int temp2;
	for(p=head->next;p!=NULL;p=p->next){
		for(q=p->next;q!=NULL;q=q->next){
			if(q->index>p->index){	    //p->index<q->index为升幂排序 
				temp1=q->ratio;
				q->ratio=p->ratio;
				p->ratio=temp1;
				temp2=q->index;
				q->index=p->index;
				p->index=temp2;
			}
		}
	}
}

4.加法运算

void Add_List(LinkList llist1,LinkList llist2)
{
	PNode p,q,pre,temp;
	p=llist1->next;
	q=llist2->next;
	pre=llist1;						//保留移动的前一个节点 
	while(p&&q){
		if(q->index>p->index){		//进行节点的插入	
			temp=q->next;
			q->next=p;
			pre->next=q;
			pre=q;
			q=temp;
		}
		else if(q->index<p->index){			//节点的移动 
			pre=p;
			p=p->next;
		}
		else {
			if(q->ratio+p->ratio==0){
				pre->next=p->next;			//删除节点 
				free(p);
			}
			else{
				p->ratio=p->ratio+q->ratio;		
				pre=p;
			}
			p=pre->next;
			temp=q;
			q=q->next;
			free(temp);
		}
	}
	if(q){					//第一个链表结束但第二个链表还未结束 
		pre->next=q;
	}
	free(llist2);	
}

5.减法运算

void SUB_List(LinkList llist1,LinkList llist2)
{
	PNode p,q,pre,temp;
	p=llist1->next;
	q=llist2->next;
	pre=llist1;						//保留移动的前一个节点 
	while(p&&q){
		if(q->index>p->index){		//进行节点的插入	
			if(q->ratio<0){
				q->ratio=fabs(q->ratio);
			}
			else{
				q->ratio=-q->ratio;
			} 
			temp=q->next;			//第二个多项式的值第一个的下一个 
			q->next=p;		    //将第一个多项式的第一个值的地址赋给q->next 
			pre->next=q;			//插入的操作 
			pre=q;					//覆盖操作 
			q=temp;
		}
		else if(q->index<p->index){			//节点的移动 
			pre=p;
			p=p->next;
		}
		else {
			if(q->ratio-p->ratio==0){
				pre->next=p->next;			//删除节点 
				free(p);
			}
			else{
				p->ratio=p->ratio-q->ratio;	
				pre=p;
			}
			p=pre->next;
			temp=q;
			q=q->next;
			free(temp);
		}
	} 
		if(q){
			do{				      	//第一个链表结束但第二个链表还未结束 
				if(q->ratio<0){
					q->ratio=fabs(q->ratio);
			    	pre->next=q;
				}
				else{
					q->ratio=-q->ratio;
					pre->next=q;
				}
				q=q->next;
				pre=pre->next;			 //注意要记得移动pre->next 
			}while(q);
		} 
		if(p){	       				//第二个链表结束但第一个链表还未结束 
			do{
				pre=p;
				p=p->next;	
			}while(p); 
		} 
	free(llist2);	
}

6.输出函数

void print_2(LinkList head)
{
	PNode p;
	FILE* fp;
	fp=fopen("4.txt","w");
	printf("\nc=");
	fprintf(fp,"c=");
	for(p=head->next;p!=NULL;p=p->next){
		if(p->next==NULL){
			if(p->ratio<0){
				if(p->index==0){
					printf("%.2f",p->ratio);
					fprintf(fp,"%.2fx^%d ",p->ratio,p->index);
				}
				else{
					if(p->index==1){
						printf("%.2fx",p->ratio);
						fprintf(fp,"%.2fx^%d ",p->ratio,p->index);
					}
					else{
						printf("%.2fx^%d",p->ratio,p->index);
						fprintf(fp,"%.2fx^%d ",p->ratio,p->index);
			 		}
				}
			}
			else{
				if(p->index==0){
					printf("+%.2f",p->ratio);
					fprintf(fp,"+%.2fx^%d ",p->ratio,p->index);
				}
				else{						
					if(p->index==1){
						printf("+%.2fx",p->ratio);
						fprintf(fp,"+%.2fx^%d ",p->ratio,p->index);
					}
					else{
						printf("+%.2fx^%d",p->ratio,p->index);							
						fprintf(fp,"+%.2fx^%d ",p->ratio,p->index);
		 			}
				}
	  		}
	}
		else{
			if(p->ratio<0){
				if(p->index==0){
			printf("%.2f",p->ratio);
			fprintf(fp,"%.2fx^%d ",p->ratio,p->index);
			}
				else{
					if(p->index==1){
						printf("%.2fx",p->ratio);
						fprintf(fp,"%.2fx^%d ",p->ratio,p->index);
					}
					else{
						printf("%.2fx^%d",p->ratio,p->index);
						fprintf(fp,"%.2fx^%d ",p->ratio,p->index);
			 		}
				}
			}
		else{
			if(p==head->next){
				if(p->index==0){
					printf("%.2f",p->ratio);
					fprintf(fp,"%.2fx^%d ",p->ratio,p->index);
				}
				else{
					if(p->index==1){
						printf("%.2fx",p->ratio);
						fprintf(fp,"%.2fx^%d ",p->ratio,p->index);
					}
					else{
						printf("%.2fx^%d",p->ratio,p->index);
						fprintf(fp,"%.2fx^%d ",p->ratio,p->index);
					}
   				}
			}
			else{
				if(p->index==0){
					printf("+%.2f",p->ratio);
					fprintf(fp,"+%.2fx^%d ",p->ratio,p->index);
				}
				else{
					if(p->index==1){
						printf("+%.2fx",p->ratio);
						fprintf(fp,"+%.2fx^%d ",p->ratio,p->index);
					}
					else{
						printf("+%.2fx^%d",p->ratio,p->index);
						fprintf(fp,"+%.2fx^%d ",p->ratio,p->index);
					}
   				}
			}
			}
	}
	} 
}

7.主函数

int main()
{
	int m;
	printf("请选择你要进行的操作:1.输入一元多项式;2.进行加法运算;3.进行减法运算\n");
	scanf("%d",&m);
	switch(m){
		case 1: FILE_W();break;				//写入数据 
   		case 2:{
		   LinkList llist1=Create_Link();	//将第一个文件的数据存入第一个链表 
			LinkList llist2=Create_Link();	//将第二个文件的数据存入第二个链表 
	 		Sort_Link(llist1);				//将第一个链表进行降幂/升幂排序 
			Sort_Link(llist2);				//将第二个链表进行降幂/升幂排序 
			Add_List(llist1,llist2);		//将两个节点进行相加 
			print_2(llist1);					//输入结果 
	};		break;
		case 3:	{
			LinkList llist1=Create_Link();
			LinkList llist2=Create_Link();
	 		Sort_Link(llist1);			
			Sort_Link(llist2);			
			SUB_List(llist1,llist2); 
			print_2(llist1);	
	};		break;
		default:printf("输入错误!");break; 
	}
	return 0;
}

运行结果如下:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值