题目要求
输入并建立多项式;
输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。序列按指数降序排列;
多项式A和B相加,建立多项式A+B,输出相加的多项式;
多项式A和B相减,建立多项式A-B,输出相减的多项式;
多项式A和B相乘,建立多项式A×B,输出相乘的多项式;
设计一个菜单,至少具有上述操作要求的基本功能。
功能设计
结构体设计
typedef struct polynomial//多项式的每一项结构
{
double coefficient;//系数
int index;//指数
struct polynomial *next;//连接指针
}node;
部分原代码
以下为部分重要函数代码,仅供参考.
// 创建多项式链表
struct polynomial *create()
{
node *head=NULL,*p1,*p2=NULL;
int n;//项数
int i;
count++;
printf(" 请输入多项式");
if(count==1)printf(" A ");
else printf(" B ");
printf("的 <项数>:");
scanf("%d",&n);
head = (struct polynomial*)malloc(sizeof(struct polynomial));//动态创建链表
for(i=1;i<=n;i++)
{
if((p1=(struct polynomial*)malloc(sizeof(struct polynomial)))==NULL)
{
printf("ERROR");
exit(0);
}
p1->next =NULL;
printf(" 请输入多项式");
if(count==1)printf(" A ");
else printf(" B ");
printf("的第 %d 项系数和指数:",i);
scanf("%lf",&p1->coefficient);
scanf("%d",&p1->index );
if(i==1)head->next =p1;//输入是第一项时,头节点指针指向第一项
else p2->next = p1;//连接链表
p2 = p1;
}
printf(" 多项式");
if(count==1)printf(" A = ");
else printf(" B = ");
sort(head);
display(head);
printf(" ━━━━━━━━━━━━━━━━━━━━\n");
return head;
}
// 多项式排序
void sort(struct polynomial *head)
{
node *p1,*curr,*pre,*p2;//新建链表
p1 = head->next ;//p1指针所指向的结点要逐个取出作为插入结点
head->next = NULL;//head指针带头结点,初始为空链表
while(p1 != NULL)//p1指针不为空时循环
{
curr = head->next ;
pre = head ;
//定位插入位置,退出循环时,pre指针向要插入节点的位置
while(curr != NULL && curr->index >= p1->index )
{
pre = curr ;
curr = curr->next ;
}
p2 = p1; //p2指针指向要插入结点的位置
p1 = p1->next ;//p1指针指向下一个结点
//p2指针所指结点插入pre指针所指结点后
p2->next = pre->next ;
pre->next = p2;
}
}
// 多项式加法和减法
void add_subtract(struct polynomial *head1,struct polynomial *head2)
{
node *head=NULL;//新建链表储存相加后多项式
node *p1=NULL;//中间变量
node *p2=NULL;//保留前一个结点
node *p=NULL;//第一个多项式的循环变量
node *pp=NULL;//第二个多项式的循环变量
if((head=(struct polynomial*)malloc(sizeof(struct polynomial)))==NULL){
printf("ERROR");
exit(0);
}
head->next=NULL;
for(pp=head2->next;pp!=NULL;pp=pp->next){//复制第二个多项式链表
if((p1=(struct polynomial*)malloc(sizeof(struct polynomial)))==NULL){
printf("ERROR");
exit(0);
}
p1->next=NULL;
if(count==2)p1->coefficient=pp->coefficient;//加法直接复制
if(count==3||count==4)p1->coefficient=(-1.0)*pp->coefficient;//减法取相反数
p1->index=pp->index;
if(head->next==NULL)head->next=p1;
else p2->next=p1;
p2=p1;
}
for(p=head1->next;p!=NULL;p=p->next){//循环多项式的每一项
for(pp=head->next,p2=head; pp!=NULL; ){
if(p->index == pp->index){//指数相等
pp->coefficient=p->coefficient+pp->coefficient;//系数相加
if(pp->coefficient==0){
pp=pp->next;
p2->next=pp;
}
else{
pp=pp->next;
p2=p2->next;
}
break;
}
if(pp->next==NULL){//没有相同指数项,创建添加
if((p1=(struct polynomial*)malloc(sizeof(struct polynomial)))==NULL){
printf("ERROR");
exit(0);
}
p1->next =NULL;
p1->coefficient=p->coefficient;//多余项添加到新建链表
p1->index=p->index;
p1->next=head->next;
head->next=p1;
pp=pp->next;
p2=p2->next;
break;
}
pp=pp->next;
p2=p2->next;
}
}
if(count==2)printf(" A + B = ");
if(count==3)printf(" A - B = ");
if(count==4)printf(" B - A = ");
sort(head);
display(head);
printf(" ━━━━━━━━━━━━━━━━━━━━\n");
}
// 多项式乘法
void multiplication(struct polynomial *head1,struct polynomial *head2)
{
node *head=NULL;//相乘后的多项式所有项的链表头节点
node *p1=NULL;//中间变量
node *p2=NULL;//保留前一个结点
node *p=NULL;//第一个多项式的循环变量
node *pp=NULL;//第二个多项式的循环变量
if((head=(struct polynomial*)malloc(sizeof(struct polynomial)))==NULL){
printf("ERROR");
exit(0);
}
head->next=NULL;
//两个循环建立多项式相乘后所有项的存储链表
for(p=head1->next;p!=NULL;p=p->next){
for(pp=head2->next; pp!=NULL ; pp=pp->next){
if((p1=(struct polynomial*)malloc(sizeof(struct polynomial)))==NULL){
printf("ERROR");
exit(0);
}
p1->next=NULL;
p1->coefficient=p->coefficient*pp->coefficient;//系数相乘
p1->index=p->index+pp->index;//指数相加
if(head->next==NULL)head->next=p1;//添加到新建链表
else p2->next=p1;
p2=p1;
}
}
for(p=head->next;p!=NULL;p=p->next){//合并多项式,相同指数项合并
for(pp=p->next,p2=p;pp!=NULL;pp=pp->next,p2=p2->next){
if(p->index==pp->index){
p->coefficient=p->coefficient+pp->coefficient;
pp=pp->next;
p2->next=pp;
}
}
}
if(count==5)printf(" A * B = ");
sort(head);
display(head);
printf(" ━━━━━━━━━━━━━━━━━━━━\n");
}
功能实现截图