实验目的:
1 掌握单链表的基本工作原理;
2 实现链式存储下的两个多项式的相加。
实验步骤
1 定义链式存储的数据结构
2 完成多项式的初始化,即给多项式赋初值
3 完成多项式的输出
4 实现多项式的相加及结果输出。
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int coef;
int expn;
struct LNode *next;
}LNode,*Link;
/*生成多项式*/
void CreatPolyn(Link *p,int m)
{
Link r,s;
int i;
*p = (Link)malloc(sizeof(LNode)); //生成一个头指针p
r=*p; //r指向p的位置
for(i=0;i<m;i++) //循环生成多项式
{
s=(Link)malloc(sizeof(LNode));
printf("scanf coef and expn:\n(example:1,2)\nyour num is:");
scanf("%d,%d",&s->coef,&s->expn); //把数据存入新生成的s中
r->next=s; //头指针指向s
r=s; //r移向下一位
}
r->next=NULL;
}
/*打印多项式*/
void PrintPolyn(Link p)
{
Link s;
s=p->next; //p为头指针,s指向首元结点
while(s) //当s不为空
{
printf("%dX^%d",s->coef,s->expn);
s=s->next;
if(s!=NULL)
{
if(s->coef>=0) //为什么要多加这一行,删去不行吗??
printf("+");
}
}
printf("\n");
}
/*判断大小*/
int cmp(Link a,Link b)
{
if(a->expn<b->expn)//a<b返回-1
return -1;
else if(a->expn==b->expn)//a=b返回0
return 0;
else return 1;//a>b返回1
}
/*多项式加法*/
Link AddPolyn(Link pa,Link pb)
{
Link newp,p,q,s,pc;
float sum;
p=pa->next; //p和q分别指向pa和pb的首元结点
q=pb->next;
newp=(Link)malloc(sizeof(LNode));
pc=newp;
while (p&&q)
{
switch(cmp(p,q))
{
case -1: //当p<q时
s = (Link)malloc(sizeof(LNode));
s->coef = p->coef; //将p的系数和指数都存入新生成的s中
s->expn = p->expn;
pc->next = s; //头节点指向s首元结点
pc = s; //pc移到下一位
p = p->next; //p也移到下一位
break;
case 0: //p=q时
sum = p->coef + q->coef; //系数求和
if(sum!=0)
{
s = (Link)malloc(sizeof(LNode));
s->coef = sum; //系数放入新单元中
s->expn = p->expn; //取任意p或q的指数放入s中
pc->next = s; //前一结点指向s
pc = s; //pc后移一位
}
p = p->next; //若和为0,p和q直接后移一位
q = q->next;
break;
case 1:
s = (Link)malloc(sizeof(LNode));
s->coef = q->coef; //把q的指数和系数都放入s中
s->expn = q->expn;
pc->next = s; //前一结点pc指向s
pc = s; //pc后移一位
q = q->next; //q也后移一位
break;
}
while(p) //当q空但p后还有元素时,把p接到后面
{
s = (Link)malloc(sizeof(LNode));
s->coef = p->coef;
s->expn = p->expn;
pc->next = s;
pc = s;
p = p->next;
}
while(q) //当q空但p后还有元素时,把p接到后面
{
s = (Link)malloc(sizeof(LNode));
s->coef = q->coef;
s->expn = q->expn;
pc->next = s;
pc = s;
q = q->next;
}
pc->next = NULL;
return newp;
}
}
int main()
{
Link p1,p2;
int L1,L2;
printf("for the first f(x):how many num will you set to the f(x):");
scanf("%d",&L1);
CreatPolyn(&p1,L1);
printf("the first f(x1) is:");
PrintPolyn(p1);
printf("for the secone one:");
scanf("%d",&L2);
CreatPolyn(&p2,L2);
printf("the secone f(x2) is:");
PrintPolyn(p2);
printf("\n");
printf("the resule is:");
PrintPolyn(AddPolyn(p1,p2));
}