算法思想:
用函数void Creat(SLNode * head)创造两个多项式,存入两个循环单链表中,再利用void AddPoly(SLNode * p, SLNode * q,SLNode * L)将两个多项式相加。
模块划分:
- 头文件LinList.h中包括:循环单链表的初始化、插入、创造两个存储多项式的循环单链表、让这两个多项式相加以及输出相加后的多项式的操作。
- Main.c文件:包含一个主函数,实现对头文件中的各个函数的测试。
函数作用:
- void ListInitiate(SLNode**head):初始化循环单链表;
- int ListInsert(SLNode*head,int i,datatype x):在第i个元素前插入一个元素x;
- void Creat(SLNode*head):创建一个循环单链表,由用户从键盘上输入多项式的项数、每一项的系数和次数,(要求:从键盘上输入时系数和次数之间用空格分隔),从键盘上输入完成以后,此函数便创建了一个按降幂排序的多项式;
- AddPoly(SLNodep,SLNodeq,SLNode*L):将两个已经按降序排序的多项式相加,得到一个新的循环单链表L,L按降幂次序存储着新多项式每一项的序数和次数;
- void Display(SLNode*L):输出循环单链表的每一项,最后屏幕上便能按降幂次序输出两个多项式相加或者相减后的结果。
我们开始写代码吧!
- 头文件LinList.h
#include<stdio.h>
#include<malloc.h>
typedef struct{
int xishu;
int cishu;
}datatype;
typedef struct Node{
datatype data;
struct Node*next;
}SLNode;
void ListInitiate(SLNode**head){
*head=(SLNode*)malloc(sizeof(SLNode));
(*head)->next=*head;
}
int ListInsert(SLNode*head,int i,datatype x){
SLNode*p,*q;
int j;
p=head;
j=-1;
while(p->next!=head && j<i-1){
p=p->next;
j++;
}
if(j!=i-1){
printf("插入元素位置错误!");
return 0;
}
q=(SLNode*)malloc(sizeof(SLNode));
q->data=x;
q->next=p->next;
p->next=q;
return 1;
}
//将一元多项式按降幂次序存入循环单链表中
void Creat(SLNode*head){
int i,j,m,a,tag;
datatype x;
SLNode*p;
printf("请输入多项式的项数:");
scanf("%d",&m);
printf("请输入多项式的系数与次数:");
scanf("%d%d",&x.xishu,&x.cishu);
ListInsert(head,0,x);
for(i=1;i<m;i++){
tag=1;
printf("请输入多项式的系数与次数:");
scanf("%d%d",&x.xishu,&x.cishu);
p=head->next;
a=0;
for(j=0;j<i;j++){
if(p->data.cishu>x.cishu){
p=p->next;
a++;
}else if(p->data.cishu == x.cishu){
p->data.xishu=p->data.xishu+x.xishu;
tag=0;
break;
}
}
if(tag == 1)
ListInsert(head,a,x);
}
}
//将多项式相加
void AddPoly(SLNode*p,SLNode*q,SLNode*L){
SLNode*p1,*q1;
datatype x;
int i=0;
p1=p->next,q1=q->next;
while(p1!=p && q1!=q){
if(p1->data.cishu>q1->data.cishu){
ListInsert(L,i,p1->data);
p1=p1->next;
i++;
}
else if(q1->data.cishu>p1->data.cishu){
ListInsert(L,i,q1->data);
q1=q1->next;
i++;
}
else if(q1->data.cishu == p1->data.cishu){
x.xishu=p1->data.xishu+q1->data.xishu;
x.cishu=p1->data.cishu;
if(p1->data.xishu!=0){
ListInsert(L,i,x);
}
p1=p1->next;
q1=q1->next;
i++;
}
}
while(p1==p && q1!=q){
ListInsert(L,i,q1->data);
p1=p1->next;
i++;
}
while(p1!=p && q1==q){
ListInsert(L,i,p1->data);
q1=q1->next;
i++;
}
}
//输出合并后的多项式
void Display(SLNode*L){
SLNode*p;
p=L->next;
printf("该多项式相加后,结果为:\n");
printf("%dX^%d",p->data.xishu,p->data.cishu);
p=p->next;
while(p!=L){
if(p->data.xishu >0)
printf("+%dX^%d",p->data.xishu,p->data.cishu);
else if(p->data.xishu !=0)
printf("%dX^%d",p->data.xishu,p->data.cishu);
p=p->next;
}
}
- 文件Main.c
#include<stdio.h>
#include<stdlib.h>
#include"LinList.h"
int main(){
SLNode *p,*q,*L;
ListInitiate(&L);
ListInitiate(&p);
ListInitiate(&q);
Creat(p);
Creat(q);
AddPoly(p,q,L);
Display(L);
system("pause");
return 0;
}
代码写完了,那就试一下吧!
例如计算多项式 X5-2X2-3X+4X3+2X6 与多项式 X2-4X5+5X 的和。