一、实验原理
利用链式存储实现存储一元多项式,并计算两个一元多项式之和。一元多项式由系数和指数构成。
1、create()存储系数指数:首先建立一个头结点headLnode,从headLnode->next开始存入系数和指数,只有系数是0时,才表示这个多项式的结束,否则每次把系数和指数存入结点后,就把指针向后移动一个接着存入,直到输入的系数是0为止。返回的是一个带头结点的链表
2、Print()输出链表:只要当前指针指向的结点不是空,就把系数和指数输出,直到系数为0为止
3、Compare()比较指数大小:根据这个结果确定先插入哪个结点
4、AddLine()链表相加:先让hc=lc=ha,即相当于给hc和lc创建了一个头结点,然后以后通过比较得到的结点都插入了hc为头结点的链表中。
比较:
(1)ha为空,hb不为空,直接return(hb)
(2)ha和hb都不空,通过比较指数大小,决定插入hc的顺序
二、参考程序
#include<stdio.h>
#include<stdlib.h>
#define NULL 0
typedef struct Lnode
{
int coef; //定义系数变量
int exp; //定义指数变量
struct Lnode *next; //定义指针next变量
} Lnode,*LinkList;
/*建立多项式列表*/
LinkList create()
{
int n;
LinkList headLnode;
LinkList head;
LinkList p1,p2; //定义p1,p2指针
n=0;
printf("请输入多项式(输入的数必须是整数,指数须从小到大依次输入,系数为零表示多项式结束)\n");
p1=p2= ( LinkList)malloc(sizeof(Lnode)); /*开辟一个新单元*/
scanf("%d%d",&p1->coef,&p1->exp); /*录入多项式*/
headLnode=(LinkList)malloc(sizeof(Lnode));
if (p1->coef==0){//开始输入的就是0,创建空链表
head=NULL;
}
else
{
while(p1->coef!=0)
{ n++;
if(n==1){
head=p1;//记录第一个输入的是头结点
}
else{
p2->next=p1;//P1指向下一个结点,并输入数据
}
p2=p1;
p1=( LinkList)malloc(sizeof(Lnode));
scanf("%d%d",&p1->coef,&p1->exp);
}
p2->next=0;
headLnode->next=head;//把头结点与第一个结点相连
}
return(headLnode);
}
/* 以下是输出多项式的函数 */
void print (LinkList p)
{
LinkList p0; //定义p0指针
p0=p->next;
if(p0!=NULL){ //只要不是头结点就输出
do
{
printf("%dx的%d次幂",p0->coef,p0->exp);
p0=p0->next;
if(p0!=NULL){
printf("+");
}
}while(p0!=0);
}
else {
printf(" 空多项式!!");
}
printf("\n");
}
/*比较两个指数的大小的函数*/
int compare(int m,int n)
{
int j;
if (m<n) j=-1;
if (m==n) j=0;
if (m>n) j=1;
return(j);
}
/*两个非空多项式相加*/
LinkList AddLine(LinkList ha, LinkList hb)
{
LinkList la, lb, lc,hc; //定义三个指针la,lb,lc
int a,b,sum;
lc=hc=ha;
la=ha->next;//从头结点的下一个元素开始
lb=hb->next;
//如果ha为空,hb不为空,直接返回hb
if ((ha->next==NULL)&&(hb->next!=NULL)){
return(hb);
}
//如果ha,hb都不为空,根据指数大小,移动指针lc,形成新的链表hc
while ((la!= NULL)&&(lb!= NULL)) //当两个多项式都不为空时
{
a=la->exp; //将la的指数赋给a
b=lb->exp; //将lb的指数赋给b
switch( compare(a,b) ) /*比较当前结点指数的大小 */
{
case -1: //a<b,lc指向la
{ lc->next =la;
lc=la;
la=la->next;//la向后移
break;
}
case 0: //a=b
{
sum=la->coef+lb->coef;
if(sum!=0)//不等于0时,把sum值存入la的系数中,
{ /* 将其不为零的系数和保存 */
la->coef=sum;
lc->next=la;
lc=la;
la=la->next;
//释放掉lb,利用ha
ha=lb;
lb=lb->next;
free(ha);
}
else //两系数之和为0
{ /* 分别删除系数和为零的对应的两个结点 */
ha=la;
la=la->next;
free(ha);
ha=lb;
lb=lb->next;
free(ha);
} /* 刚开始时特殊处理头结点 */
break;
}
case 1: //a>b
{ /* 将指数小的项插入到la的前部 */
lc->next=lb;
lc=lb;
lb=lb->next;
break;
}
} /*end swtich*/
} /*end while*/
//当两个链表长度不一致时,会有一个先都插入到lc中
if (lb!= NULL ){
lc->next=lb;
}
else{
lc->next=la;
}
return(hc);
} /*end AddLine */
/*主程序*/
main()
{
LinkList la,lb,lc;
printf("请输入多项式La: ");
la=create();
printf("请输入多项式Lb: ");
lb=create();
printf("多项式La:\n");
print(la);
printf("多项式Lb:\n");
print(lb);
printf("多项式La与Lb的和是: \n");
lc=AddLine(la,lb);
print(lc);
}
/*运行结果:请输入多项式La: 请输入多项式(输入的数必须是整数,指数须从小到大依次输入,系数为零表示多项式结束)
2 1
3 2
4 5
0 9
请输入多项式Lb: 请输入多项式(输入的数必须是整数,指数须从小到大依次输入,系数为零表示多项式结束)
2 3
4 4
5 6
7 8
0 9
多项式La:
2x的1次幂+3x的2次幂+4x的5次幂
多项式Lb:
2x的3次幂+4x的4次幂+5x的6次幂+7x的8次幂
多项式La与Lb的和是:
2x的1次幂+3x的2次幂+2x的3次幂+4x的4次幂+4x的5次幂+5x的6次幂+7x的8次幂
--------------------------------
Process exited after 24.31 seconds with return value 0
请按任意键继续. . .
*/
本文介绍了如何利用链式存储结构实现一元稀疏多项式,并展示了创建、输出和计算两个一元多项式之和的详细过程。通过创建链表存储多项式,比较指数大小来确定插入顺序,最后实现相加操作。
2667

被折叠的 条评论
为什么被折叠?



