想问一下这个代码为什么不正确,关于两个一元多项式链表相乘的问题,还有一个问题就是下面还有一个关于两个交集的问题我的代码应该怎么修改

作者:超级管理员 更新时间:2017-11-01 07:59:05 来源:未知 点击:15642
Polynomial Multiply( Polynomial a, Polynomial b ){    Polynomial s,ptr,p,c;    s=(Polynomial)malloc(
Polynomial Multiply( Polynomial a, Polynomial b )
{
    Polynomial s,ptr,p,c;
    s=(Polynomial)malloc(sizeof(struct Node*));
    s->Next=NULL;
    p=b;
    c=s;
    a=a->Next;
    b=b->Next;
    while(a!=NULL)
    {
        while(b!=NULL)
        {
           ptr=(Polynomial)malloc(sizeof(struct Node*));
           ptr->Exponent=a->Exponent+b->Exponent;
           ptr->Coefficient=a->Coefficient*b->Coefficient;
           if(s->Next==NULL)
           {
               s->Next=ptr;
               ptr->Next=NULL;
           }
           if(s->Next->Exponent>ptr->Exponent)
           {
               s=s->Next;
           }
           else if(s->Next->Exponent==ptr->Exponent)
           {
               s->Next->Exponent=s->Next->Coefficient+ptr->Coefficient;

            }
            else
            {
                ptr->Next=s->Next;
                s->Next=ptr;
                }
             b=b->Next;
             s=c;

            }
        a=a->Next;
        b=p;


    }


    return c;



}


List AddList(List L1,List L2)
{
    List p,c,temp;
    p=(List)malloc(sizeof(struct Node));
   // p->Next=NULL;
   // c=p;

    p->Next=NULL;
    c=p;
    temp=L2;
    L1=L1->Next;
    L2=L2->Next;
    while(L1||L2)
    {
        if(L1->Data==L2->Data)
        {   
            p->Next=L1;
            L1=L1->Next;
            p->Next->Next=NULL;
            p=p->Next;
            L2=temp;
            L2=L2->Next;

                }


     else
     {
        L2=L2->Next;

     }
    if(L2==NULL)
     {

        L1=L1->Next;
        L2=temp;
        L2=L2->Next;
     }
      }


        return c;


    }
*/

仅供参考:
//链表实现一元多项式的加法减法乘法
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
    float coef;   //系数
    int expn;     //指数
    struct node *next;
}
PolyNode;      //多项式节点 polynomial node
typedef PolyNode* Polynomial;
Polynomial createPolynomial() {  //创建多项式
    PolyNode *p, *q, *head = (PolyNode *)malloc(sizeof(PolyNode));   //头节点
    head->next = NULL;
    float coef;
    int expn;
    printf("输入该多项式每一项的系数和指数,每项一行,输入0 0结束!\n");
    while (scanf("%f %d", &coef, &expn) && coef) {   // 默认,按指数递减排列
        if (head->next) {
            p = head;
            while (p->next && expn < p->next->expn)
                p = p->next;
            if (p->next) {
                if (expn == p->next->expn) { //有相同指数的直接把系数加到原多项式
                    p->next->coef += coef;
                    if (p->next->coef > -0.000001 && p->next->coef < 0.000001) { //若是相加后系数为0,则舍弃该节点
                        q = p->next;
                        p->next = q->next;
                        free(q);
                    }
                } else {
                    q = (PolyNode*)malloc(sizeof(PolyNode));
                    q->coef = coef;
                    q->expn = expn;
                    q->next = p->next;
                    p->next = q;
                }
            } else {
                p->next = (PolyNode*)malloc(sizeof(PolyNode));
                p = p->next;
                p->coef = coef;
                p->expn = expn;
                p->next = NULL;
            }
        } else {
            head->next = (PolyNode*)malloc(sizeof(PolyNode));
            head->next->coef = coef;
            head->next->expn = expn;
            head->next->next = NULL;
        }
    }
    return head;
}
Polynomial multiply(Polynomial poly, float coef, int expn) {  //多项式与指定单项式相乘,该单项式为 coefx^expn
    PolyNode *p, *q, *Poly = (PolyNode*)malloc(sizeof(PolyNode));
    p = Poly;
    q = poly->next;
    while (q) {
        p->next = (PolyNode*)malloc(sizeof(PolyNode));
        p = p->next;
        p->coef = (q->coef*coef);
        p->expn = (q->expn + expn);
        q = q->next;
    }
    p->next = NULL;
    return Poly;
}
void add(Polynomial poly1, Polynomial poly2) {  //把 poly2 加到 poly1 上
    PolyNode *p, *q, *r;
    r = poly1;
    p = poly1->next;  //指向第一个节点
    q = poly2->next;
    poly2->next = NULL;
    while (p && q) {
        if (p->expn > q->expn) {
            r->next = p;
            p = p->next;
            r = r->next;
        } else if (p->expn < q->expn) {
            r->next = q;
            q = q->next;
            r = r->next;
        } else {
            PolyNode *t;
            p->coef += q->coef;
            if (!(p->coef > -0.000001 && p->coef < 0.000001)) //系数不为0
            {
                r->next = p;
                r = r->next;
                p = p->next;
            } else {
                t = p;
                p = p->next;
                free(t);
            }
            t = q;
            q = q->next;
            free(t);
        }
    }
    if (p)
        r->next = p;
    if (q)
        r->next = q;
}
Polynomial polySubtract(Polynomial poly1, Polynomial poly2) {  //多项式减法 poly1-poly2形成一个新的多项式
    //把poly2的系数取相反数,形成一个新的多项式
    Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode)); //构造头节点
    PolyNode *p, *q;
    p = poly;
    q = poly2->next;
    while (q) {
        p->next = (PolyNode*)malloc(sizeof(PolyNode));
        p = p->next;
        p->coef = -(q->coef);  //系数取反
        p->expn = q->expn;
        q = q->next;
    }
    p->next = NULL;
    add(poly, poly1);  //利用加法
    return poly;
}
Polynomial polyAdd(Polynomial poly1, Polynomial poly2) { //多项式相加 poly1+poly2形成一个新的多项式
    Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //和多项式的头节点
    poly->next = NULL;
    PolyNode *p, *q, *r;
    r = poly;
    p = poly1->next;
    q = poly2->next;
    while (p&&q) {
        if (p->expn > q->expn) {
            r->next = (PolyNode*)malloc(sizeof(PolyNode));
            r = r->next;
            r->coef = p->coef;
            r->expn = p->expn;
            p = p->next;
        } else if (p->expn < q->expn) {
            r->next = (PolyNode*)malloc(sizeof(PolyNode));
            r = r->next;
            r->coef = q->coef;
            r->expn = q->expn;
            q = q->next;
        } else {
            float m = p->coef + q->coef;
            if (!(m > -0.000001 && m < 0.000001)) {
                r->next = (PolyNode*)malloc(sizeof(PolyNode));
                r = r->next;
                r->coef = m;
                r->expn = p->expn;
            }
            q = q->next;
            p = p->next;
        }
    }
    while (p) {
        r->next = (PolyNode*)malloc(sizeof(PolyNode));
        r = r->next;
        r->coef = p->coef;
        r->expn = p->expn;
        p = p->next;
    }
    while (q) {
        r->next = (PolyNode*)malloc(sizeof(PolyNode));
        r = r->next;
        r->coef = q->coef;
        r->expn = q->expn;
        q = q->next;
    }
    r->next = NULL;
    return poly;
}
Polynomial polyMultiply(Polynomial poly1, Polynomial poly2) {  //多项式相乘
    Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //创建多项式和的头节点
    poly->next = NULL;
    PolyNode *p;
    p = poly2->next;
    while (p) {
        add(poly, multiply(poly1, p->coef, p->expn));
        p = p->next;
    }
    return poly;
}
void printPoly(Polynomial poly) {  //打印多项式
    if (poly && poly->next) {
        PolyNode *p = poly->next;  //p指向第一个节点
        while (p->next) {
            printf("%gx^%d", p->coef, p->expn);
            p = p->next;
            if (p && (p->coef > 0))
                printf("+");
        }
        if (p->expn == 0)
            printf("%g", p->coef);   //打印常数项
        else
            printf("%gx^%d", p->coef, p->expn);
        printf("\n");
    }
}
void freePoly(Polynomial poly) {  //释放内存
    if (poly && poly->next) {
        PolyNode *p, *q;
        p = poly;
        while (p) {
            q = p->next;
            free(p);
            p = q;
        }
    }
    poly = NULL;
}
int main() {
    printf("用链表实现多项式的加减法\n");
    Polynomial poly1, poly2, poly3;
    printf("创建多项式一\n");
    poly1 = createPolynomial();
    printf("多项式一:\n");
    printPoly(poly1);
    printf("创建多项式二\n");
    poly2 = createPolynomial();
    printf("多项式二:\n");
    printPoly(poly2);
    printf("两多项式相加,和为:\n");
    poly3 = polyAdd(poly1, poly2);
    printPoly(poly3);
    freePoly(poly3);
    printf("两个多项式相乘,积为:\n");
    poly3 = polyMultiply(poly1, poly2);
    printPoly(poly3);
    freePoly(poly3);
    printf("两多项式相减,差为:\n");
    poly3 = polySubtract(poly1, poly2);
    printPoly(poly3);
    freePoly(poly1);
    freePoly(poly2);
    freePoly(poly3);
    system("pause");
    return 0;
}

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define OK      1
#define ERROR   0
#define TRUE    1
#define FALSE   0

typedef int Status;
typedef int Elemtype;

typedef struct Node{
    Elemtype cof;
    Elemtype inx;
    struct Node *next;
}Node, *LinkList;

Status visit(Elemtype a, Elemtype b)
{
    printf("%d %d", a, b);

    return OK;
}

Status InitList(LinkList *L)
{
    (*L) = (LinkList)malloc(sizeof(Node));
    if (!(*L))
        return ERROR;

    (*L)->next = NULL;

    return OK;
}

/* count the length */
int ListLength(LinkList L)
{
    int i = 0;
    LinkList p;

    p = L->next;
    while (p) {
        i++;
        p = p->next;
    }

    return i;
}


/* get the data of no. i nodes, i start from 1 */
Status GetElem(LinkList L, int i, Elemtype *cof, Elemtype *inx)
{
    LinkList p;
    int j;

    p = L;
    j = 1;
    while (p && j < i) {
        p = p->next;
        j++;
    }
    if (!p)
        return ERROR;

    *cof=p->next->cof;
    *inx=p->next->inx;

    return OK;
}

Status ListInsert(LinkList *L, int i, Elemtype cof, Elemtype inx)
{
    if(i < 1 || i > ListLength(*L) + 1)
        return ERROR;

    int j;
    LinkList p, q;


    p = *L;
    j = 1;
    while (p && j < i) {
        p = p->next;
        j++;
    }
    if (!p || j > i)
        return ERROR;

    q = (LinkList)malloc(sizeof(Node));
    if (!q) {
        fprintf(stderr, "malloc error!\n");
        return ERROR;
    }
    q->cof = cof;
    q->inx = inx;

    q->next = p->next;
    p->next = q;

    return OK;
}


/*打印L中系数非零的项*/
Status ListTraverse(LinkList L)
{
    LinkList p;

    p = L->next;
    while (p) {
        if (p->cof != 0) {
            visit(p->cof, p->inx);
            printf(" ");
        }
        p = p->next;
    }
    printf("\n");

    return OK;
}

Status PlusList(LinkList *L3,LinkList L1,LinkList L2)
{
    int i, j, k;
    Elemtype cof1, inx1;
    Elemtype cof2, inx2;

    k = i = j = 1;
    while ((i <= ListLength(L1)) && (j <= ListLength(L2))) {
        GetElem(L1, i, &cof1, &inx1);
        GetElem(L2, j, &cof2, &inx2);
        if (inx1 == inx2) {
            ListInsert(L3, k++, cof1 + cof2, inx1);
            i++;
            j++;
        } else if (inx1 > inx2) {
            ListInsert(L3, k++, cof1, inx1);
            i++;
        } else {
            ListInsert(L3, k++, cof2, inx2);
            j++;
        }
    }

    return OK;
}
int main()
{
    LinkList L1, L2, L3;
    int cofn, inxn;
    int i;

    InitList(&L1);
    InitList(&L2);
    InitList(&L3);

    i = 1;
    while(scanf("%d%d", &cofn, &inxn) == 2 && inxn != -1){
        ListInsert(&L1, i++, cofn, inxn);
    }
    i = 1;
    while(scanf("%d%d", &cofn, &inxn) == 2 && cofn != -1){
        ListInsert(&L2, i++, cofn, inxn);
    }
    PlusList(&L3, L1, L2);
    ListTraverse(L3);

    return 0;
}

多项式加法,作为一个参考吧

谢谢你们的回答,本以为不会有人回复,原来这里有这么多热心的人 谢谢    谢 谢

推荐阅读

热门内容

麻烦帮看一下这些警告是什么意思

才学c语言,这是我的作业,输入3个字符,...

VS2010新建IT++工程时报错,求指

修复或重装VS2010没用,2013也试...

调用realloc函数后除了第一个其他全

#include #...

往byte数组拷贝二进制图像数据之后,数

运行到拷贝数据这段时这是读到的图像代码大...

C语言问题求助 求知道这种方式的人给解释

说清楚点吧  我这是常用算法程序集(C/...

已知两条直线和鼠标所在点,求经过鼠标所在

计算公式是有的,但是不同与我们手动计算用...

位数组问题 c和指针第5章第4道题

题目要求主函数是自定义的有两个问题:第一...

用Qt graphics view实现许

这个效果不错,关注。...

无GPU下win764+vs2013安装

在编译build_cpu_only中的M...

cppcms-1.0.5 windows

本帖最后由lovton于2017-10-...

最新内容

想问一下这个代码为什么不正确,关于两个一元多项式链表相乘的问题,还有一个问题就是下面还有一个关于两个交集的问题我的代码应该怎么修改

Polynomial Multiply( Polynomial a, Polyn...

麻烦帮看一下这些警告是什么意思

才学c语言,这是我的作业,输入3个字符,输出他们组成的三位数直接用scanf就可...

怎么让 android EditText hint 不换行

两个问题:1. 当提示文本比较多的时候,hint文本会换行,虽然EditText...

vivo X20Plus评测:有了它iPad更没市场

续航:双引擎快充着实给力 五小时测试耗电剩余52%    而续航部分vivo X...

vivo X20Plus评测:有了它iPad更没市场

性能:性能十分稳定 控热较稳    vivo X20Plus采用高通晓龙660移...

vivo X20Plus评测:有了它iPad更没市场

系统:《王者荣耀》站场 力夺游戏掌机霸主   系统方面,vivo X20搭载了基...

vivo X20Plus评测:有了它iPad更没市场

屏幕:全面屏也具备高贵血统    vivo X20Plus的全面屏尺寸为6.43...

vivo X20Plus评测:有了它iPad更没市场

拍照:美的基础上 保留清晰不失自然    拍照方面,vivo X20Plus采用...

vivo X20Plus评测:有了它iPad更没市场

棚拍:数据不会说谎 色彩还原度表现优异    照片的本质离不开分辨解析力、色彩取...

13家手机联合打call 爆款好机友电视果

    当今,手机已然成为大多数消费者除生存物质条件以外的必要精神需求。除了拥有...

雷蛇首款手机将发 8GB内存4000mAh电池

    中关村在线消息:今天有消息称,游戏外设制造商Razer(雷蛇)透露将于1...

iPhone 8 Plus双11热卖 人像模式无敌

    中关村在线消息:iPhone 8 Plus作为iPhone 7 Plus...

不惧iPhoneX畅销 京东热门手机TOP10

    中关村在线市场资讯: 近日,iPhone X开启预购后,火爆程度简直和过...

vivo X20Plus评测:有了它iPad更没市场

    【中关村在线】vivoX20Plus评测:最近小米平板在其官方网站下架,...

京东手机11.11购物节 moto z惊爆价2499

    中关村在线消息:对于用户来说,手机独特的产品特点,不仅代表着一个人的品位...

科技6点半:三星Q3利润暴涨/一加5T曝光

    科技6点半,带您快速浏览今天手机行业发生的大事,每天18点30分准时送出...

swing 判断单选框问题

    鼓动鼓动 swing  用的 windowbuilder 来进行设计的,...

关于java客户端与mqtt服务器用证书连接的问题

在网上找了很多例子,也实现了用java客户端通过证书连接mqtt服务器,但是有疑...

想了好久,还是不知道在哪出问题了,驱动包也重新下载了好几次,用户密码没问题

前台错误:type Exception reportmessage An exc...

GlassFish5部署应用报错,求大神教育

GlassFish5部署应用报错:Error occurred during d...