C语言一元多项式相加

链式

#include <stdio.h>
#include <stdlib.h>
#include"conio.h"
typedef int ElemType;
typedef int Status;
#define OK 1
#define OVERFLOW -1
#define TRUE 1
#define FAUSE 0
#define ERROR 0

typedef struct Node
{
	float coef;//系数
	int expn;//指数
	struct Node *next;
}LPolyn, *LinkPolyn;

Status InitPolyn(LinkPolyn *P)//初始化
{
	LPolyn *p;
	p=(LinkPolyn)malloc(sizeof(LPolyn));
	if(!p)
		return ERROR;	
	*P=p;
	(*P)->next=NULL;
	return OK;
}

Status CreatPolyn(LinkPolyn P,int n)
{
	LPolyn *q,*p;
	int i,e;
	float c;
	p=P;
	for(i=0;i<n;i++)
	{
	
		q=(LPolyn *)malloc(sizeof(LPolyn));
		printf("input NO %d 's coef expn:",i+1);
		scanf("%f%d",&c,&e);
		q->coef=c;
		q->expn=e;
		if(c==0)
			continue;
		q->next=p->next;
		p->next=q;
		p=q;
	}
	return OK;
}	
Status DestoyPolyn(LinkPolyn *P)
{
	LPolyn *p,*q;
	p=*P;
	while(p!=NULL)
	{
		q=p->next;
		free(p);
		p=q;
	}
	*P=NULL;
	return OK;
}

void PrintPolyn(LinkPolyn P)
{
	
	LPolyn *q;
	if(!P->next)
	{
		printf("there is no terms!\n");
		return ;
	}
	q=P->next;
	
	while(q->next)
	{
		//printf("<%.2f,%d>, ",q->coef,q->expn);
		if(q->next->coef>0)
		printf("%.2fx^%d+",q->coef,q->expn);
		else
			printf("%.2fx^%d",q->coef,q->expn);
		q=q->next;
	}
	if(q->coef>0)
		printf("%.2fx^%d",q->coef,q->expn);
	else
		printf("%.2fx^%d",q->coef,q->expn);
	printf("\n");
}


int PoynLength(LinkPolyn P)
{
	int i=0;
	LPolyn *q;
	if(!P)
	{
		return 0;
	}
	q=P->next;
	while(q)
	{
		q=q->next;
		i++;
	}
	return i;
}


Status AddPolyn(LinkPolyn Pa,LinkPolyn Pb,LinkPolyn Pc)
{
	LPolyn *a,*b;	
	a=Pa->next;
	b=Pb->next;
	while(a&&b)
	{
		
		if(a->expn<b->expn)	
			{
				Pc->next = a;
				a=a->next;
				Pc= Pc->next;
				Pc->next = NULL;
			}
		
		else if(a->expn>b->expn)	
			{
				Pc->next = b;
				b=b->next;
				Pc= Pc->next;
				Pc->next = NULL;
			}		
		else
			{
				float x=(a->coef)+(b->coef);				
				if(x!=0)
				{
					Pc->next = b;
					b=b->next;
					Pc->next->coef=x;
					Pc = Pc->next;
					Pc->next = NULL;
				}
				else
				{
					b = b->next;
				}
				a=a->next;
			
				
					
			}
		
	

	}
	if(b!=NULL)
	{
		Pc->next=b;		
	}
	if(a!=NULL)
	{
		Pc->next=a;		
	}	
	return OK;
}

void main()
{
	
	LinkPolyn P;
	int choice=1;
	if(InitPolyn(&P)==OK)
		printf("Successful\n");
	else
		printf("Failure\n");
	while(choice!=0)
	{
		system("cls");
		printf("\n  1.CreatPolyn  2.DestoyPolyn  3.PrintPolyn \n");
		printf("\n  4.PoynLength  5.AddPolyn  \n");	
		printf("\n  0.Exit\n");
		printf("\nPlease input your choice:\n");
        scanf("%d",&choice);
		switch(choice)
		{
		case 0:
			printf("Nice to meet you!\n");
			break;
		case 1:
			{
				int n;
				printf("input n:");
				scanf("%d",&n);
				if(CreatPolyn(P,n)==OK)
					printf("successful!\n");
				else
					printf("failure!\n");

			}
			break;
		case 2:
			{
				if(DestoyPolyn(&P)==OK)
					printf("successful\n");
				else
					printf("failure!\n");
			}
		
			break;
		case 3:
			{
				PrintPolyn(P);
			}
			break;	
		case 4:
			{				
				printf("The polynomial has %d terms!\n",PoynLength(P));				
			}
			break;
		case 5:
			{
				LinkPolyn Pa,Pb,Pc;
				int n;
				InitPolyn(&Pc);	
				InitPolyn(&Pa);	
				printf("input  Pa's terms ");
				scanf("%d",&n);
				CreatPolyn(Pa,n);
				InitPolyn(&Pb);				
				printf("input  Pb's terms ");
				scanf("%d",&n);
				CreatPolyn(Pb,n);
				AddPolyn(Pa,Pb,Pc);
				PrintPolyn(Pc);
			

			}
			break;

		}
		getch();

	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值