⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 poly.cpp

📁 用线性表实现多项式计算功能
💻 CPP
字号:

#include<stdio.h>
#include<math.h>
#include<malloc.h>

#define OK 1;
#define  MYOVERFLOW -2;
#define NULL 0

typedef struct polyterm{
	int coef ;
	int exp ;
	struct polyterm *next;
}polyterm ,*Linklist;

typedef int status;

  status head(Linklist &L){//申请节点
	 L=(polyterm *)malloc(sizeof(polyterm));
	       if(!L) return MYOVERFLOW;
	       L->next=NULL;
	  return OK;
}

status creatpolyn(Linklist &L){//创建
       polyterm *p,*s;
       s=L;
	   printf("此空间可用,请按指数升序输入多项式(系数为零时结束):\n");
	   head(p);
	   scanf("%d %d",&p->coef,&p->exp);
	   while(p->coef!=0){
	   s->next=p;
	   s=s->next;
	   head(p);
	    scanf("%d %d",&p->coef,&p->exp);
	   }
	   free(p);
	   
	   return OK;

}

status showpolyn(Linklist &L){//显示
	polyterm *p;
	if (L==NULL)printf("未创建\n");
	else{
	     p=L->next;
	        if(p==NULL)printf("已清空\n");
	        else {
		        while(p->next!=NULL){
	            printf("%dX%d+",p->coef,p->exp);
	            p=p->next;
	             }
	            printf("%dX%d\n",p->coef,p->exp);
	        }
	     }
	return OK;
}

status copypolyn(Linklist La,Linklist &Lb){//复制
    	polyterm *p,*s,*m;
		
		p=La->next;s=Lb;
		while(p){
		head(m);
		m->exp=p->exp;
		m->coef=p->coef;
		p=p->next;
		s->next=m;
		s=m;
		}
		return OK;

}

status pluspolyn(Linklist La,Linklist Lb,Linklist &Lc){// 加法
	   polyterm *a,*b,*c,*p;
	  
	   a=La->next;b=Lb->next;c=Lc;
	     while(a&&b){
	        head(p);
	if(a->exp<b->exp){
	p->exp=a->exp;
	p->coef=a->coef;
	a=a->next;
	c->next=p;
	c=c->next;
	}
	else if(a->exp>b->exp){
	p->exp=b->exp;
	p->coef=b->coef;
	b=b->next;
	c->next=p;
	c=c->next;
	}
	else if(a->exp==b->exp&&a->coef+b->coef==0){
	b=b->next;
	a=a->next;
	free(p);
	}
	else{
		p->exp=b->exp;
	p->coef=a->coef+b->coef;
	a=a->next;
	b=b->next;
	c->next=p;
	c=c->next;
	}
	}
	if(a==NULL&&b!=NULL){
	c->next=b;
	}
    else {
	c->next=b;
	}
	return OK;
	}


status conpolyn(Linklist &L){//取反
		polyterm *a;a=L->next;
		while(a){
	      a->coef=-a->coef;a=a->next;
		}
		return OK;
	}



status destroypolyn(Linklist &L){//销毁
        polyterm *p,*s;
		p=L;s=L->next;
		while(s){free(p);
		p=s;s=p->next;
		}
		free(p);
		L=NULL;
		return OK;
}


status datapolyn(Linklist L){//求值
     int sum=0,x;
     polyterm *p;
     p=L->next;
     printf("请输入X值X=\n");
     scanf("%d",&x);
     while(p){
     	sum+=int (p->coef*pow(x,p->exp));
     	p=p->next;}
     printf("结果是%d\n",sum);
	
	return OK;
	}

status clearpolyn(Linklist &L){//清空
        polyterm *p,*s;
		p=L->next;s=p->next;
		while(s){free(p);
		p=s;s=p->next;
		}
		free(p);
		L->next=NULL;
		return OK;
}




 void main(){
     int a,b,c;
	 polyterm * p[10]={NULL};
	 while(1){
	 printf("0  退出\n");
	 printf("1 创建多项式\n");
	 printf("2  显示多项式\n");
	 printf("3  复制多项式\n");
	 printf("4  求和\n");
	 printf("5  求差\n");
	 printf("6  求值\n");
	 printf("7 销毁多项式\n");
	 printf("8  清空多项式\n");
	 
	 printf("请选择:\n");
	 scanf("%d",&a);
	 switch(a){
	 case 1: printf("请选择多项式创建空间,输入数字(0-9):\n");
	        while(1){
	        	 scanf("%d",&a);
	        if(p[a]==NULL){
	        	head(p[a]);
	        	break;
	        }
	         else if(p[a]->next==NULL)break;
	         else  printf("此空间不可用,请重新选择空间,请输入另一数字:\n");
	         }
             creatpolyn(p[a]);
			 break;
     case 2: printf("请选择所要打印多项式的存储空间,输入数字(0-9)。输入0打印全部多项式:\n");
	         scanf("%d",&a);
			 printf("*********************************************************\n");
             if(a==0)
             for(;a<10;a++)
             {printf("%d     ",a);	
             showpolyn(p[a]);
             }
			 else {printf("%d     ",a);
			 showpolyn(p[a]);
			 }
             printf("*********************************************************\n");
			 break;
	 case 3: printf("请选择原多项式和复制的多项式存储空间,输入两个数字(0-9):\n");
	         while (1){scanf("%d%d",&a,&b);
	         if(p[b]==NULL){
	         	head(p[b]);
	         	break;
	         }
	         else if(p[b]->next==NULL)break;
	         else  printf("此空间不可用,请重新选择空间,改变后一数字:\n"); 
	       	
	         }
             copypolyn(p[a],p[b]);
			 break; 
	 case 4: printf("请选择原多项式和相加所得多项式存储空间,输入三个数字(0-9):\n");
	         while (1){scanf("%d%d%d",&a,&b,&c);
	         if(p[c]==NULL){
	         	head(p[c]);
	         	break;
	         }
	         else if(p[c]->next==NULL)break;
	         else  printf("此空间不可用,请重新选择空间,改变最后一数字:\n"); 
	         
	         }	
             pluspolyn(p[a],p[b],p[c]);
			 break;
	 case 5: printf("请选择原多项式和相减所得多项式存储空间,输入三个数字(0-9):\n");
	         while(1){
	         	scanf("%d%d%d",&a,&b,&c);
	         if(p[c]==NULL){
	         	head(p[c]);
	         	break;
	         }
	         else if(p[c]->next==NULL)break;
	         else  printf("此空间不可用,请重新选择空间,改变最后一数字:\n"); 
	        
	         }	 
             conpolyn(p[b]);
             pluspolyn(p[a],p[b],p[c]);
             conpolyn(p[b]);
			 break;
	 case 6: printf("请选择所要计算多项式的存储空间,输入数字(0-9):\n");
	         scanf("%d",&a);
             datapolyn(p[a]);
			 break;		 
	 case 7: printf("请选择所要销毁多项式的存储空间,输入数字(0-9):\n");
	         scanf("%d",&a);
             destroypolyn(p[a]);
			 break;
	 case 8: printf("请选择所要清空多项式的存储空间,输入数字(0-9):\n");
	         scanf("%d",&a);
             clearpolyn(p[a]);
			 break;
	 case 0: goto loop;
	 }
	 }
     loop: printf("多项式计算器关闭\n");
	 
 
    
}


	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -