多项式加减法

问题描述:

设计一个一元稀疏多项式简单的加减法计算器

实现要求:

一元稀疏多项式简单计算器的基本功能是:

1)输入并建立多项式

2)输出多项式

 

3)多项式AB相加

 

4)选作:多项式AB相减,建立多项式CAB,并输出相加的结果多项式D

方法说明:

1)多项式的输入与存

用带表头点的单链表存储多项式,链表中的每个节点分别存储多项式各项的系数和指数,即每从键盘输入多项式的一对数(系数,指数),可对应建立链表的一个结点。每个节点的结构为:

2)多项式数据类型的定义

struct taganaode 

{

float coef;

int exp;

struct tagNode *next;

};

 

typedef struct tagNode Node;

typedef struct tagNode*  pNode;

 

3)主要算法

①创建两个链表,分别存放多项式1和多项式2,这两个链表中的节点是按指数降序或者升序排列的

②多项式相加或相减,下面给出多项式相加的部分实现

/*

下面的函数实现两个多项式的相加,要相加的链表分别由papb指向(其中,papb都是分配了空间的头结点)。

相加的结果直接由pa指向的链表保存,即是在pa链表中添加或删除(当系数因为相加为0的情况下)一些结点,构成结果。

这里要相加的链表中指数都是按从小到大的顺序排列好了的,是升序链表。

*/

void add_poly(Node *pa,Node *pb)

{

Node *p=pa->pNext;//链表1,将来的结果也放在此

Node *q=pb->pNext;//链表2

Node *pre=pa;

Node *u;//临时用

float x;

 

while (p!=NULL && q!=NULL)//当两个链表都不为空

{

if (p->exp<q->exp)//比较链表1跟链表2当前节点的指数大小,链表1也是存放结果的地方

{

pre=p;

p=p->pNext;//p指向要比较的下一个结点。pre指向的是结果链表的最后一个结点。

}

else if (p->exp==q->exp)//假如链表1和链表2的指数相等,就要系数相加

{

x=p->coef+q->coef;

if (x!=0)//相加后的系数不为0,有必要保留一个结点就可以了

{

p->coef=x;

pre=p;

}

else//如果相加后,系数不是0,不需要保留任何一个结点,在这里删除链表1的结点,下面删除链表2的结点

{

pre->pNext=p->pNext;//保持链表1的连续性

free(p);

}

p=pre->pNext;//p指向要比较的下一个结点

//下面的代码是进行链表2结点的删除工作,因为指数相等,仅仅需要保留一个结点就可以了

//而结果直接保存在链表1中,所以,删除链表2的结点。

u=q;

q=q->pNext;

free(u);

}

else//如果链表2的当前节点指数小,那么要把链表2的当前节点加入到结果链表中(即是链表1

{//相当于把结点插入到链表1中,用u作为临时变量,保存链表2的下一个当前节点的位置。

u=q->pNext;

q->pNext=p;

pre->pNext=q;

pre=q;

q=u;

}

 

}

if (q)//如果链表2比链表1长,那么需要把链表2多余的部分加入结果链表中。链表1比链表2长,则什么都不用做。

{

pre->pNext=q;

}

free(pb);

}

同样,设计出减法的核心代码。

③输出结果多项式

 

 

//程序源代码

#include<stdio.h>

#include<malloc.h>

#include<conio.h>

struct tagNode

{

int coef;   //系数

int exp;   //指数

struct tagNode *pNext;

};

 

typedef struct tagNode Node;

typedef struct tagNode*  pNode;

//创建链表

Node *creat()

{  

Node *head;

pNode p,pre;

int c;

int e,h=1;

head=(Node*)malloc(sizeof(Node));

head->pNext=NULL;

pre=head;

int n=10;

while(h!=0)

{

printf("输入多项式的系数和指数:\n");

for(int i=0;i<n;i++)

{

scanf("%d%d",&c,&e);

p=(Node*)malloc(sizeof(Node));

p->coef=c;

p->exp=e;

p->pNext=NULL;

pre->pNext=p;

pre=p;

if(c==0)

{

printf("\n输入结束:\n");

 

return head;

}

}

}

}

//打印链表

void print(Node *head)

{

Node *p=new Node;

p=head->pNext;

while(p!=NULL)

{

if(p->coef!=0){

printf("%dx^%d +",p->coef,p->exp);

p=p->pNext;}

    else

{

p=p->pNext;

}

}

printf("0\n");

}

void add_poly(Node *pa,Node *pb)

{

Node *p=pa->pNext; //链表1,将来的结果也放在此

Node *q=pb->pNext; //链表2

Node *pre=pa;

Node *u; //临时用

float x;

 

while (p!=NULL && q!=NULL) //当两个链表都不为空

{

if (p->exp<q->exp) //比较链表1跟链表2当前节点的指数大小,链表1也是存放结果的地方

{

pre=p;

p=p->pNext; //p指向要比较的下一个结点。pre指向的是结果链表的最后一个结点。

}

else if (p->exp==q->exp) //假如链表1和链表2的指数相等,就要系数相加

{

x=p->coef+q->coef;

if (x!=0) //相加后的系数不为0,有必要保留一个结点就可以了

{

p->coef=x;

pre=p;

}

else //如果相加后,系数不是0,不需要保留任何一个结点,在这里删除链表1的结点,下面删除链表2的结点

{

pre->pNext=p->pNext; //保持链表1的连续性

free(p);

}

p=pre->pNext; //p指向要比较的下一个结点

//下面的代码是进行链表2结点的删除工作,因为指数相等,仅仅需要保留一个结点就可以了

//而结果直接保存在链表1中,所以,删除链表2的结点。

u=q;

q=q->pNext;

free(u);

}

else//如果链表2的当前节点指数小,那么要把链表2的当前节点加入到结果链表中(即是链表1

{ //相当于把结点插入到链表1中,用u作为临时变量,保存链表2的下一个当前节点的位置。

u=q->pNext;

q->pNext=p;

pre->pNext=q;

pre=q;

q=u;

}

 

}

if (q) //如果链表2比链表1长,那么需要把链表2多余的部分加入结果链表中。链表1比链表2长,则什么都不用做。

{

pre->pNext=q;

}

free(pb);

}

void sub_poly(Node *pa,Node *pb)

{

Node *p=pa->pNext

Node *q=pb->pNext;

Node *pre=pa;

Node *u

int x;

 

while (p!=NULL && q!=NULL

{

if (p->exp<q->exp)

{

pre=p;

p=p->pNext;

}

else if (p->exp==q->exp)

{

x=p->coef-q->coef;

if(x!=0) 

 p->coef=x;

 pre=p;

}

else

{

pre->pNext=p->pNext;

free(p);

}

p=pre->pNext;

u=q;

q=q->pNext;

free(u);

}

else

{

q->coef=-q->coef;

u=q->pNext;

q->pNext=p;

pre->pNext=q;

pre=q;

q=u;

}

 

}

if (q)

{

q->coef=-q->coef;

pre->pNext=q;

}

free(pb);

};

void main()

{

Node *p1,*p2;

int n;

p1=creat();

print(p1);

p2=creat();

print(p2);

printf("您选择相加还是相减?1:相加 2:相减");

scanf("%d",&n);

switch(n)

{

case 1:

add_poly(p1,p2);

printf("相加后为a:\n");

print(p1);

case 2:

sub_poly(p1,p2);

printf("相减后为:\n");

print(p1);

}

getch();

}

 

posted @ 2012-04-21 23:33  Iiiit  阅读(934)  评论(0)    收藏  举报