数据结构A 实验2 稀疏多项式的运算

头文件

#include<stdio.h>
#include<stdlib.h>
#include<iostream>  // 使用 C++ 语言头文件导入
using namespace std;

结构体 类型定义

typedef struct LNode{
    
    
	float codf; // 系数
	int expn;  // 指数
	struct LNode *next; // 指向下一个节点的指针 
}LNode, *LinkList;   // 定义结点类型 LNode和指针类型 LinkList 

功能

1.创建多项式

/ 创建多项式 
// 输入n项的系数和指数,建立表示一元多项式的有序链表(为了求和时高效) 
void CreatPolyn(LinkList &P, int n){
    
     
	LinkList s,pre, q; // LNode* s, *pre, *q;
	P = new LNode;
	P->next = NULL; // q指示首元结点
	for(int i=1;i<=n;i++){
    
    
		s = new LNode;
		cin>>s->codf>>s->expn;
		pre = P; // pre 指示q前驱结点,初始为头结点 
		q = P->next; 
		while(q && q->expn < s->expn){
    
    
			pre=q;
			q=q->next;
		} 
		s->next=q; //新节点插入pre和q所指结点之间
		pre->next=s; 
	}// end for
}

2.多项式求和

// 多项式求和
// 求Pa=Pa+Pb, 利用两个链表的原有结点构成和多项式,不在分配新的结点空间
void AddPoly(LinkList &Pa,LinkList &Pb){
    
     //求和 
	LinkList p1;
	LinkList p2;
	LinkList p3;
	LinkList r;
	p1 = Pa->next;
	p2 = Pb->next;
	p3 = Pa; //存储结果 
	int sum = 0;
	while(p1 && p2){
    
    
		if(p1->expn == p2->expn){
    
    
			sum = p1->codf+p2->codf; //两者系数相加
			if(sum != 0){
    
    
				p1->codf = sum;
				p3->next = p1;
				p3 = p1;
				r = p2;
				p1 = p1->next;
				p2 = p2->next;
				free(r);
				
			}else{
    
     //等于0则释放 
				r = p1; p1 = p1->next; free(r);
				r = p2; p2 = p2->next;free(r);
			}
		}else if(p1->expn < p2->expn){
    
    
			p3->next = p1;
			p3 = p1;
			p1 = p1->next;
		}else{
    
    
			p3->next = p2;
			p3 = p2;
			p2 = p2->next;
		}
	}
	p3->next = p1?p1:p2;
	delete Pb;
	
	Print(Pa);
} 

3.输出多项式

// 输出多项式
void Print(LinkList &L){
    
    
	LinkList P;
	P = L ->next;
	while(P){
    
    
		printf("%f^%d\n",P->codf,P->expn);
		P = P->next;
	}
}

4.主函数

// 主函数
int main(){
    
    
	LinkList p1,p2;
	int n1,n2;
	printf("请输入p1的项\n");
	scanf("%d",&n1);
	CreatPolyn(p1,n1);
	printf("请输入p2的项\n");
	scanf("%d",&n2);
	CreatPolyn(p2,n2);
	AddPoly(p1,p2);
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_45765795/article/details/115227566