⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 01 链表的应用--求两个一元多项式之和.cpp

📁 链表的应用
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>


typedef struct{//多项式的数据元素
	int coef;//系数
	int expn;//指数
}term;
typedef struct lnode{//链表元素
	term data;
	struct lnode * next;
}lnode,* linklist;


void creatpolyn(linklist &p,int m){//建立一元多项式
//p为链表的头结点,m为一元多项式的长度
	linklist h,node1,node2,nodenew;
	int i,key;
	term e;
	h=p=(linklist)malloc(sizeof(lnode));//建立头结点
	h->data.coef=0;
	h->data.expn=-1;
	h->next=0;
	for(i=1;i<=m;i++){//插入数据项
		printf("输入系数、指数\n");
		scanf("%d%d",&e.coef,&e.expn);
		for(node1=h->next,key=0;node1;node1=node1->next)
			if(node1->data.expn==e.expn){//若此项已经存在,则修改系数值
				key=1;
				node1->data=e;
				m++;
				break;
			}//if
		if(key==0){//若此项不存在,则新增结点,并插入到合适的位置
			for(node2=h,node1=node2->next;node1&&e.expn>node1->data.expn;node2=node1,node1=node1->next);
			nodenew=(linklist)malloc(sizeof(lnode));
			nodenew->data=e;
			node2->next=nodenew;
			nodenew->next=node1;
		}//if
	}//for
}//creatpolyn

void addpolyn(linklist &pa,linklist &pb){//合并一元多项式
//pa、pb一元多项式分别为需要合并的两个一元多项式(链表)的头结点
	linklist nodea1=pa->next,nodea2=pa,nodeb1=pb->next,nodeb2;
	int a,b,sum;
	if(pa->next&&pb->next){
		while(nodea1&&nodeb1){
			a=nodea1->data.expn;
			b=nodeb1->data.expn;
			switch(a==b?0:(a>b?1:-1)){
				case -1://多项式pa中当前结点的指数值较小
					nodea2=nodea1;
					nodea1=nodea1->next;
					break;
				case 0://两者指数值相等
					sum=nodea1->data.coef+nodeb1->data.coef;
					if(sum!=0){//修改多项式pa中当前结点的指数值
						nodea1->data.coef=sum;
						nodea2=nodea1;
						nodea1=nodea1->next;
					}//if
					else{//删除多项式pa中当前结点
						nodea1=nodea1->next;
						free(nodea2->next);
						nodea2->next=nodea1;
					}//else
					nodeb2=nodeb1->next;
					free(nodeb1);
					nodeb1=nodeb2;
					break;
				case 1://多项式pb中当前结点的指数值较小
					nodeb2=nodeb1->next;
					nodeb1->next=nodea1;
					nodeb1=nodeb2;
					nodea2->next=nodeb1;
					nodea2=nodea1;
					nodea1=nodea1->next;
					break;
			}//switch
		}//while
		if(!nodea1)nodea2->next=nodeb1;
		free(pb);
	}//if
	else
		if(!pa->next){
			pa->next=pb->next;
			free(pb);
		}//if

}//addpolyn

void printpolyn(linklist &p){//输出表达式
	linklist node1=p->next;
	if(node1){
		for(;node1->next;node1=node1->next)
			printf("%dX^%d+",node1->data.coef,node1->data.expn);
		printf("%dX^%d\n",node1->data.coef,node1->data.expn);
	}//if
	else
		printf("0");
}//printpolyn

void main(){//一元多项式按升幂排列
	linklist a,b;
	int m;
	printf("输入表达式1的长度\n");
	scanf("%d",&m);//建立多项式1
	creatpolyn(a,m);
	printf("\n\nf1(x)=");//打印多项式
	printpolyn(a);
	printf("\n输入表达式2的长度\n");//建立多项式2
	scanf("%d",&m);
	creatpolyn(b,m);
	printf("\nf2(x)=");
	printpolyn(b);
	addpolyn(a,b);//合并多项式
	printf("\nf1(x)+f2(x)=");
	printpolyn(a);
}//main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -