实验报告2-多项式加法的链表设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验名称多项式加法的链表设计与实现实验方案实验成绩实验日期实验室信息系统设计与仿真室I 实验操作
实验台号班级姓名实验结果
一、实验目的
1、掌握多项式链表结构的设计;
2、掌握多项式结点的创建、插入、释放等操作;
3、编程实现多项式链表的文件读入、加法求和以及输出显示功能。
二、实验任务
设计一元多项式的加法程序,其基本功能有
①从文件中读取一元多项式;格式: 5X3+4X2+3X+2
②实现两个多项式相加;
③输出结果多项式;
运用单链表存储多项式,结果链表使用原链表空间。
三、实验设计方案
1.多项式结构体设计
思路:应包含系数项、指数项和后继指针项。
struct ploy{
int ceof; //系数
int exp; //指数
struct ploy *next;
};
typedef struct ploy Ploy;
2.自定义函数设计
(1)从文件读取多项式
思路:按照文件in.txt格式读取多项式,注意判断各种符号情况:符号位、系数、x、指数。
Ploy *input()
{
int ceof=1,exp=0,sign=1; //赋初始值: 系数为1, 指数为0, 符号为1 (正)
int c2e=0; //标记变量: 表示准备读入系数还是指数(0表示系数, 1表示指数)
char str[20],*p=str; //str用于存放读入的多项式
Ploy *pa=newnode(0,0); //创建链表头结点.
Ploy *t=pa; //队尾指针初始值为头指针
scanf("%s",str); //读入多项式到str
while(*p!='\0'){ //将多项式系数和指数写入到链表结点中
if(*p=='+' || *p=='-') //如果是符号+或-
{
if (c2e) //如果c2e为1,表示已经读入指数,可以将系数和指数插入链表结点t=insert(t,ceof,exp); //尾插法
sign= (*p=='+' ? 1 : -1); //取符号位
exp=0; //符号位读完后,接下来要读入系数和指数,赋指数系数默认值
ceof=1;
c2e=0; //表示接下来要读入系数
}
else if(*p>='0' && *p<='9' && c2e==0) //表示读入的系数
ceof=(*p-'0')*sign;
else if (*p=='X' || *p=='x'){ //表示读入的是x
c2e=1; //表示接下来要读入指数
exp=1; //指数默认值赋为1
}
else if(*p>='0' && *p<='9' && c2e==1) //表示读入的是指数
exp=*p-'0';
p++; //转移到下一个字符
}
t=insert(t,ceof,exp); //插入最后一项(系数和指数)
return pa;
}
(2)多项式加法
思路:分三种情况把多项式1和多项式2中的各项链接到和多项式中。
Ploy *add(Ploy *ha, Ploy *hb)
{
Ploy *pa,*pb,*q; //pa和pb指向多项式1和2的当前项, q表示和多项式的当前项.
pa=ha->next; //初始化pa, pb和q
pb=hb->next;
q=ha;
free(hb); //用多项式1的头结点作为和多项式的头结点,故释放多项式2的头结点hb.
while(pa!=NULL && pb!=NULL){ // 比较多项式1和多项式2两个当前项的指数if(pa->exp > pb->exp){ //多项式1的指数大
q->next=pa; // 链接到和多项式指针q的后面
q=pa; // 修改q
pa=pa->next; // 多项式1当前项后移
}
else if (pa->exp < pb->exp){ //多项式2的指数大
q->next=pb;
q=pb;
pb=pb->next;
}
else{ //多项式1和2的指数相等
int x=pa->ceof+pb->ceof; // 计算两项的系数之和
Ploy *r; //用于指示准备释放的结点
if(x) { //如果系数之和不为0
pa->ceof=x; // 修改多项式1当前项的系数项
q->next=pa; //将多项式1的当前项接到和多项式q后面
q=pa; // 修改q
pa=pa->next; //pa指针后移
r=pb; //r存放pb当前项, 准备释放该结点空间
pb=pb->next; //pb后移
free(r); //释放r
}
else{ //如果系数为0
r=pb; //准备释放pb当前项
pb=pb->next;
free(r);
r=pa; //准备释放pb当前项
pa=pa->next;
free(r);
}
}
}
if(pa==NULL && pb==NULL) //多项式1和2均为空, q的指针域赋结束标记NULL q->next=NULL;
else if(pa!=NULL) //多项式1不空, 剩余项接到q后面
q->next=pa;
else //多项式2不空, 剩余项接到q后面
q->next=pb;
return ha;
}
(3)输出和多项式
思路:注意第1项没有正符号位, 以后各项最好按符号,系数,X和指数分开显示.
void output(Ploy *p)
{
p=p->next;
if(p!=NULL) //显示第1项
printf("%dX%d",p->ceof,p->exp);
p=p->next;
while(p!=NULL){
if(p->ceof>0) //符号位
printf("+");
printf("%d",p->ceof); //系数
if(p->exp>0) //X
printf("X");
if(p->exp>1) //指数
printf("%d",p->exp);
p=p->next;
}