数据结构多项式运算---加法和减法单独可用,放在一起就死了--求哪位大侠路过看看,小妹不胜感激
#include<stdio.h>#include<stdlib.h>
#define OVERFLOW -1
#define ERROR 0
#define OK 1
//定义多项式链表的'结点'存储结构,每一个结点对应稀疏多项式中的一项
typedef struct LNode{ //LNode为结构体类型,为多项式结点
float coef; //多项式的系数
int expn; //多项式的指数
struct LNode *next; //指向下一个多项式结点的指针
} *Link; //定义了一个新的类型Link,该类型变量是指向多项式结点的指针
//定义'多项式链表'存储结构
typedef struct{
Link head;
Link tail; //指向多项式链表的‘头结点’、‘尾结点’的指针
int len; //多项式链表中除去头结点后的结点数,即多项式的项数
}LinkList;
typedef LinkList Polynomial; //定义一元稀疏多项式类型Polynomial
//基本操作的定义
int MakeNode(Link& p, float coef, int expn);
//生成结点
void InitList(LinkList& L);
/* 初始化一个带头节点单链表头、尾指针均指向_head, _tail头结点 */
void DestroyList(LinkList& L);
/*销毁带头节点单链表L,多项式链表使用完后,应将链表占用的内存进行释放,
释放结点内存可使用C++中的delete操作*/
void CreatPolyn(Polynomial& p, double& coef, int& expon);
/*基于用户输入的一元多项式系数向量和指数向量
vector<double>& coef, vector<int>& expon 生成一元稀疏多项式链表*/
void DestroyPolyn(Polynomial& p);
/*销毁一元稀疏多项式链表,程序结束前应调用此函数释放多项式链表内存*/
void PrintPolyn(Polynomial& p);
/*以多项式指数递减格式输出一元稀疏多项式,例如:
34X^100 + 45X^60 – 4X^2 + 3*/
/*两个一元稀疏多项式Pa、Pb相加、相减、相乘,生成和多项式链表PSum*/
void AddPolyn(Polynomial& Pa,Polynomial& Pb,Polynomial& PSum);
void SubPolyn(Polynomial& Pa,Polynomial& Pb,Polynomial& PSub);
void MultiplyPolyn(Polynomial& Pa,Polynomial& Pb,Polynomial& PMulti);
void count_P(Polynomial& P,float x);
//给一个x值求多项式的值
//基本操作的实现
int MakeNode(Link& p, float c, int e)//生成新结点,并在前后结点间建立连接//此函数出错--已解决
{
Link f;
f=(Link)malloc(sizeof(LNode));
p->next=f;//在前一个结点和后一个结点间建立连接
f->next=NULL;
f->coef=c;
f->expn=e;
p=f;
//printf("结点为%fX^%d\n",f->coef,f->expn);
return OK;
}
void InitList(LinkList& L)//初始化列表
{
LNode *p;
p=(LNode *)malloc(sizeof(LNode));//p为头结点
L.head=p;
L.tail=p;//让头指针和尾指针都指向头结点
L.len=0;
}
/* 根据用户输入的多项式的系数和指数float coef, int expn,生成多项式结点*/
//接收参数链表的首地址和结点的个数m
void CreateList_L(Polynomial &P,int m)
{
int i,b;
float a;
InitList(P);//生成头结点,并使P的头指针和尾指针都指向头结点
Link q=P.head;
printf("头结点地址为%d\n",q);
for(i=1;i<=m;i++)//依次输入m个非零项//不停输出--循环出错:此处或打印时的循环//已解决
{
printf("请输入多项式项的系数\n");
scanf("%f",&a);
printf("请输入多项式项的指数\n");
scanf("%d",&b);
MakeNode(q,a,b);
P.tail=q;
P.len++;
//printf("%f %d",a,b);
}
}
void PrintPolyn(Polynomial& q)//以多项式指数递减格式输出一元稀疏多项式,例如:
//34X^100 + 45X^60 – 4X^2 + 3
{
printf("多项式为:\n");//之后发生错误
Link r=q.head->next;//指针的值是它内部所存的地址值,并不存在内建的间接访问
Link s;
//从第二个结点开始比较,因为头结点没有数据
while(r!=NULL)//选择排序//问题:当用户输入相同的指数的项
//先让第一个与它之后所有元素比较,找到最大的,与r交换;用第二个元素与它之后所有元素比较,找到最大的,与第二个交换,如此
{
Link max=r;
Link j;
for(j=r->next;j!=NULL;j=j->next)
if(j->expn>max->expn)//如果指针j指向的结点的指数比当前的max大,则把*j的值赋给max,用于下次比较
max=j;
if(max->expn>r->expn)//检查当前的max是不是当前所比较的数中的最大值
{
static float tempCoef;
static int tempExpn;//只交换结点的数据域
tempCoef=max->coef;
tempExpn=max->expn;
max->coef=r->coef;
max->expn=r->expn;
r->coef=tempCoef;
r->expn=tempExpn;
//printf("%fX^%d",r->coef,r->expn);
}
r=r->next;
}
for(s=q.head->next;s!=NULL;s=s->next)
{
printf("%fX^%d",s->coef,s->expn);
if(s->next!=NULL) printf("+");
}
printf("\n");
}
void AddPolyn(Polynomial& Pa,Polynomial& Pb,Polynomial& PSum)//两个链表做加法
{
//定义两个‘工作’指针aPtr、bPtr,初始时分别指向Pa、Pb的头结点,
//在多项式链表相加时,指向相加的当前项。
LNode* aPtr = Pa.head->next; LNode* bPtr = Pb.head->next;
Link e,e1,e2;
InitList(PSum); //生成和多项式链表,此时该链表只有一个头结点
LNode* SPtr=PSum.head;
while( aPtr && bPtr ){
//比较Pa、Pb链表中当前项的指数;
if ( aPtr->expn > bPtr->expn ) { //if 1
//则复制一个Pa的当前结点,并将其插入到和多项式链表PSum中;
//aPtr++指向Pa中下一个结点;
MakeNode(SPtr,aPtr->coef, aPtr->expn);
e=aPtr;
aPtr=aPtr->next;
free(e);
}
else if(aPtr->expn <bPtr->expn){
MakeNode(SPtr,bPtr->coef, bPtr->expn);
e=bPtr;
bPtr=bPtr->next;
free(e);
}
else
{
MakeNode(SPtr,bPtr->coef+aPtr->coef, bPtr->expn);
e1=bPtr;
e2=aPtr;
bPtr=bPtr->next;
aPtr=aPtr->next;
free(e1);free(e2);
}
}//end while
//aptr或bPtr中剩下元素的处理
if(aPtr){
while(aPtr) {
MakeNode(SPtr,aPtr->coef, aPtr->expn);
e=aPtr;
aPtr=aPtr->next;
free(e);
}
}
else if(bPtr){
while(bPtr){
MakeNode(SPtr,aPtr->coef, aPtr->expn);
e=bPtr;
bPtr=bPtr->next;
free(e);
}
}
printf("两多项式之和为:");
Link r;
for( r=PSum.head->next;r!=NULL;r=r->next)
{
printf("%fX^%d",r->coef,r->expn);
if(r->next!=NULL) printf("+");
}
}
void SubPolyn(Polynomial& Pa,Polynomial& Pb,Polynomial& PSub)
{
//定义两个‘工作’指针aPtr、bPtr,初始时分别指向Pa、Pb的头结点,
//在多项式链表相加时,指向相加的当前项。
LNode* aPtr = Pa.head->next; LNode* bPtr = Pb.head->next;
Link e,e1,e2;
InitList(PSub); //生成和多项式链表,此时该链表只有一个头结点
LNode* SPtr=PSub.head;
while( aPtr && bPtr ){
//比较Pa、Pb链表中当前项的指数;
if ( aPtr->expn > bPtr->expn ) { //if 1
//则复制一个Pa的当前结点,并将其插入到和多项式链表PSum中;
//aPtr++指向Pa中下一个结点;
MakeNode(SPtr,aPtr->coef, aPtr->expn);
e=aPtr;
aPtr=aPtr->next;
free(e);
}
else if(aPtr->expn <bPtr->expn){
MakeNode(SPtr,bPtr->coef, bPtr->expn);
e=bPtr;
bPtr=bPtr->next;
free(e);
}
else
{
MakeNode(SPtr,bPtr->coef-aPtr->coef, bPtr->expn);
e1=bPtr;
e2=aPtr;
bPtr=bPtr->next;
aPtr=aPtr->next;
free(e1);free(e2);
}
}//end while
//aptr或bPtr中剩下元素的处理
if(aPtr){
while(aPtr) {
MakeNode(SPtr,aPtr->coef, aPtr->expn);
e=aPtr;
aPtr=aPtr->next;
free(e);
}
}
else if(bPtr){
while(bPtr){
MakeNode(SPtr,aPtr->coef, aPtr->expn);
e=bPtr;
bPtr=bPtr->next;
free(e);
}
}
printf("两多项式之和为:");
Link r;
for( r=PSub.head->next;r!=NULL;r=r->next)
{
printf("%fX^%d",r->coef,r->expn);
if(r->next!=NULL) printf("+");
}
}
void MultiplyPolyn(Polynomial& Pa,Polynomial& Pb,Polynomial& PMulti)//乘法
{
Link aPtr,bPtr;
Link e1,e2;
InitList(PMulti); //生成和多项式链表,此时该链表只有一个头结点
Link SPtr=PMulti.head;
for(aPtr = Pa.head->next;aPtr!=NULL;aPtr++){
for(bPtr = Pb.head->next;bPtr!=NULL;bPtr++)
{
MakeNode(SPtr,aPtr->coef*bPtr->coef,aPtr->expn+bPtr->expn);
e1=bPtr;free(e1);
SPtr++;
}
e2=aPtr;
free(e2);
}
printf("两多项式相乘为:");PrintPolyn(PMulti);
}
//end 基本操作
void main()
{
int m;
Polynomial a,b,p;//a、b为用户输入的多项式,p用于保存相减、相减等操作的多项式
printf("请输入链表a长度\n");//接收链表a的长度
scanf("%d",&m);
CreateList_L(a,m);//调用CreateList_L函数来建链表a
PrintPolyn(a);
printf("请输入链表b长度\n");//接收链表b的长度
scanf("%d",&m);
CreateList_L(b,m);//调用CreateList_L函数来建链表a
PrintPolyn(b);
AddPolyn(a,b,p);SubPolyn(a,b,p);MultiplyPolyn(a,b,p);
}
错误信息小妹已经放在附件里了