C++链表、数组实现多项式相加、增删其中的单项式。

代码如下:希望对大家有帮助,也希望大家对不足之处指正。

链表:

#include <iostream>
using namespace std;
class Polynomial{
	public:
	//多项式系数
	double coefficient ; 
	//多项式指数 
	double index ; 
	//指针域 
	Polynomial *next ;
	//打印
	void display(Polynomial *head) ;
	//获取链表长度 
	int getLengthOfPloy(Polynomial *head) ;
	//多项式相加 
	Polynomial * addtionPolynomial(Polynomial *poly1 , Polynomial *poly2) ; 
	//删除指定位置的结点
	void deletePolynomial(Polynomial *head , int order) ;
	//插入某个某个节点
	void insertPolynomial(Polynomial *head , int coefficient , int index) ;
}; 
	//链表的创建
	Polynomial* createPoly(Polynomial **flag , int n){
		//创建头结点
		Polynomial *head = new Polynomial ;
		//上一个结点
		Polynomial *pre = head ; 
		//for循环创建链表
		for(int begin = 0 ; begin < n ; begin++) {
			Polynomial *poly = new Polynomial ;
			//输入相关多项式系数和指数 
			cout<<"请输入第"<<begin+1<<"个多项式系数和指数:  " ;
			cin>>poly->coefficient>>poly->index ; 
			//链接当前结点 
			pre->next = poly ;
			//将前驱结点改为当前新建的poly结点 
			pre = poly ;
			//将当前结点后继结点设置为空  
			poly->next = NULL ; 
			*flag = poly ;
		}
		//返回
		return head ; 
	}
	//获取链表长度(不含头结点) 
	int Polynomial::getLengthOfPloy(Polynomial *head){
		Polynomial *pre = head->next ;
		int count = 0 ;
		while(pre != NULL){
			pre = pre->next ;
			count++ ;
	}
		return count ; 
	}
	//插入设置
	void Polynomial::insertPolynomial(Polynomial *head , int coefficient , int index){
		//创建将要插入的结点
		Polynomial *newPoly = new Polynomial ;
		newPoly->coefficient =  coefficient ;
		newPoly->index = index ;
		//由于链表中指数默认从小到大,所以 首先要定位插入位点
		Polynomial * pre = head->next ;
		//如果比第一个指数都小,则需要与头结点链接
		if(index < pre->index){
			head->next = newPoly ;
			newPoly->next = pre ;
		} else{
			//将指针指向目标结点的前驱结点 
			while(index > pre->next->index){
				pre = pre->next ;
				//如果插入多项式的系数比其他都大,需要另外插入设置 
				if(pre->next == NULL){
				break ;
				}
			}
			//插入的多项式的系数最大的插入方法 
			if(pre->next == NULL){
				pre->next = newPoly ; 
				newPoly->next = NULL ;
			}
			//并非最大最小的插入方法 
			else{
				newPoly->next = pre->next ;
				pre->next = newPoly ;
			}
		} 
	} 
	//删除设置
	void Polynomial::deletePolynomial(Polynomial *head , int order){ 
		if(order < 0 || order >= head->getLengthOfPloy(head)){
			throw"删除操作失败,请检查是否越界" ; 
		}
		Polynomial *p = head;
		for(int begin = 0 ; begin < order ; begin++){
			p = p->next ;
		}
		p->next = p->next->next  ;
	} 
	//多项式求和
	Polynomial* Polynomial::addtionPolynomial(Polynomial *poly1 , Polynomial *poly2) {
		//利用链表一的储存空间存储合并后的多项式
		Polynomial *first , *second , *third ;
		//判断系数之和是否为零的标记
		int flag ;
		first = poly1->next ;
		second = poly2->next ;
		third = poly1 ;
		//下面进行多项式相加操作
		while(first && second){
			if(first->index < second->index){
				third->next = first ;
				first = first->next ;
				third = third->next ;
			}
			else if(first->index == second->index){
				//计算系数和并判断是否为零 
				flag = first->coefficient + second->coefficient ;
				if(flag){
					first->coefficient = flag ;
					third->next = first ;
					first = first->next ;
					second = second->next ;
					third = third->next ;
				}else{
					first = first->next ;
					second = second->next ;
				}
			}else{
				third->next = second ;
				second =second->next ;
				third = third->next ;
			}
		} 
		//判断哪个链表较长并将多余的接到third后面 
		third->next = (first ? first : second) ;
		return poly1 ;
	} 
	//打印链表
	void Polynomial::display(Polynomial *head) {
		//指向第一个结点 
		Polynomial *p = head->next; 
		while(p != NULL){
		if(p->next != NULL){
			if(p->next->coefficient<0){
			//如果系数为负数,则不需要"+" 
			cout<<p->coefficient<<"x^"<<p->index; 				
			}else{
			cout<<p->coefficient<<"x^"<<p->index<<"+"; 
			}
		}else{
		//如果是多项式的最后一次则其后也不需要"+" 
		cout<<p->coefficient<<"x^"<<p->index<<endl ; 
		}
		p = p->next ; 
	}

	}
int main() {
		//设置尾结点 
		cout<<"   **********欢迎使用多项式计算程序**********   "<<"\n"<<endl ; 
		Polynomial *tail ; 
		int n ;
		cout<<"请输入多项式中单项式的个数:" ; 
		cin>>n ; 
		Polynomial *poly1 = createPoly(&tail , n) ;
		cout<<"第一个多项式为"<<"(其长度为:"<<poly1->getLengthOfPloy(poly1)<<"):"<<endl ; 
		poly1->display(poly1) ;
		cout<<"\n" ;
		int a , b ;
		cout<<"请输入要插入的单项式系数和指数:" ;
		cin>>a>>b ; 
		poly1->insertPolynomial(poly1 , a , b) ;
		cout<<"插入后的多项式为"<<"(其长度为:"<<poly1->getLengthOfPloy(poly1)<<"):"<<endl ; 
		poly1->display(poly1) ;
		cout<<"\n" ;
		int c ;
		cout<<"请输入删除单项式的位置:" ; 
		cin>>c ; 
		poly1->deletePolynomial(poly1 , c) ;
		cout<<"删除后的多项式为"<<"(其长度为:"<<poly1->getLengthOfPloy(poly1)<<"):······①"<<endl ; 
		poly1->display(poly1) ;
		cout<<"\n" ;
		int m ;
		cout<<"请输入多项式中单项式的个数:" ;
		cin>>m ; 
		Polynomial *after ; 
		Polynomial *poly2 = createPoly(&after , m) ;
		cout<<"第二个多项式为"<<"(其长度为:"<<poly2->getLengthOfPloy(poly2)<<"):·······②"<<endl ; 
		poly2->display(poly2) ;
		cout<<"\n" ;
		Polynomial *poly3 = poly1->addtionPolynomial(poly1 , poly2) ;
		cout<<"① + ②的结果为"<<"(其长度为:"<<poly3->getLengthOfPloy(poly3)<<"):"<<endl ;
		poly3->display(poly3) ;
		return 0 ;	
}

数组:

#include <iostream>
using namespace std ;
//定义多项式类 
class Poly{
	public:
 		// 定义两个动态数组分别储存多项式的系数和指数 
		int *coefficient;
        int *index;
		
};
	//构建一个多项式的方法 
	void createPoly(Poly &poly , int count){
	//创建动态数组存储系数和指数 
	poly.coefficient = new int[count] ;
	poly.index = new int[count] ;
	//输入 对应的系数和系数
	for(int begin = 0 ; begin < count ; begin++){
		cout<<"请输入第"<<begin+1<<"项的系数和指数:" ;
		cin>>poly.coefficient[begin]>>poly.index[begin] ;
	} 
}
	//构造多项式相加方法 
Poly addPolynomial(Poly &poly1 , int count1 , Poly &poly2 , int count2){
	//创建一个新的多项式对象存储西相加后的多项式 
	Poly poly ;
	poly.coefficient = new int[count1 + count2] ;
	poly.index = new int[count1 + count2] ;
	//遍历数组 
	int flag1=0 , flag2=0 , flag=0 ;
	//数组相加 
	while(flag1 < count1 && flag2 < count2 ){  
		if(poly1.index[flag1] < poly2.index[flag2]){
			poly.index[flag] = poly1.index[flag1] ;
			poly.coefficient[flag] = poly1.coefficient[flag1] ;
			flag++ ;
			flag1++ ;
		}else if(poly1.index[flag1] == poly2.index[flag2]){
			if(poly1.coefficient[flag1] + poly2.coefficient[flag2]){
				poly.index[flag] = poly1.index[flag1] ;
				poly.coefficient[flag] = poly1.coefficient[flag1] + poly2.coefficient[flag2] ;
				flag++ ;
				flag1++ ;
				flag2++ ;
			}else{
				flag1++ ;
				flag2++ ;
			}
		}else{
			poly.index[flag] = poly2.index[flag2] ;
			poly.coefficient[flag] = poly2.coefficient[flag2] ;
			flag++ ;
			flag2++ ;
		}
	}
		//将较长的多项式的余项连接上 
		if(flag1 == count1 ){
			 for( ; flag2 < count2 ; flag2++ ){
				poly.coefficient[flag] = poly2.coefficient[flag2];
				poly.index[flag] = poly2.index[flag2] ;
				flag++ ;
			}
		}else if(flag2 == count2){
				for( ; flag1 < count1 ; flag1++ ){
				poly.coefficient[flag] = poly1.coefficient[flag1];
				poly.index[flag] = poly1.index[flag1] ;
				flag++ ;
			}	
		}
	return poly ;
}
//打印多项式的方法 
void display(Poly &poly,int count){
		for(int start = 0 ; start < count ; start++){
			if(start != count-1){
				if(poly.coefficient[start+1] < 0){
					cout<<poly.coefficient[start]<<"x^"<<poly.index[start];
				}else{ 
						if(poly.index[start+1] == 0){
							cout<<poly.coefficient[start]<<"x^"<<poly.index[start] ;
						}else{
							cout<<poly.coefficient[start]<<"x^"<<poly.index[start]<<"+" ;
						}
				}
			}
			else{
				cout<<poly.coefficient[start]<<"x^"<<poly.index[start] ;
			} 
			//如果出现某项指数为零 则停止打印 
			if(poly.index[start+1] == 0){
				break ;
			}
	} 
}
int main(){
	cout<<"   **********欢迎使用多项式计算程序**********   "<<"\n"<<endl ; 
	int n ;
	cout<<"请输入多项式中单项式的个数:" ; 
	cin>>n ; 
	Poly poly1 ;
	createPoly(poly1 , n);
	display(poly1,n);
	cout<<"···········①" ; 
	cout<<"\n" ;
	int m ;
	cout<<"请输入多项式中单项式的个数:" ;
	cin>>m ; 
	Poly poly2 ;
	createPoly(poly2 , m);
	display(poly2,m);
	cout<<"···········②" ; 
	cout<<"\n" ;
	cout<<"① + ② 的和为:" <<endl ;
	Poly poly = addPolynomial(poly1 , n , poly2 , m) ;
	display(poly , m+n) ;
	return 0;
	
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表是一种常用的数据结构,可以用来实现稀疏多项式的相加。在C语言中,可以通过定义一个结构体来表示多项式的每一项,然后使用链表将这些项连接起来。 首先,我们可以定义一个结构体来表示多项式的每一项,包括系数和指数: ```c typedef struct Node { int coefficient; // 系数 int exponent; // 指数 struct Node* next; // 指向下一个节点的指针 } Node; ``` 然后,我们可以定义一个函数来创建一个新的节点: ```c Node* createNode(int coefficient, int exponent) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->coefficient = coefficient; newNode->exponent = exponent; newNode->next = NULL; return newNode; } ``` 接下来,我们可以定义一个函数来将节点插入到链表中的正确位置: ```c void insertNode(Node** head, Node* newNode) { if (*head == NULL || (*head)->exponent < newNode->exponent) { newNode->next = *head; *head = newNode; } else { Node* current = *head; while (current->next != NULL && current->next->exponent > newNode->exponent) { current = current->next; } newNode->next = current->next; current->next = newNode; } } ``` 最后,我们可以定义一个函数来实现两个多项式的相加: ```c Node* addPolynomials(Node* poly1, Node* poly2) { Node* result = NULL; while (poly1 != NULL && poly2 != NULL) { if (poly1->exponent > poly2->exponent) { insertNode(&result, createNode(poly1->coefficient, poly1->exponent)); poly1 = poly1->next; } else if (poly1->exponent < poly2->exponent) { insertNode(&result, createNode(poly2->coefficient, poly2->exponent)); poly2 = poly2->next; } else { int sum = poly1->coefficient + poly2->coefficient; if (sum != 0) { insertNode(&result, createNode(sum, poly1->exponent)); } poly1 = poly1->next; poly2 = poly2->next; } } while (poly1 != NULL) { insertNode(&result, createNode(poly1->coefficient, poly1->exponent)); poly1 = poly1->next; } while (poly2 != NULL) { insertNode(&result, createNode(poly2->coefficient, poly2->exponent)); poly2 = poly2->next; } return result; } ``` 这样,我们就可以通过调用上述函数来实现稀疏多项式的相加了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值