利用带头结点的有序单链表(按指数有序)实现一元稀疏多项式的减法运算
#include<stdio.h>#include<malloc.h>
#include<stdlib.h>
#include<math.h>
#define MAX 10 //头指针数组的大小 //多项式的数据类型定义
typedef struct Polynomial {
float coef; //系数
int expn; //指数
struct Polynomial*next; }*Polyn,Polynomial; Polyn head[MAX+1]; //头指针数组,用来标记多项式
//创建多项式
void OrderInsert(Polyn p,Polyn h) //头结点是h,新结点p
{ //顺序插入结点
if(p->coef==0)
free(p); //若系数为0释放结点
else
{
Polyn q1,q2;
q1=h;
q2=h->next;
while(q2&&p->expn>q2->expn)
{ //查找插入位置
q1=q2;
q2=q2->next;
}
if(q2&&p->expn==q2->expn)
{ //将指数相同相合并
q2->coef+=p->coef;
free(p);
if(!q2->coef){//若系数为0释放结点
q1->next=q2->next;
free(q2);}
}
else{ //指数为新时将结点插入
p->next=q2;
q1->next=p;}}}
void CreatePolyn(Polyn p){//建立一个头指针为head[i]一元多项式
Polyn q;
q=(Polyn)malloc(sizeof(struct Polynomial));
printf(" 请输入某项的系数与指数:");
scanf("%f %d",&q->coef,&q->expn);
while(q->coef!=0)
{
OrderInsert(q,p); //调用OrderInsert函数插入结点
q=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据
printf(" 请输入某项的系数与指数:");
scanf("%f %d",&q->coef,&q->expn); }
}
void Create() { //创建函数
int i=0,n=0;
printf(" 请输入你想创建的多项式序号(1-%d):",MAX);
scanf("%d",&i); CreatePolyn(head[i]);
}
//显示多项式
void PrintPolyn(Polyn p) { //打印多项式
Polyn L; L=p; printf(" ");
if(L==NULL) { printf("NULL\n");
return; }
if(L->next==NULL) {
printf("0\n");
return;
}
while(L->next!=NULL)
{
L=L->next;
if(L->expn!=0)
printf("%fX^%d",L->coef,L->expn);
else printf("%f",L->coef);
if(L->next!=NULL&&L->next->coef>0)
printf("+");
if(L->next==NULL)
printf("\n"); }
}
void Print() { //打印函数
int i=0;
printf(" 请输入你想显示的多项式序号(1-%d):",MAX);
scanf("%d",&i);
printf(" 此多项式为:");
PrintPolyn(head[i]);
} //复制多项式
void CopyPolyn(Polyn p1,Polyn p2) { //复制多项式p1到p2
Polyn L1,L2,L;
L1=p1;
L2=p2;
while(L1->next!=NULL)
{
L1=L1->next;
L=(Polyn)malloc(sizeof(struct Polynomial));
L->coef=L1->coef;
L->expn=L1->expn;
L->next=NULL;
L2->next=L;
L2=L; }
}
void Copy() { //复制函数
int i=0;
int j=0;
printf(" 请输入被复制的多项式序号和复制到的位置序如'5,3':");
scanf("%d,%d",&i,&j);
while(head[i]->next==NULL)
{
printf(" 被复制的多项式还未被创建,请重新输入:\n");
scanf("%d",&i);
}
printf(" 被复制的多项式为:\n");
PrintPolyn(head[i]);
while(head[j]->next!=NULL)
{
printf(" 复制到的位置已存在其他多项式,请重新输入:\n");
scanf("%d",&j);
}
CopyPolyn(head[i],head[j]);
printf(" 复制后的多项式:\n");
PrintPolyn(head[j]); }//多项式求差
void SubtractPolyn(Polyn p,Polyn p1,Polyn p2) { //多项式p1减多项式p2结果存在p中
Polyn L,L1,L2,q;
L=p;
L1=p1->next;
L2=p2->next;
while(L1!=NULL||L2!=NULL) {
if(L1!=NULL&&L2!=NULL) { //按指数增长排列
q=(Polyn)malloc(sizeof(struct Polynomial));
q->next=NULL;
if(L1->expn<L2->expn)
{
q->coef=L1->coef;
q->expn=L1->expn;
L->next=q;
L=q;
L1=L1->next;
}
else if(L1->expn>L2->expn)
{
q->coef=-L2->coef;
q->expn=L2->expn;
L->next=q;
L=q;
L2=L2->next;
}
else if(L1->expn==L2->expn) { //指数相等需要判断系数差是否为零
if((L1->coef-L2->coef)!=0) {
q->coef=L1->coef-L2->coef;
q->expn=L1->expn;
L->next=q;
L=q;
}
L1=L1->next;
L2=L2->next;
} }
else
if(L1==NULL&&L2!=NULL) //若p1遍历完,直接讲另一个多项式的剩余项系数取负移至p
while(L2!=NULL)
{
q=(Polyn)malloc(sizeof(struct Polynomial));
q->next=NULL;
q->coef=-L2->coef;
q->expn=L2->expn;
L->next=q;
L=q;
L2=L2->next;
}
else
while(L1!=NULL) //若p2遍历完,直接讲另一个多项式的剩余项移至p
{
q=(Polyn)malloc(sizeof(struct Polynomial));
q->next=NULL;
q->coef=L1->coef;
q->expn=L1->expn;
L->next=q;
L=q;
L1=L1->next;}}
PrintPolyn(p);
}
void Subtract() { //求差函数
int i=0,m=0,n=0;
printf(" 请输入多项式求差后的存放位置:");
scanf("%d",&i);
while(head[i]->next!=NULL)
{
printf(" 此位置已存在另一多项式,请重新输入:");
scanf("%d",&i);
}
printf(" 请输入需要求差的两个多项式的序号(1-%d)如'4,8'(前减后):",MAX);
scanf("%d,%d",&m,&n);
SubtractPolyn(head[i],head[m],head[n]); }
void main() {
int n=1, i=0;
for(i=1;i<=MAX;i++) {
head[i]=(Polyn)malloc(sizeof(Polynomial));
head[i]->next=NULL; }
while (n!=0) {
printf("多项式求差;\n");
scanf("%d", &n);
switch(n){
case 1:
Subtract();break;}
}}
为什么写出来有些数据结果不对,求哪位大神帮忙注释一下要点,谢谢啊