17、数据结构笔记之十七链表实现多项式

17、数据结构笔记之十七链表实现多项式

           “人生不是一种享乐,而是一桩十分沉重的工作。”列夫托尔斯泰。

           栈的应用在上面中基本覆盖了很多,接下去我们来补充下链表在多项式实现中的例子。

 

1.  多项式

这个问题是符号多项式的处理问题,已经成为表处理中的一个经典例子。把每项表示为一个结点,该结点包括系数域、指数域和指向下一项的指针。类型申明如下:

typedefstructlinklist

{

           intcoef;//系数

           intexp; //指数

           structlinklist*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);

}

 

4.  源码

#include<stdio.h>

#include<malloc.h>

typedefstructlinklist

{

           intcoef;//系数

           intexp; //指数

           structlinklist*next;

}nodelink;

nodelink *create()//创建单链表

{

           nodelink*head,*s,*t;

           intc,e;

           head=(nodelink*)malloc(sizeof(nodelink));//哨兵头结点

           head->next=NULL;

           t=head;//始终指向单链表的尾部

           printf("请输入ce的值,当系数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("请继续输入ce的值,当系数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;//分别使pq指向第一个元素结点

           q=headb->next;

           prea=heada;

           free(headb);//释放headb链表的头结点

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

           {

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

                     {

                                prea=p;

                                p=p->next;

                     }

                     elseif(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;

           returnheada;

}

void main()

{

           nodelink*heada,*headb,*headc;

           heada=create();

           printhead(heada);

           headb=create();

           printhead(headb);

           headc=ADD(heada,headb);

           printf("相加后的的链表为:\n");

           printhead(headc);

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值