链表操作——多项式加减乘
发布日期:2021-06-29 11:11:37 浏览次数:2 分类:技术文章

本文共 5437 字,大约阅读时间需要 18 分钟。

未解决问题;

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

/*    程序;多项式的加减乘;*/#include
#include
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; }}

转载地址:https://blog.csdn.net/zw1996/article/details/54631982 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:安卓布局——注册页面
下一篇:c语言基础语法三——数组

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月30日 01时22分18秒