呜啦啦,我又不懂啦(ಥ _ ಥ)


/*多项式加法与乘法(加法采用插入的方法,乘法先分别乘再相加)(*ฅ́˘ฅ̀*)/
#include<stdio.h>
#include<stdlib.h>
typedef struct polynom
{
struct polynom *prer;
int coe;
int lof;
struct polynom *next; 
}*poly,Poly;

Poly *creat(int m)
{
poly h=(Poly*)malloc(sizeof(Poly));
poly p=h;
poly s;
int i;
//p=h->next;
for(i=0;i<m;i++)
{
s=(Poly*)malloc(sizeof(Poly));
printf("coe:");
scanf("%d",&s->coe);
printf("lof:");
scanf("%d",&s->lof);
p->next=s;
s->prer=p;
p=s;
}
p->next=NULL;
return(h);
}

Poly *insert(poly h,poly p,poly x)//insert x in frount of p,behind s
{
poly s=p->prer;
s->next=x;
x->prer=s;
x->next=p;
x=p->prer;
return h;
}

Poly *add(poly h1,poly h2)//把h2往h1里插
{
Poly *insert(poly h,poly p,poly x);
Poly *insert(poly h,poly p,poly x);
poly p1;
poly p2;
p1=h1->next;
p2=h2->next;//我不知道为什么h1,h2传到这里来为什么不对了il||li (OдO`) il||li
while(p2!=NULL)
{
if(p2->lof==p1->lof)
{
p1->coe=p1->coe+p2->coe;
}
else 
if(p2->lof<p1->lof)
{
p1=p1->next;
}
else
{
h1=insert(h1,p1,p2);
}

p2=p2->next;
}
return h1;
}

Poly *multione(poly p1,poly h)//用p1乘h里的每一项
{
poly p=h->next;
while(p!=NULL)
{
p->coe=p1->coe*p->coe;
p->lof=p1->lof+p1->lof;
p=p->next;
}
return(h);
}

Poly *multi(int m,int n,poly h1,poly h2)
{
Poly *multione(poly p1,poly h);
Poly *add(poly h1,poly h2);
poly h;
poly psum=NULL;
poly p1=h1->next;
poly p2=h2->next;
while(p1!=NULL)
{
h=multione(p1,h2);
psum=add(h2,psum);
p1=p1->next;
}
return psum;
}
int main(void)
{
Poly *creat(int m);
Poly *insert(poly h,poly p,poly x);
Poly *add(poly h1,poly h2);
Poly *multione(poly p1,poly h);
Poly *multi(int m,int n,poly h1,poly h2);

int m;
int n;
poly h1,h2;
poly hadd;
poly hmul;
poly p,q;
printf("put in m:");
scanf("%d",&m);
h1=creat(m);
p=h1->next;
while(p!=NULL)
{
printf("%d,%d",p->coe,p->lof);
p=p->next;
}

printf("put in n:");
scanf("%d",&n);
h2=creat(n);
q=h2->next;
while(q!=NULL)
{
printf("%d,%d",q->coe,q->lof);
q=q->next;
}


hadd=add(h1,h2);

hmul=multi(m,n,h1,h2);
return(0);
}

7 个解决方案

#1


1.好诡异的代码,为何不统一使用poly或Poly,混合起来好乱,不是好的代码风格,提醒一点
2,第40行代码,x=p->prer;,bug,导致插入失败补丁->p-prer=x;

#2


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#3


你的insert函数有问题导致add函数的while(p2!=NULL)陷入死循环

#4


到那一步不对的原因我帮你测试了下,我到那一步h2是NULL,而你去取h2->next,故出错了
至于h2为什么是NULL,建议楼主自己单步跟踪程序运行以分析原因

#5


仅供参考:
//链表实现一元多项式的加法减法乘法
#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;
}

#6


引用 4 楼 paschen 的回复:
到那一步不对的原因我帮你测试了下,我到那一步h2是NULL,而你去取h2->next,故出错了
至于h2为什么是NULL,建议楼主自己单步跟踪程序运行以分析原因
其实h1也不对,进入函数后的值与输入的值不符

#7


引用 6 楼 haokeaiaheng 的回复:
Quote: 引用 4 楼 paschen 的回复:

到那一步不对的原因我帮你测试了下,我到那一步h2是NULL,而你去取h2->next,故出错了
至于h2为什么是NULL,建议楼主自己单步跟踪程序运行以分析原因
其实h1也不对,进入函数后的值与输入的值不符


学会调试程序,在适当的位置添加段点,然后单步运行,观察分析原因
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告