栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

顺序表实现两个多项式相加、相减、相乘运算(C语言)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

顺序表实现两个多项式相加、相减、相乘运算(C语言)

顺序表实现两个多项式相加、相减、相乘运算(C语言) 算法

很简单。略。
之所以不用单链表是因为线性表得数组形式“下标对应指数,数据元素对应系数”,理所当然成为处理多项式的首选。

程序
#include
#include

#define N 20

typedef int ElemType;
typedef struct{
	ElemType *elem;
	int length;
}List_Sq;

//顺序表初始化函数
List_Sq* InitList_Sq(List_Sq* L){
	L->elem = (ElemType*)malloc(sizeof(ElemType)*N);
	L->length = 0;
	return L;
}
//顺序表建立函数
void CreateList_Sq(List_Sq* L,int n){
	int i;
	for(i = 0;i < n;i++){
		printf("请输入x^%d的系数:",i);
		scanf("%d",&(L->elem[i]));
	}
	L->length = n;
}

//顺序表销毁函数
void DestroyList_Sq(List_Sq *L){
	if(L->elem)
		free(L->elem);
}

//多项式相加函数
List_Sq* AddList_Sq(List_Sq* Laa,List_Sq* Lbb,List_Sq* Lcc,int nc){
	ElemType *Laa_last,*Lbb_last,*pa,*pb,*pc;
	Lcc->elem = (ElemType*)malloc(sizeof(ElemType)*nc);
	Lcc->length = nc;
	pa = Laa->elem;
	pb = Lbb->elem;
	pc = Lcc->elem;
	Laa_last = &Laa->elem[Laa->length-1];
	Lbb_last = &Lbb->elem[Lbb->length-1];
	while(pa<=Laa_last && pb<=Lbb_last){
		*pc = *pa + *pb;
		pa++;
		pb++;
		pc++;
	}
	while(pa<=Laa_last){
		*pc = *pa;
		pa++;
		pc++;
	}
	while(pb<=Lbb_last){
		*pc = *pb;
		pb++;
		pc++;
	}
	return Lcc;

}

//多项式相减函数
List_Sq* SubtractList_Sq(List_Sq* Laa,List_Sq* Lbb,List_Sq* Lcc,int nc){
	ElemType *Laa_last,*Lbb_last,*pa,*pb,*pc;
	Lcc->elem = (ElemType*)malloc(sizeof(ElemType)*nc);
	Lcc->length = nc;
	pa = Laa->elem;
	pb = Lbb->elem;
	pc = Lcc->elem;
	Laa_last = &Laa->elem[Laa->length-1];
	Lbb_last = &Lbb->elem[Lbb->length-1];
	while(pa<=Laa_last && pb<=Lbb_last){
		*pc = *pa - *pb;
		pa++;
		pb++;
		pc++;
	}
	while(pa<=Laa_last){
		*pc = *pa;
		pa++;
		pc++;	
	}
	while(pb<=Lbb_last){
		*pc = *pb;
		pb++;
		pc++;
	}
	return Lcc;

}

//多项式相乘函数
List_Sq* MultiplyList_Sq(List_Sq* Laa,List_Sq* Lbb,List_Sq* Lcc,int nc){
	int i,j;
	Lcc->elem = (ElemType*)malloc(sizeof(ElemType)*nc);
	Lcc->length = nc;
	for(i = 0;ielem[i] = 0;
	}
	for(i = 0;ilength;i++){
		for(j = 0;jlength;j++){
			Lcc->elem[i+j] += Laa->elem[i]*Lbb->elem[j];
		}
	}
	return Lcc;
}

//多项式显示函数(只是为了显示得符合常规,没有必要)
void DisplayList_Sq(List_Sq* L){
	int i,sign;
	sign = 0;
	for(i = 0;i < L->length;i++){
		if(i == 0){
			if(L->elem[i]!=0)
				printf("%d",L->elem[i]);
			else 
				sign++;
		}
		else if(i == 1){
			if(L->elem[0] == 0){
				if(L->elem[i] == 1)
					printf("x");
				else if(L->elem[i]<0||L->elem[i]>1)
					printf("%dx",L->elem[i]);
				else
					sign++;
			}
			else{
				if(L->elem[i] == 1)
					printf("+x");
				else if(L->elem[i]>1)
					printf("+%dx",L->elem[i]);
				else if(L->elem[i]<0)
					printf("%dx",L->elem[i]);
				else
					sign++;
			}
		}
		else{
			if(sign == i){
				if(L->elem[i] == 1)
					printf("x^%d",i);
				else if(L->elem[i]<0||L->elem[i]>1)
					printf("%dx^%d",L->elem[i],i);
				else
					sign++;
			}
			else{
				if(L->elem[i] == 1)
					printf("+x^%d",i);
				else if(L->elem[i]>1)
					printf("+%dx^%d",L->elem[i],i);
				else if(L->elem[i]<0)
					printf("%dx^%d",L->elem[i],i);
				else
					sign++;
			}	
		}

	}
	printf("n");
}

void main(){
	List_Sq La,Lb,Lc;
	List_Sq *Laa,*Lbb,*Lcc;
	int na,nb,nc;
	Laa = &La;
	Lbb = &Lb;
	Lcc = &Lc;
	printf("建立多项式1:n");
	printf("请输多项式项数:");
	scanf("%d",&na);
	Laa = InitList_Sq(Laa);
	CreateList_Sq(Laa,na);
	printf("多项式1为:");
	DisplayList_Sq(Laa);
	printf("建立多项式2:n");
	printf("请输多项式项数:");
	scanf("%d",&nb);
	Lbb = InitList_Sq(Lbb);
	CreateList_Sq(Lbb,nb);
	printf("多项式2为:");
	DisplayList_Sq(Lbb);
	nc = na>nb?na:nb;
	Lcc = AddList_Sq(Laa,Lbb,Lcc,nc);
	printf("相加结果为:");
	DisplayList_Sq(Lcc);
	DestroyList_Sq(Lcc);
	Lcc = SubtractList_Sq(Laa,Lbb,Lcc,nc);
	printf("相减结果为:");
	DisplayList_Sq(Lcc);
	DestroyList_Sq(Lcc);
	nc = na + nb;
	Lcc = MultiplyList_Sq(Laa,Lbb,Lcc,nc);
	printf("相乘结果为:");
	DisplayList_Sq(Lcc);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/768677.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号