一元多项式求和C语言实现

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
	float coef;
	int index;
	struct LNode *next; 
}LNode,*Polynomial;
void CreatePoly(Polynomial *AB,int size);
Polynomial AddPolyn(Polynomial A,Polynomial B);
void PrintPoly(Polynomial A);
void main(){
	Polynomial A,B;//如果在main函数对A初始化分配地址,则可以直接穿A即指向首地址的指针 
	Polynomial p;
	int LA,LB;//两个多项式的长度
	printf("请输入第一个多项式的项数:");
	scanf("%d",&LA); 
	CreatePoly(&A,LA);//因为开始声明的A是野指针,只有地址传递让其指向分配的地址空间 , 
	//声明一个变量时操作系统会分配内存存储该变量,指针也是变量 
	//&A即指针存放A的地址,而不是A指向的地址,A是野指针,指向地址未知 
	PrintPoly(A);
	printf("请输入第二个多项式的项数:");
	scanf("%d",&LB);
	CreatePoly(&B,LB); 
	PrintPoly(B);
	p = AddPolyn(A,B);//经过创建A已经不是野指针,而是指向单链表,故此处可直接穿指针
	printf("和多项式为:"); 
	PrintPoly(p);
} 

void CreatePoly(Polynomial *AB,int size){//多项式的项数 //*AB是双重指针 
	*AB = (Polynomial)malloc(sizeof(LNode));//分配头结点 //此时*AB就和mian中的A等价,即指针AB指向了存放A的地址 *AB=A;对*AB初始化即相当于对A初始化 
//AB=&A;*AB=A;即初始化让A指向了分配的空间	
	LNode *r,*s;
	r = *AB;
	int i = 0;
	for(i=0;i<size;i++){
		s = (LNode*)malloc(sizeof(LNode));
		printf("请输入系数和指数(空格隔开):");//scanf会跳过空格,逗号会产生错误 
		scanf_s("%f %d",&s->coef,&s->index); 
		r->next = s;
		r = s;
	} 
	r->next = NULL;
	
	
}
void PrintPoly(Polynomial A){
	LNode *p;
	p = A->next;
	while(p){
		printf("%.2f X^%d",p->coef,p->index);
		//将多项式连接起来显示,最后一个结点无符号故在每一个结点之前输出加减号 
		p = p->next; 
		if(p!=NULL){
			if(p->coef>=0)
				printf("+");
			else
				printf("-");
		} 
	}
	printf("\n");
} 
Polynomial AddPolyn(Polynomial A,Polynomial B){
	LNode *a,*b;//分别指向A,B 
	LNode *Deletea,*Deleteb;//用来指向系数为0时要释放的结点 
	a = A->next;
	b = B->next; 
	Polynomial C;
	LNode *Crear;//指针,用来指向和多项式的头和尾
	//可以考虑给C一个头结点,
	C = (Polynomial)malloc(sizeof(LNode));
	C->next  = NULL;
	Crear =  C; 
	while(a!=NULL&&b!=NULL){
		if((a->index)<(b->index)){
			Crear->next = a;
			Crear = a;
			a = a->next;
		}//if
		else if(a->index==b->index){
			if(a->coef+b->coef==0){
				 Deletea = a;
				 a = a->next;
				 Deleteb = b;
				 b = b->next;
				 free(Deletea);
				 free(Deleteb); 
			}//if
			else{ 
				a->coef+=b->coef;//两个结点合并为一个,删除一个 
				Crear->next = a;
				Crear = a;
				Deleteb = b;
				b = b->next;				
				a = a->next;
				free(Deleteb);
			}//else
		}
		else{
			Crear->next = b;
			Crear = b;
			b = b->next;
		}
	}//while 
//一轮处理结束一个多项式以全部处理还有一个未处理完 注意上面以经->next 
	while(a!=NULL){
		Crear->next = a; 
		Crear = a;
		a =a->next; 
	}
	while(b!=NULL){
		Crear->next = b;
		Crear = b;
		b =b->next; 
	}		
	return C;
//	Crear = Chead = NULL;//C不带头结点太复杂 
//	while(a!=NULL&&b!=NULL){
//		if(a->index<b->index){
//			if(Chead==NULL){//没有头结点直接第一个结点需单独处理 
//				Chead = a;
//				Crear = a; 
//			}
//			else{
//				Crear->next = a;//将小阶结点插入C 
//			}
//			a  = a->next;
//		}
//		else if(a->index==b->index){
//			if(a->coef+b->coef==0){
//				 Deletea = a;
//				 a = a->next;
//				 Deleteb = b;
//				 b = b->next;
//				 free(Deletea);
//				 free(Deleteb); 
//			}
//			else{
//				if(Chead==NULL){//没有头结点直接第一个结点需单独处理 
//					a->coef+=b->coef;//两个结点合并为一个,删除一个 
//					Chead = a;
//					Crear = a; 
//					Deleteb = b;
//					b = b->next;
//					a = a->next;
//					free(Deleteb);
//				}
//				else{
//					Crear->next = a;//将小阶结点插入C 
//				}
//				a  = a->next;
//			}
//		}
//	} 


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值