• 多项式的表示和运算


    多项式的表示

    多项式的关键数据:

    • 多项式项数
    • 各项系数ai及指数i

    顺序存储结构表示非零项

    链式存储结构表示非零项

    多项式的运算

    加法(减法)



    Compare函数,比较P1和P2的指数大小,P1大返回1,P2大返回-1,相等返回0

    Attach函数:将计算结果复制到结果多项式

    乘法

    法1

    法2

    程序构造

    程序框架

    读入多项式

    N为多项式的项数

    输出


    完整代码 (加法 乘法)

    #include <malloc.h>
    
    typedef struct node *pnode;
    struct node{
    	int coef;//系数 
    	int exp;//指数 
    	pnode next;
    }; 
    
    /*将一项加入链表,尾插法*/
    void attach(int c,int e,pnode *prear){
    	pnode p;
    	p=(pnode)malloc(sizeof(struct node));
    	p->coef=c;
    	p->exp=e;
    	p->next=NULL;
    	(*prear)->next=p; 
    	*prear=p;
    } 
    /*读入多项式*/
    pnode dr(){
    	pnode p,rear,t;
    	int c,e,n;
    	scanf("%d",&n);
    	p=(pnode)malloc(sizeof(struct node));
    	p->next=NULL;
    	rear=p;
    	while(n--){
    		scanf("%d%d",&c,&e);
    		attach(c,e,&rear);
    	}
    	t=p;p=p->next;free(t);//删除临时空表头节点 
    	return p;
    }
    /*相加*/
    pnode add(pnode p1,pnode p2){
    	pnode front,rear,temp;
    	int sum;
    	rear=(pnode)malloc(sizeof(struct node));
    	front=rear;
    	while(p1&&p2){
    		if(p1->exp>p2->exp){
    			attach(p1->coef,p1->exp,&rear);
    			p1=p1->next;
    		}
    		else if(p1->exp<p2->exp){
    			attach(p2->coef,p2->exp,&rear);
    			p2=p2->next;
    		}
    		else{
    			sum=p1->coef+p2->coef;
    			if(sum!=0){
    				attach(sum,p1->exp,&rear);
    			}
    			p1=p1->next;
    			p2=p2->next;
    		}
    	}
    	for(;p1;p1=p1->next) attach(p1->coef,p1->exp,&rear);
    	for(;p2;p2=p2->next) attach(p2->coef,p2->exp,&rear);
    	rear->next=NULL;
    	temp=front;
    	front=front->next;
    	free(temp);//删除临时空表头节点
    	return front;
    } 
    
    /*输出*/
    void print(pnode p){
    	int flag=0;
    	if(p==NULL){
            printf("0 0
    ");
    		return;
    	}
    	while(p){
    		if(flag==0) flag=1;
    		else printf(" ");
    		printf("%d %d",p->coef,p->exp);
    		p=p->next;
    	}
        printf("
    ");
    } 
    
    pnode mult(pnode p1,pnode p2){
    	pnode p,rear,t1,t2,t;
    	int c,e;
    	if(!p1||!p2) return NULL;
    	t1=p1;t2=p2;
    	p=(pnode)malloc(sizeof(struct node));
    	p->next=NULL;
    	rear=p;
    	while(t2){
    		attach(t1->coef*t2->coef,t1->exp+t2->exp,&rear);
    		t2=t2->next;
    	}
    	t1=t1->next;
    	while(t1){
    		t2=p2;rear=p;
    		while(t2){
    			e=t1->exp+t2->exp;
    			c=t1->coef*t2->coef;
    			while(rear->next&&rear->next->exp>e) rear=rear->next;
    			if(rear->next&&rear->next->exp==e){
    				if(rear->next->coef+c!=0){
    					rear->next->coef+=c;
    				}
    				else{
    					t=rear->next;
    					rear->next=t->next;
    					free(t);
    				}
    			}
    			else{
    				t=(pnode)malloc(sizeof(struct node));
    				t->coef=c;t->exp=e;
    				t->next=rear->next;
    				rear->next=t;
    				rear=rear->next;
    			}
    			t2=t2->next;
    		}
    		t1=t1->next;
    	}
    	t2=p;p=p->next;free(t2);
    	return p;
    } 
    
    int main(){
    	pnode p1,p2,p3,p4;
    	p1=dr();
    	p2=dr();
    	p3=add(p1,p2);
    	p4=mult(p1,p2);
    	print(p4);
    	print(p3); 
    }
    

    求导 (题目:PAT (Basic Level) Practice (中文)1010)

    #include <stdio.h>
    #include <malloc.h>
    
    typedef struct node *pnode;
    struct node{
    	int xs,zs;
    	pnode next;
    };
    pnode gz(){
    	int m=0,t1,t2;
    	char a;
    	pnode head=NULL,p,p1;
    	while(1){
    		scanf("%d",&t1);
    		scanf("%c",&a); 
    		scanf("%d",&t2);
    		scanf("%c",&a); 
    		p=(pnode)malloc(sizeof(struct node));
    		p->xs=t1;
    		p->zs=t2;
    		m++;
    		if(m==1){
    			head=p1=p;
    		}
    		else{
    			p1->next=p;
    			p1=p;
    		}
    		if(a=='
    ') break;
    	}
    	if(head!=NULL) p->next=NULL;
    	return head;
    }
    
    int main(){
    	pnode head;
    	head=gz();
    	pnode p=head;
    	int flag=0;
    	while(p){
    		if(p->xs!=0&&p->zs!=0){
    			if(flag==0){
    			printf("%d %d",p->xs*p->zs,p->zs-1);
    			flag=1;
    		}
    		else printf(" %d %d",p->xs*p->zs,p->zs-1);
    		}
    		p=p->next;
    	}
    	if(flag==0) printf("0 0");
    }
    
  • 相关阅读:
    keepalived的一些。。
    virtualbox复制了以后网卡启动不了。
    mysql安装之后需要调的参数
    mysql5.6 thread pool
    $releasever 不正确解析
    linux 被入侵后扫尾工作
    简单启动脚本编写
    tcmalloc安装
    rsyslog及loganalyzer
    nsswitch & pam
  • 原文地址:https://www.cnblogs.com/wjc6765/p/15111461.html
Copyright © 2020-2023  润新知