17、蛤蟆的数据结构笔记之十七链表实现多项式
本篇名言:“人生不是一种享乐,而是一桩十分沉重的工作。”列夫托尔斯泰。
栈的应用在上面中基本覆盖了很多,接下去我们来补充下链表在多项式实现中的例子。
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/46653857
1. 多项式
这个问题是符号多项式的处理问题,已经成为表处理中的一个经典例子。把每项表示为一个结点,该结点包括系数域、指数域和指向下一项的指针。类型申明如下:
typedefstruct
linklist
{
intcoef;//系数
intexp; //指数
struct linklist*next;
}nodelink;
2. 基本算法
从两个链表开始比较多项式的各个项,如果相同则相加,如果不相同,则备份高指数的,以此类推。
3. Main函数
主函数如下,创建两个多项式,得到如下图所示:
void main()
{
nodelink*heada,*headb,*headc;
heada=create();
printhead(heada);
headb=create();
printhead(headb);
headc=ADD(heada,headb);
printf("相加后的的链表为:\n");
printhead(headc);
}
如下图1所示:
4. 源码
#include<stdio.h>
#include<malloc.h>
typedefstruct
linklist
{
intcoef;//系数
intexp; //指数
struct linklist*next;
}nodelink;
nodelink *create()//创建单链表
{
nodelink*head,*s,*t;
intc,e;
head=(nodelink*)malloc(sizeof(nodelink));//哨兵头结点
head->next=NULL;
t=head;//始终指向单链表的尾部
printf("请输入c和e的值,当系数e等于-1为结束条件:\n");
scanf("%d%d",&c,&e);
while(e!=-1)
{
s=(nodelink*)malloc(sizeof(nodelink));
s->coef=c;
s->exp=e;
s->next=NULL;
t->next=s;
t=s;
printf("请继续输入c和e的值,当系数e等于-1为结束条件:\n");
scanf("%d%d",&c,&e);
}
returnhead;
}
void printhead(nodelink *head)//输出连表数据
{
nodelink*phead;
intpcount=1;//结点计数器
phead=head->next;//指向第一个元素结点
while(phead!=NULL)
{
printf("第%d个结点的系数和指数分别为:",pcount);
printf("%2d%4d\n",phead->coef,phead->exp);
phead=phead->next;
pcount++;
}
printf("\n");
}
nodelink *ADD(nodelink *heada,nodelink
*headb)//实现多项式相加
{
nodelink*p,*q,*prea,*preb,*temp;
intsum;
p=heada->next;//分别使p和q指向第一个元素结点
q=headb->next;
prea=heada;
free(headb);//释放headb链表的头结点
while(p!=NULL&&q!=NULL)
{
if(p->exp>q->exp)
{
prea=p;
p=p->next;
}
else if(p->exp==q->exp)
{
sum=p->coef+q->coef;
if(sum!=0)
{
p->coef=sum;
preb=q;
prea=p;
p=p->next;
q=q->next;
free(preb);
}
else//如果和为零
{
temp=p;
p=p->next;
prea->next=p;
free(temp);
preb=q;
q=q->next;
free(preb);
}
}
else //若p->exp大于q->exp
{
temp= q->next;
prea->next=q;
q->next=p;
q= temp;
}
}
if(q!=NULL)
prea->next=q;
return heada;
}
void main()
{
nodelink*heada,*headb,*headc;
heada=create();
printhead(heada);
headb=create();
printhead(headb);
headc=ADD(heada,headb);
printf("相加后的的链表为:\n");
printhead(headc);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。