일원 여러 다항식 의 사 칙 연산

#include 
#include

#define  Error  1
#define  Ok     0
typedef int Status;
typedef int ElemType;
typedef struct term{
	float coef;
	int expn;
	struct term *next;
}term,*Linklist;                            //               coef        , expn         

Linklist Ini_Polynomial ()                 //   
{
	Linklist L;
	L=(term*)malloc(sizeof(Linklist));
	L->expn=-1;
	L->next=NULL;
	if(!L)    exit(1);
	return L;
}
Status  Creat_Polynomial(Linklist L)         //    
{
	Linklist p,q;
	p=L;
	q=(term*)malloc(sizeof(Linklist));
	printf("                 n          (  ,  )(   0   )");
	scanf("%f,%d",&q->coef,&q->expn);
	while(q&&(q->coef!=0||q->expn!=0))
	{
		p->next=q;
		p=q;
		q=(term*)malloc(sizeof(Linklist));
		scanf("%f,%d",&q->coef,&q->expn);
	}
	p->next=NULL;
	if(!q) printf("       ");  return Error;
	return Ok;
}

Status GetElem_linklist(Linklist L,int i , int *e )           //      i     
{ 

	Linklist p;   int j;j=0;
	p=L->next;
	while(p&&(jnext;++j;
	}
	if (!p||(j>i)) {printf("      "); return  Error;}
	*e=p->expn;
	  return (*e);
}

int cmp(int a,int b)            //  a,b       ab) return   1;
	    }
}
Status equal(Linklist s, Linklist Lc)       //      Lc      s          
{
	Linklist p;
	p=Lc->next;
	while(p)
	{
		if(p->expn==s->expn)
		{
			return 1;
		}
		p=p->next;
	}
    return 0;

}

Status Insert_Polynomial(Linklist s,Linklist Lc)           //         lc 
{
	if(s->coef==0)  free(s);
	else
	{
		Linklist lc1;
		lc1=Lc;
		//lc2=Lc->next;
		if(lc1->next==NULL)  {lc1->next=s; lc1=lc1->next;  lc1->next=NULL;}
		else 
		{
			lc1=lc1->next;
			switch(equal(s,Lc))     //      Lc      s          
			{
			    case 0:   //    ,        
					while(s->expn>lc1->expn&&lc1->next!=NULL&&s->expn>lc1->next->expn)   
				{
					lc1=lc1->next;
				}
				s->next=lc1->next;
				lc1->next=s;
				lc1=s;  
					break;
				case 1:   //   ,         
					while(lc1->expn!=s->expn&&lc1->next!=NULL)
					{
						lc1=lc1->next;
					}
					lc1->coef=lc1->coef+s->coef; 
					break;
			}
		}
	}
	return Ok;
}

int Abs(int i)
{
	if(i<0)
	{
		i=-i;
		return i;
	}
	else 
		return i;
}
Status AddPolyn(Linklist pa,Linklist pb,Linklist pc)         //  
{
	Linklist la,lb,lc;int i,j,a,b; float sum;
	Linklist s;
	i=0;j=0;
	
	la=pa->next;lb=pb->next;lc=pc;
	while(la&&lb)
	{
		s=(term*)malloc(sizeof(Linklist));
		a=GetElem_linklist(pa,i,&a);                //            a,b
		b=GetElem_linklist(pb,j,&b);
		
		switch (cmp(a,b))     //            
		{
		case -1:     // la      lb     la       lc 
			s->coef=la->coef;
			s->expn=la->expn;
			lc->next=s;
			lc=s;
			la=la->next;
			i++;
				break;
		case 0:       // la     lb     la lb             lc 
			sum=la->coef+lb->coef;
			if(sum!=0)
			{
				s->coef=sum;
			    s->expn=la->expn;
				lc->next=s;
			    lc=s;
				la=la->next;lb=lb->next;
				i++;j++;
			}
			else{  i++;j++; }
			    break;
		case 1:             // la      lb     lb       lc 
			s->coef=lb->coef;
			s->expn=lb->expn;
			lc->next=s;
			lc=s;
			lb=lb->next;
			j++;
				break;
		}
	}
	if(!la&&lb)         // la      lb        lb         
	{
		    s=(term*)malloc(sizeof(Linklist));
		    s->coef=lb->coef;
			s->expn=lb->expn;
			lc->next=s;
			lc=s;
			lb=lb->next;
			lc->next=NULL;
	}
	else 
		if(la&&!lb)    // lb      lb        la         
		{
			s=(term*)malloc(sizeof(Linklist));
			s->coef=la->coef;
			s->expn=la->expn;
			lc->next=s;
			lc=s;
			la=la->next;
			lc->next=NULL;
		}
		else
	     return Ok;

}

Status SubtractionPolyn(Linklist pa,Linklist pb,Linklist pc)         //  
{
	Linklist la,lb,lc;int i,j,a,b; float sum;
	Linklist s;
	i=0;j=0;
	
	la=pa->next;lb=pb->next;lc=pc;
	while(la&&lb)
	{
		s=(term*)malloc(sizeof(Linklist));
		a=GetElem_linklist(pa,i,&a);
		b=GetElem_linklist(pb,j,&b);              //            a,b         
		
		switch (cmp(a,b)) 
		{
		case -1:    //  
			s->coef=la->coef;
			s->expn=la->expn;
			lc->next=s;
			lc=s;
			la=la->next;
			i++;
				break;
		case 0:
			sum=la->coef-lb->coef;
			if(sum!=0)
			{
				s->coef=sum;
			    s->expn=la->expn;
				lc->next=s;
			    lc=s;
				la=la->next;lb=lb->next;
				i++;j++;
			}
			else{  i++;j++; }
			    break;
		case 1:
			s->coef=-lb->coef;
			s->expn=lb->expn;
			lc->next=s;
			lc=s;
			lb=lb->next;
			j++;
				break;
		}
	}
	if(!la&&lb)
	{
		    s=(term*)malloc(sizeof(Linklist));
		    s->coef=-lb->coef;
			s->expn=lb->expn;
			lc->next=s;
			lc=s;
			lb=lb->next;
			lc->next=NULL;
	}
	else 
		if(la&&!lb)
		{
			s=(term*)malloc(sizeof(Linklist));
			s->coef=la->coef;
			s->expn=la->expn;
			lc->next=s;
			lc=s;
			la=la->next;
			lc->next=NULL;
		}
		else
	     return Ok;
}
Linklist MultplyPolynomial(Linklist pa ,Linklist pb,Linklist w)        //    
{
	Linklist qa;Linklist qb,y;
	qa=pa->next;qb=pb->next;
	while(qa)
	{
		while(qb)                        //            qa      qb     
		{
			y=(term*)malloc(sizeof(Linklist));
			y->coef=qa->coef*qb->coef;
			y->expn=qa->expn+qb->expn;     //y qa*qb     
			Insert_Polynomial(y,w);    //        w 
			qb=qb->next;
		}
		qa=qa->next;
		qb=pb->next;
	}
	return w;
}
Linklist DivisionPolynomial(Linklist pa ,Linklist pb,Linklist w)        //    
{
	Linklist qa;Linklist qb,y;
	qa=pa->next;qb=pb->next;
	while(qa)
	{
		while(qb)
		{
			y=(term*)malloc(sizeof(Linklist));
			y->coef=qa->coef/qb->coef;
			y->expn=qa->expn-qb->expn;
			Insert_Polynomial(y,w);
			qb=qb->next;
		}
		qa=qa->next;
		qb=pb->next;
	}
	return w;
}
void Start()
{
	printf("***************************************
"); printf("****** *******
"); printf("*********0. **************
"); printf("*********1. ****************
"); printf("*********2. ****************
"); printf("*********3. ****************
"); printf("*********4. ****************
"); } void print(Linklist L) { Linklist p; p=L->next; printf("y="); while(p!=NULL) { if(p->coef!=0) { if(p->expn==1) { if(p->coef==1) { printf("X"); } else if(p->coef==-1) { printf("-x"); } else printf("%.1fX",p->coef); if(p->next!=NULL) { if(p->next->coef<0) printf(""); else printf("+"); } } else if(p->expn==0) { printf("%.1f",p->coef); if(p->next!=NULL) { if(p->next->coef<0) printf(""); else printf("+"); } } else { if(p->coef==1) { printf("X^%d",p->expn); } else if(p->coef==-1) { printf("-X^%d",p->expn); } else printf("%.1fX^%d",p->coef,p->expn); if(p->next!=NULL) { if(p->next->coef<0) printf(""); else printf("+"); } } } p=p->next; } printf("
"); printf("
"); } void Choose(Linklist pa,Linklist pb,Linklist pc,int i) { Linklist p1,p2,p3,p4; p1=p2=p3=p4=pc; switch(i) { case 1: // AddPolyn(pa,pb,p1); printf(" :
"); print(pc); break; case 2: // SubtractionPolyn(pa,pb,p2); printf(" :
"); print(pc); break; case 3: // MultplyPolynomial(pa,pb,p3); printf(" :
"); print(pc); break; case 4: // DivisionPolynomial(pa,pb,p4); printf(" :
"); print(pc); break; } } void main() { int i;Linklist pa,pb,pc; Start(); printf(" "); scanf("%d",&i); while(i!=0) { pc=Ini_Polynomial(); pa=Ini_Polynomial(); Creat_Polynomial(pa); printf(" :
"); print(pa); pb=Ini_Polynomial(); Creat_Polynomial(pb); printf(" :
"); print(pb); Choose(pa,pb,pc,i); Start(); printf(" "); scanf("%d",&i); } if(i==0) { printf(" !!!( )"); } getchar(); getchar(); }

    이 일원 n 차 다항식 의 사 칙 연산 은 구상 조사 자료 에서 최종 실현 까지 일주일 차이 가 나 지 않 았 을 것 이다. 왜냐하면 당시 반 에서 몇 사람 이 하지 않 았 기 때문이다.    그 당시 에 만 들 었 을 때 첫 번 째 로 바로 이 즐거움 을 나 눈 것 은 제 여자친 구 였 습 니 다. 비록 그녀 는 잘 모 르 겠 지만 그녀 와 나 눈 후에 저 는 더욱 기 뻤 습 니 다. 항상 제 가 그녀 에 게 좋 은 미래 를 줄 수 있 는 것 과 한 걸음 가 까 워 졌 다 는 것 을 느 꼈 습 니 다. 그러나 시간 이 덧 없 이 흘러 그 순간 부터 반년 이 넘 지 않 았 습 니 다. 이미 사물 이 옳 고 그 름 이 생 겼 습 니 다. 제자리 에 남 은 것 은 저 혼자 일 뿐 입 니 다.     사실 이 프로그램 은 많은 알고리즘 이 없다. 바로 다항식 중의 모든 항목 의 상수 항 과 지 수 를 링크 에 간단하게 저장 한 다음 에 연산 에서 연산 원리 에 따라 가감 곱 하기, 마지막 으로 새로운 링크 가 존재 하고 정렬 하 는 것 이다.     그 중에서 이 프로그램의 등장 형식 과 곱셈 알고리즘 은 인터넷 에 있 는 한 친구 의 과정 디자인 을 참고 한 것 이다.

좋은 웹페이지 즐겨찾기