mooc2.4多项式加法 运算

多项式加法 运算
算法思路 : 两个指针P1 和P2 分别指向这两个多项式第一个结点 , 不断 循环:

  1. P1->zhi==P2->zhi: 系数相加,若结果不为0,则作为结果多项式对应项
    的系数。同时,P1和P2都分别指向下一项;
  2. P1->zhi > P2->zhi: 将P1的当前项存入结果多项式,并使P1指向下一项;
  3. P1->zhi < P2->zhi: 将P2的当前项存入结果多项式,并使P2指向下一项;
    当某一多项式处理完时,将另一个多项式的所有结点依次复制到结果多项式中去。
#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;
};


point create()//创建链表 
{ 
  int i=0;
  point head;
  point p1;
  point p2;
  head=NULL;
  p1=(point)malloc(len);
  p2=p1;
  printf("输入链表,输入0 0则输入结束\n"); 
  scanf("%d%d",&p1->xi,&p1->zhi);
  while(p1->xi||p1->zhi)//假设输入0 则输入结束
  {  printf("再次输入\n");
	if(i==0)
	head=p1;//第一个新建结点是表头
	else
	p2->next=p1;// 原表尾的下一个结点是新建结点
	p2=p1;//新建结点成为表尾 
	p1=(point)malloc(len);//新建一个结点
	i++;
 scanf("%d%d",&p1->xi,&p1->zhi);
  }
   free(p1); // 对于num=0的结点,未加入链表,应删除其空间
   p2->next=NULL; //输入结束,表尾结点的下一个结点为空 ,封尾 
   return (head); 
}

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 Compare(int x1,int x2)//比较大小
{
	if(x1>x2)
	return 1;
	else if(x1<x2)
	return -1;
	else
	return 0;
}

void Attach(int Xi,int Zhi,point *prear)//将元素添加到结果链表中
{  //入队操作 本函数中需要改变当前结果表达式尾项指针的值,所以函数传递进来的是结点指针的地址,*prear 指向尾项
	point p;
	p=(point)malloc(len);//申请新结点
	p->xi=Xi;//对新结点赋值
	p->zhi=Zhi;
	p->next=NULL;
	(*prear)->next=p;//  将P 指向的新结点插入到当前结果表达式尾项的后面 
	*prear=p;//修改pRear 值
}


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; 
}


int main()
{   point p1,p2,p;
    p1=create();
    p2=create();
	printf("进行相加操作\n");
	p=Add(p1,p2);
	print(p);
	return 0;
	
	
}

猜你喜欢

转载自blog.csdn.net/weixin_43913556/article/details/87095354