一元N次多项式的表示及相加

                                    线性表 — 一元n次多项式的表示与相加

这里用线性链表的基本操作来实现一元多项式的运算:

 

//一元N次多项式相加 
#include<stdio.h>
#include<stdlib.h>

typedef struct tagpolyn{
	float coef;              //系数 
	int expn;                //指数 
	struct tagpolyn *next;
}polyn,*LinkList;
//创建链表函数
void CreatPolyn(LinkList *L)
{
	LinkList q,s;
	*L=(LinkList)malloc(sizeof(polyn));
	(*L)->next=*L;
	for(;;){
		s=(LinkList)malloc(sizeof(polyn));
		scanf("%f%d",&s->coef,&s->expn);
		if(s->coef==0 && s->expn==0)break;    //当输入数据0 0时结束此循环
		else{
			q=*L;
			while((q->next != *L)&&(s->expn < q->next->expn))q=q->next; //按指数由大到小插入链表。
			s->next=q->next;
			q->next=s;
		}
	}
}
//链表连接函数
void AddPolyn(LinkList La,LinkList Lb,LinkList *Lc)
{
	*Lc=(LinkList)malloc(sizeof(polyn));
	(*Lc)->next=NULL;
	LinkList qa=La->next,qb=Lb->next,qc=*Lc;
	while(qa!=La && qb!=Lb){  //当qa与qb都没有等于头结点时,进行以下操作。
        if(qa->expn == qb->expn)
        {
        	qa->coef+=qb->coef;
        	qc->next=qa;
        	qc=qa;
        	qa=qa->next;
        	qb=qb->next;
        }
        else if(qa->expn < qb->expn)
        {
        	qc->next=qb;
        	qc=qb;
        	qb=qb->next;
        }
        else {
        	qc->next=qa;
        	qc=qa;
        	qa=qa->next;
        }
	}
	if(qa!=La){// 当Lb链表插入完后,La还有剩余数据,则将这些数据接在lc的后面。
		while(qa!=La){
			qc->next=qa;
			qc=qa;
			qa=qa->next;
		}
	}
	else{     // 当La链表结束后,Lb还有剩余数据,则将这些数据接在lc的后面。
		while(qb!=Lb){
			qc->next=qb;
			qc=qb;
			qb=qb->next;
		}
	}
	qc->next=*Lc;
}
//链表输出函数
void PrintList(LinkList *head)
{	
	polyn *p;
	p=*head;
	while(1){//因为要输出的链表都是循环链表,因此输出控制条件应该是当指针不是指向头结点时。
		printf("%.2f*x^%d",p->next->coef,p->next->expn);
		p=p->next;
		if(p->next!=*head){
		    printf(" + ");
		}
		else break;
	}
	printf("\n");
}

int main()
{
	LinkList pa,pb,pc;
	printf("请输入第一个多项式(以0 0结尾):\n"); 
	CreatPolyn(&pa);
	printf("请输入第二个多项式(以0 0结尾):\n"); 
	CreatPolyn(&pb);
	printf("f1(x) = ");
	PrintList(&pa);
	printf("f2(x) = ");
	PrintList(&pb);
	AddPolyn(pa,pb,&pc);
	printf("f1(x)+f2(x)的结果为:\nf(x) = "); 
	PrintList(&pc);
	return 0;
}

以下是演示结果:
在C语言中,我们可以使用单链表来表示一元N多项式的系数及其对应的指数。每个节点可以包含两个部分:一个整数存储系数,另一个整数存储指数。当我们需要对两个多项式进行相加时,可以创建一个新的链表,遍历原有的两个链表,并将对应项的系数累加,同时取指数较大的值作为新的节点的指数。 以下是大致步骤: 1. 定义一个结构体`Term`,包含系数`coeff`和指数`exp`。 ```c typedef struct { int coeff; int exp; } Term; ``` 2. 创建一个`Node`结构体,用于存放一个多项式的部分。 ```c typedef struct Node { Term term; struct Node* next; } Node; ``` 3. 初始化链表头指针。 ```c Node* head = NULL; ``` 4. 遍历第一个多项式,将每项添加到链表中。 ```c void addTerm(Node** head, int coeff, int exp) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->term.coeff = coeff; newNode->term.exp = exp; newNode->next = *head; *head = newNode; } ``` 5. 对第二个多项式同样处理,然后合并两个链表。这里需要注意如果两个节点有相同的指数,则将它们的系数相加。 ```c void mergePolynomials(Node** head1, Node** head2) { while (*head1 && *head2) { if ((*head1)->term.exp > (*head2)->term.exp) { Node* temp = *head1; *head1 = *head1->next; free(temp); addTerm(head2, (*head1)->term.coeff + (*head2)->term.coeff, (*head1)->term.exp); } else if ((*head1)->term.exp < (*head2)->term.exp) { Node* temp = *head2; *head2 = *head2->next; free(temp); addTerm(head1, (*head1)->term.coeff + (*head2)->term.coeff, (*head2)->term.exp); } else { (*head1)->term.coeff += (*head2)->term.coeff; Node* temp = *head2; *head2 = *head2->next; free(temp); } } // 如果还有剩余节点未处理,将其中一个链表连接到另一个链表的末尾 while (*head1) { addTerm(head2, (*head1)->term.coeff, (*head1)->term.exp); Node* temp = *head1; *head1 = *head1->next; free(temp); } while (*head2) { addTerm(head1, (*head2)->term.coeff, (*head2)->term.exp); Node* temp = *head2; *head2 = *head2->next; free(temp); } } ``` 6. 最后返回合并后的链表的头部指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值