zoukankan      html  css  js  c++  java
  • 数据结构第二次上机实验【链表实现多项式的加法和乘法】

    利用链表实现一元多项式的加法和乘法

    #define null 0
    #include "stdio.h"
    #include "stdlib.h"
    #include "math.h"
    int op;
    typedef struct
    { 
         float coef;//系数 
         int expn;//指数 
    }term;
    
    typedef struct Lnode
    {
    	term data;
    	Lnode *next;
    }*Link,*Linklist;
    
    int cmp(term a,term b)//将指数从小到大排序 
    {
    	if (a.expn==b.expn) 
    	    return 0;
    	else 
    	    return (a.expn-b.expn)/abs(a.expn-b.expn);
    }
    void Orderinsert(Linklist &L,term e,int (*comp)(term,term))//直接将输入的项数和指数放入链表(没有可以合并的项) 
    {
    	Link o,p,q;
    	q=L;
    	p=q->next;
    	while (p&&comp(p->data,e)<0)
    	{
    	    q=p;
    		p=p->next;
    	}
    	o=(Link)malloc(sizeof(Lnode));
    	o->data=e;
    	q->next=o;
    	o->next=p;
    }
    void chengfa(Linklist &L1,Linklist &L2,Linklist &L3)
    {
    	L3 = (Link)malloc(sizeof(Lnode));
        L3->next = null;
        Link S = L1->next;
        term s, e;
    	while(S)
    	{
    		s.coef=S->data.coef;
    		s.expn=S->data.expn;
    		Link Q=L2->next;
    		while(Q)
    		{
    			e.coef = s.coef * Q->data.coef;
                e.expn = s.expn + Q->data.expn;
                Orderinsert(L3,e,cmp);
                Q=Q->next;
    		}
    		S=S->next;
    	}
    }
    int LocateElem(Linklist L,term e,Link &s,Link &q,int (*comp)(term,term))//判断是否有可以合并的项 
    {
    	Link p;
    	s=L;
    	p=s->next;
    	while (p&&comp(p->data,e)!=0)
    	{
    		s=p;
    		p=p->next;
    	}
    	if(!p) 
    	{
    		s=q=null;
    		return 0;
    	}
    	else 
    	{
    		q=p;
    		return 1;
    	}
    }
    void Delnext(Linklist &L,Link s)
    {
    	Link q=s->next;
    	 s->next=q->next;
    	 free(q);
    }
    
    void Orderinsertmerge(Linklist &L,term e,int (*compara)(term,term))//将同一个多项式里相同的项合并 
    {
    	Link q,s;
    	if (LocateElem(L,e,s,q,compara))
    	{
    		q->data.coef+=e.coef;
    		if (!q->data.coef)
    		{
    		  Delnext(L,s);
    	    }
    	}
    	else	
    	    Orderinsert(L,e,compara);
    }
    
    void Creatpolyn (Linklist &p,int m)//输入多项式的系数和指数 
    {
    	 term e;
    	 int i;
    	 p=(Link)malloc(sizeof(Lnode));//给链表开拓空间 
    	 p->next=null;
    	 printf("
    请输入%d个系数和指数用空格符间隔:
    ",m);
    	 for(i=1;i<=m;i++)
     	{
    	 	scanf("%f%d",&e.coef,&e.expn);
      		Orderinsertmerge(p,e,cmp);//将输入的多项式中可以合并的项合并 
      	}
    }
    void add(Linklist &La,Linklist Lb)//合并两个多项式 
    {
    	Link qb;term b;
    	 qb=Lb->next;
    	 while(qb)
    	 {
    		 b=qb->data;
    		 Orderinsertmerge(La,b,cmp);
    		 qb=qb->next;
    	 }
    	 //销毁链表Lb
    }
    void fuzhi(Linklist &Lc,Linklist La)
    {
    	Lc=(Link)malloc(sizeof(Lnode));
    	Lc->next=null;
    	Link S=La->next;
    	term e;
    	while(S)
    	{
    		e.coef=S->data.coef;
    		e.expn=S->data.expn;
    		Orderinsertmerge(Lc,e,cmp);
    		S=S->next;
    	}
    }
    void printpolyn(Linklist p)//打印出相加后的多项式 
    {	
    	Link q;
    	q=p->next;
    	int t=0;
    	while(q)
    	{
    		if(t==0)
    		{
    			if(q->data.coef==1)
    			    printf("x^%d",q->data.expn);
    		    else if(q->data.coef==-1)
    		        printf("-x^%d",q->data.expn);
    			else if(q->data.coef>0)
    			    printf("%.2f*x^%d",q->data.coef,q->data.expn);
    			else if(q->data.coef<0)
    			    printf("%.2f*x^%d",q->data.coef,q->data.expn);
    		}
    		else
    		{
    			if(q->data.coef==1)
    			    printf("+x^%d",q->data.expn);
    		    else if(q->data.coef==-1)
    		        printf("-x^%d",q->data.expn);
    			else if(q->data.coef>0)
    			    printf("+%.2f*x^%d",q->data.coef,q->data.expn);
    			else if(q->data.coef<0)
    			    printf("%.2f*x^%d",q->data.coef,q->data.expn);
    		}
    	 	q=q->next;
    	 	t++;
    	}
    }
    int main()
    {
    	int x;
    	Linklist L1,L2,L3;
    	printf("
    请输入第一个一元多项式的项数:");
    	scanf("%d",&x);
    	Creatpolyn(L1,x);
    	printf("
    请输入第二个一元多项式的项数:");
    	scanf("%d",&x);
    	Creatpolyn(L2,x);
    	fuzhi(L3,L1);
    	add(L3,L2);
    	printf("
    相加以后的一元多项式为:
    ");
    	printpolyn(L3);
    	printf("
    相乘以后的一元多项式为:
    ");
    	chengfa(L1,L2,L3);
    	printpolyn(L3);
        return 0;
    }
    

      

  • 相关阅读:
    Winform中TextBox控件开启自动提示补全功能
    使用jsonp进行跨域访问
    sqlite不存在记录则插入数据
    【编译CEF3】编译Chromium(CEF3)源代码增加对mp3/mp4等格式支持的编译手记 完成编译,增加mp3/mp4等格式支持(3) 2018-5-21
    【编译CEF3】编译Chromium(CEF3)源代码增加对mp3/mp4等格式支持的编译手记 编译过程中所遇到的问题(2) 2018-5-20
    【编译CEF3】编译Chromium(CEF3)源代码增加对mp3/mp4等格式支持的编译手记 搭建编译环境的过程中所遇到的问题(1) 2018-5-19
    Git同步本地到Github失败
    Python基础知识总结
    Git命令
    Git仓库创建和文件提交
  • 原文地址:https://www.cnblogs.com/tonghao/p/4875975.html
Copyright © 2011-2022 走看看