链表操作——多项式加减乘

未解决问题;
加上链表的销毁的时候多项式乘法就乱码了。
总结;
1;一定记得加NULL;

/*
    程序;多项式的加减乘;
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int xishu;
    int mishu;
    struct node * next;
} Node;
void CreatPolyn(Node * s, int m);//创造一个多项式;
void PrintPolyn(const Node * s);//输出多项式
Node  AddPolyn(Node * a, Node * b);//完成多项式加法
Node SubstractPolyn(Node *a, Node *b);//完成多项式的减法
Node MultiplyPolyn(Node * a,Node *b);//完成多项式的乘法;
void DestroyPolyn(Node * s);//完成多项式的销毁
int main()
{
    int na, nb;
    Node a, b;//采用头结点法
    printf("请输入多项式a的项数\n");
    scanf("%d",&na);
    printf("请输入多项式a的系数和幂数\n");
    CreatPolyn(&a,na);
    printf("输出多项式\n");
    PrintPolyn(&a);

    printf("请输入多项式b的项数\n");
    scanf("%d",&nb);
    printf("请输入多项式b的系数和幂数\n");
    CreatPolyn(&b,nb);
    printf("输出多项式\n");
    PrintPolyn(&b);
    /*多项式加法
    Node c = AddPolyn(&a,&b);
    printf("多项式a+b的和为\n");
    PrintPolyn(&c);*/
    /*多项式减法
    Node d = SubstractPolyn(&a,&b);
    printf("多项式a-b为\n");
    PrintPolyn(&d);*/
    //多项式a*b
    Node e = MultiplyPolyn(&a,&b);
    printf("多项式a*b为\n");
    PrintPolyn(&e);
    /*
    DestroyPolyn(&a);
    printf("输出多项式\n");
    PrintPolyn(&a);*/

    return 0;
}
/*
    完成多项式的a*b;
    总是出错的原因;
        一;总是忘记指向NULL。
        二;借用进行部分乘法多项式放的链表,记得每次计算完毕之后要使得重新回到头结点。

*/
Node MultiplyPolyn(Node * a,Node *b)
{
    Node * pa, *pc2, *pc3,*pc4;
    Node c,c1;
    c.next = NULL;
    pa = a->next;
    pc3 = NULL;
    pc4 = &c1;
    pc4->next = NULL;
    while(pa!=NULL){
        pc2 = b->next;
        while(pc2 != NULL){
            pc3 = (Node*)malloc(sizeof(Node));
            pc3->mishu = pa->mishu+pc2->mishu;
            pc3->xishu = pa->xishu*pc2->xishu;
            pc4->next = pc3;
            pc4 = pc4->next;
            pc4->next = NULL;//记得移动pc4并且使得其next指向NULL;
            pc2 = pc2->next;
        }
        //PrintPolyn(&c1);
        c = AddPolyn(&c1,&c);
        //PrintPolyn(&c);
        pa = pa->next;
        //DestroyPolyn(&c1);//添加销毁就出错了,????
        pc4 = &c1;//出错的地方要记得使他重新开始;
        pc4->next = NULL;
    }
    return c;
}
/*
    完成多项式的减法;
    传入多项式ab指向头结点的指针、
    返回多项式a-b后的链表的头结点c;
    代码与加法代码几乎一致。
    注意一点的是,减法当系数为0的项则不再考虑了。

*/
Node SubstractPolyn(Node *a, Node *b)
{
    Node * pa, *pb;
    Node *pc;
    Node c;
    pc = &c;
    pa = a->next;
    pb = b->next;
    pc->next = NULL;
    while(pa != NULL && pb != NULL){
        if(pa->mishu < pb->mishu){
            pc->next = pa;
            pc = pc->next;
            pa = pa->next;
        }
        else if(pa->mishu == pb->mishu){
            pc->next = pa;
            pc->next->xishu -= pb->xishu;
            if(pc->next->xishu != 0){//若系数为0则不要
                pc = pc->next;
            }
            pa = pa->next;
            pb = pb->next;
        }
        else{
            pc->next = pb;
            pc = pc->next;
            pc->xishu = -pb->xishu;
            pb = pb->next;
        }
    }
    if(pa == NULL){
        while(pb != NULL){
            pc->next = pb;
            pc = pc->next;
            pc->xishu = -pb->xishu;
            pb = pb->next;
        }
    }
    else{
        while(pa != NULL){
            pc->next = pa;
            pa = pa->next;
            pc = pc->next;
        }
    }
    pc->next = NULL;
    return c;
}
/*
    完成多项式加法;
    传入多项式ab指向头结点的指针、
    返回多项式a+b后的链表的头结点c;
    之前出错问题;
        一;结构体指针类型Node*;与Node之间的关系。
            指针只有两种方法指向结构体,
            1;例如pc = &c;pc指针直接指向头结点。
            2;pc->next = c;pc指向的节点的下个节点是c;这个就要注意pc之前的指向;
        二;之前陷入死循环while,以为不能使用指针==NULL做条件,其实是可以的,指针指向空的时候;
        三;之前加法完成后没有输出,原因返回的是指针类型,并且返回的是pc,pc->next=NULL因此是空的,没有输出;
            解决办法;设置头结点,用pc去指向,利用pc去进行链表的创建,头结点是不变的,返回头结点即可,
                        则可以通过头结点找到整个链表的节点。
*/
Node  AddPolyn(Node * a, Node * b)// 完成多项式加法;
{

    Node * pa, *pb;
    Node *pc;
    Node c;
    pc = &c;
    pa = a->next;
    pb = b->next;
    pc->next = NULL;
    while(pa != NULL && pb != NULL){
        if(pa->mishu < pb->mishu){
            pc->next = pa;
            pc = pc->next;
            pa = pa->next;
            //printf("%d %d\n",pc->xishu,pc->mishu);
        }
        else if(pa->mishu == pb->mishu){
            pc->next = pa;
            pc = pc->next;
            pc->xishu += pb->xishu;
            pa = pa->next;
            pb = pb->next;
            //printf("%d %d\n",pc->xishu,pc->mishu);
        }
        else{
            pc->next = pb;
            pc = pc->next;
            pb = pb->next;
            //printf("%d %d\n",pc->xishu,pc->mishu);
        }
        //printf("wei\n");
    }
    if(pa == NULL){
        while(pb != NULL){
            pc->next = pb;
            pb = pb->next;
            pc = pc->next;
        }
    }
    else{
        while(pa != NULL){
            pc->next = pa;
            pa = pa->next;
            pc = pc->next;
        }
    }
    pc->next = NULL;
    return c;
}
/*
    销毁多项式链表;
    传入指向头结点的指针s;
    出错地方;
        不要去修改s,给s->next赋值也不行;
*/
void DestroyPolyn(Node * s)
{
    Node * ps, *ps1;
    ps = s->next;
    while(ps != NULL){
        ps1 = ps;
        ps = ps->next;
        free(ps1);
    }
    s->next = NULL;//指向NULL一定要记得。
}
/*
    创造一个多项式使用尾插法,
    传入指向头结点的指针和多项式项数。
*/

void CreatPolyn(Node * s, int m)
{
    Node *p,*q;
    p = (Node *)malloc(sizeof(Node));
    scanf("%d %d",&p->xishu,&p->mishu);
    p->next = NULL;
    s->next = p;
    for(int i = 1; i < m; i++){
        q = (Node *)malloc(sizeof(Node));
        scanf("%d %d",&q->xishu,&q->mishu);
        p->next = q;
        q->next = NULL;
        p = q;
    }
}
/*
    输出多项式;
    传入结构体指针
*/
void PrintPolyn(const Node * s)
{
    Node * p;
    p = s->next;
    while(p != NULL){
        printf("%d %d\n",p->xishu,p->mishu);
        p = p->next;
    }
}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值