mooc2.4多项式的相加与相乘

本文介绍了一种使用链表结构实现多项式加法和乘法的方法。通过定义链表节点结构,实现了多项式的输入、加法和乘法运算,并提供了完整的C语言代码示例。该方法适用于计算机科学领域的数据结构和算法教学。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mooc2.4多项式的相加与相乘

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define len sizeof(struct node)

typedef struct node* point;
struct node{
	int xi;
	int zhi;
	point next;
};



void Attach(int Xi,int Zhi,point *prear)
{  //入队操作 
	point p;
	p=(point)malloc(len);
	p->xi=Xi;
	p->zhi=Zhi;
	p->next=NULL;
	(*prear)->next=p;
	*prear=p;
}


point create()//读入链表 
{ 
  point p,rear,t;
  int xi,zhi;
  p=(point)malloc(len);
  p->next=NULL;
  rear=p;
  printf("输入链表,输入0 0则输入结束\n"); 
  scanf("%d%d",&xi,&zhi);
  while(xi||zhi)//假设输入0 则输入结束
  {  Attach(xi,zhi,&rear);
  printf("再次输入\n");	
 scanf("%d%d",&xi,&zhi);
  }
  t=p;
  p=p->next;
  free(t);//  删除临时生成的头结点 ,p指向真正的第一项 
   return (p); 
}


int Compare(int x1,int x2)
{
	if(x1>x2)
	return 1;
	else if(x1<x2)
	return -1;
	else
	return 0;
}



point Add(point p1,point p2)
{
	point front,rear,temp;
	int sum;
	rear=(point)malloc(len);
	front=rear;
	while(p1&&p2)
	{
		switch(Compare(p1->zhi,p2->zhi))
		{
			case 1:Attach(p1->xi,p1->zhi,&rear);
			       p1=p1->next;
			       break;
			case -1:Attach(p2->xi,p2->zhi,&rear);
			       p2=p2->next;
			       break;
			case 0:sum=p1->xi+p2->xi;
			       if(sum)
			       Attach(sum,p1->zhi,&rear);
			       p1=p1->next;
			       p2=p2->next;
			       break;
		}
	}
	  // 将未处理完的另一个多项式的所有节点依次复制到结果多项式中去
	for(;p1;p1=p1->next)
	Attach(p1->xi,p1->zhi,&rear);
	for(;p2;p2=p2->next)
	Attach(p2->xi,p2->zhi,&rear);
	rear->next=NULL;
	temp=front;
	front=front->next;//令front指向结果多项式第一个非零项 
	free(temp);//释放临时空表头结点 
	return front; 
}




point Mult(point p1,point p2) 
{  point p,rear,t1,t2,t;
   int Xi,Zhi;
   if(p1==NULL||p2==NULL)
   return NULL;
   t1=p1;
   t2=p2;
   p=(point)malloc(len);
   p->next=NULL;
   rear=p;
   while(t2)//因为输入都是从大到小,所以先将结果加入p1的第一项与t2所有相乘得到p 
            // 再乘剩下的相当于在有序序列中插入  
   {
   	 Attach(t1->xi*t2->xi,t1->zhi+t2->zhi,&rear);
   	 t2=t2->next;
	   }
	   t1=t1->next;
	while(t1)
	{  t2=p2;rear=p;
	  while(t2)
	  {
	  	Zhi=t1->zhi+t2->zhi;
	  	Xi=t1->xi*t2->xi;
		  while(rear->next&&rear->next->zhi>Zhi)//当rear的下一项比Zhi大的时候,就继续往后 
		     rear=rear->next; 
		     if(rear->next&&rear->next->zhi==Zhi)//当rear的下一项和Zhi相等的时候就计算合并 
		     {  
		     	  if(rear->next->xi+Xi)//如果不为0则更新 
		         	rear->next->xi+=Xi;
				  else//如果为0则删除 
			       {
			 	      t=rear->next;
			 	       rear->next=t->next;
			 	        free(t);
			        }
			 }
			 else{  //入列   当rear的下一项和Zhi小的时候,则找到了插入位置 
			 	t=(point)malloc(len);
			 	t->xi=Xi;
			 	t->zhi=Zhi;
			 	t->next=rear->next;
			 	rear->next=t;
			 	rear=t;
			 }
			 t2=t2->next; 
	  }
	  t1=t1->next;}
	    t2=p;
		p=p->next;
		free(t2);
		return p; 
	  
	  
		
	 } 
	
	
	


void print(point head)//输出链表 
{
	point p;
	p=head;
    while(p!=NULL)
	{   if(p==head)
	    printf("%d(%d)",p->xi,p->zhi);
	    else
	    printf(" %d(%d)",p->xi,p->zhi);
	    p=p->next; 
	}
	
}


int main()
{   point p1,p2,pp,ps;
    p1=create();
    p2=create();
	printf("进行相乘操作\n");
	pp=Mult(p1,p2);
	print(pp);
	printf("\n进行相加操作\n");
	ps=Add(p1,p2);
	print(ps);
	return 0;
	
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值