实验项目3-4:一元多项式的乘法与加法运算
2016-07-22 21:09
453 查看
设计函数分别求两个一元多项式的乘积与和。
输入格式说明:
输入分2行。每行分别先给出多项式非零项的个数。再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式说明:
输出分2行。分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。
数字间以空格分隔,但结尾不能有多余空格。
例子输入与输出:
输入格式说明:
输入分2行。每行分别先给出多项式非零项的个数。再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式说明:
输出分2行。分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。
数字间以空格分隔,但结尾不能有多余空格。
例子输入与输出:
#include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct node{ int cofi; int index; struct node *next; }list; list * create() { list *p,*r,*q; int a[MAX],N,i; scanf("%d",&N); p=(list *)malloc(sizeof(list)); p->next=NULL; q=p; for(i=0;i<2*N;i=i+2) scanf("%d %d",&a[i],&a[i+1]); for(i=0;i<2*N;i=i+2) { r=(list *)malloc(sizeof(list)); r->cofi=a[i]; r->index=a[i+1]; r->next=NULL; q->next=r; q=r; } return p; } list *add(list* l1,list *l2) { list * q1,*q2,*p,*q,* r; q1=l1->next; q2=l2->next; p=(list *)malloc(sizeof(list)); p->next=NULL; q=p; while(q1!=NULL||q2!=NULL) { if(q1!=NULL&&q2!=NULL) //两者都不为空 { if(q1->index>q2->index) { r=(list *)malloc(sizeof(list)); r->cofi=q1->cofi; r->index=q1->index; r->next=NULL; q->next=r; q=r; q1=q1->next; } else if(q1->index<q2->index) { r=(list *)malloc(sizeof(list)); r->cofi=q2->cofi; r->index=q2->index; r->next=NULL; q->next=r; q=r; q2=q2->next; } else { if((q1->cofi+q2->cofi)!=0) { r=(list *)malloc(sizeof(list)); r->cofi=q1->cofi+q2->cofi; r->index=q1->index; r->next=NULL; q->next=r; q=r; q1=q1->next; q2=q2->next; } else //系数为0,跳过 { q1=q1->next; q2=q2->next; } } } else if(q1!=NULL&&q2==NULL)// 其中q2为空 { r=(list *)malloc(sizeof(list)); r->cofi=q1->cofi; r->index=q1->index; r->next=NULL; q->next=r; q=r; q1=q1->next; } else // 其中q1为空 { r=(list *)malloc(sizeof(list)); r->cofi=q2->cofi; r->index=q2->index; r->next=NULL; q->next=r; q=r; q2=q2->next; } } return p; } list *insert(list *l1,list *l2)//将l2插入l1中,返回l1 { list * q1,*q2,* r; int flag; for(q2=l2->next;q2!=NULL;q2=q2->next) { flag=1; q1=(list *)malloc(sizeof(list)); q1=l1; while(q1->next!=NULL) { if(q2->index>q1->next->index) { r=(list *)malloc(sizeof(list)); r->cofi=q2->cofi; r->index=q2->index; r->next=q1->next; q1->next=r; flag=0; break; //插入后退出,继续插下一个 } else if(q2->index==q1->next->index) { if((q1->next->cofi+q2->cofi)!=0) { q1->next->cofi=q1->next->cofi+q2->cofi; flag=0; break; } else { r=(list *)malloc(sizeof(list)); r=q1->next; q1->next=r->next; free(r); flag=0; break; } } else q1=q1->next;//比当前指数小,和下一个比较 } if(flag==1)//flag是标志位,如果flag=1,表示没执行插入,插在l1末尾 { r=(list *)malloc(sizeof(list)); r->cofi=q2->cofi; r->index=q2->index; r->next=q1->next; q1->next=r; } } return l1; } list *multiply(list *l1,list *l2) { list * q1,*q2,*p,*q,*r,*l3; l3=(list *)malloc(sizeof(list)); l3->next=NULL; for(q1=l1->next;q1!=NULL;q1=q1->next) { p=(list *)malloc(sizeof(list)); p->next=NULL; q=p; for(q2=l2->next;q2!=NULL;q2=q2->next) { r=(list *)malloc(sizeof(list)); r->cofi=q1->cofi*q2->cofi; r->index=q1->index+q2->index; r->next=NULL; q->next=r; q=r; } l3=insert(l3,p); } return l3; } void print(list *l) { list *p; p=l->next; //如果p为空,输出两个零,并返回 if(p==NULL) { printf("0 0\n"); return; } while(p->next!=NULL) { printf("%d %d ",p->cofi,p->index); p=p->next; } printf("%d %d\n",p->cofi,p->index); } main() { list *L1,*L2,*L3,*L4; L1=create(); L2=create(); L4=multiply(L1,L2); print(L4); L3=add(L1,L2); print(L3); }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- C#实现单链表(线性表)完整实例
- C#定义并实现单链表实例解析
- C#数据结构之单链表(LinkList)实例详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C 语言简单加减乘除运算
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总