单链表实现一元多项式相加
本文适合中级读者阅读 作者:郭郭 来源:vcLover.com 日期: 2008/01/31 浏览:
单链表 用一组地址任意的存储单元存放线性表中的数据元素。以元素(数据元素的映象)
+ 指针(指示后继元素存储位置)
= 结点
(表示数据元素 或 数据元素的映象)
以“结点的序列”表示线性表
称作线性链表(单链表)
单链表是一种顺序存取的结构,为找第 i 个数据元素,必须先找到第 i-1 个数据元素。
因此,查找第 i 个数据元素的基本操作为:移动指针,比较 j 和 i
可见,在链表中插入结点只需要修改指针。但同时,若要在第 i 个结点之前插入元素,修改的是第 i-1 个结点的指针。
因此,在单链表中第 i 个结点之前进行插入的基本操作为:
找到线性表中第i-1个结点,然后修改其指向后继的指针。
本文实现了一元多项式的运算。运行结果如下:
折叠 C/C++ Code
- //VC爱*好-者vclover.com
- //www.vcLover.com
- #include <iostream.h>
- #include<stdio.h>
- #include<malloc.h>
- #include<stdlib.h>
- #define LEN sizeof(node)
- //用单链表存储多项式的结点结构
- typedef struct polynode
- {
- int coef; //多项式的系数
- int exp; //指数
- struct polynode *next;
- }node;
- //指针函数,返回指针类型;用尾插法建立一元多项式的链表的函数
- node * create(void)
- {
- node *h,*r,*s;
- int c,e;
- //建立多项式的头结点,为头结点分配存储空间
- h=(node *)malloc(LEN);
- r=h; //r指针始终动态指向链表的当前表尾
- cout<<"系数: ";
- cin>>c;
- cout<<"指数: ";
- cin>>e;
- //输入系数为0时,表示多项式的输入结束
- while(c!=0)
- {
- s=(node *)malloc(LEN); /*申请新结点*/
- s->coef=c; /*申请新结点后赋值*/
- s->exp=e; /*申请新结点后赋值*/
- r->next=s; /*做尾插,插入新结点*/
- r=s; /*r始终指向单链表的表尾*/
- cout<<"系数: ";
- cin>>c;
- cout<<"指数: ";
- cin>>e;
- }
- r->next=NULL;
- return(h);
- }
- //一元多项式相加函数,用于将两个多项式相加,然后将和多项式存放在多项式polya中,并将多项式ployb删除
- void polyadd(node *polya, node *polyb)
- {
- node *p,*q,*pre,*temp;
- int sum;
- p=polya->next;/*令p和q分别指向polya和polyb多项式链表中的第一个结点*/
- q=polyb->next;
- pre=polya; /*位置指针,指向和多项式polya*/
- while(p!=NULL&&q!=NULL) /*当两个多项式均未扫描结束时,执行以下操作*/
- {
- if(p->exp<q->exp) /*若p指向的多项式指数小于q指的指数*/
- {
- pre->next=p; /*将p结点加入到和多项式中*/
- pre=pre->next;
- p=p->next;
- }
- else if(p->exp==q->exp) /*若指数相等,则相应的系数相加*/
- {
- sum=p->coef+q->coef;
- if(sum!=0)
- {
- p->coef=sum;
- pre->next=p;pre=pre->next;p=p->next;
- temp=q;q=q->next;free(temp);
- }
- else /*如果系数和为零,则删除结点p与q,并将指针指向下一个结点*/
- {
- temp=p->next;free(p);p=temp;
- temp=q->next;free(q);q=temp;
- }
- }
- else /*若p指数大于q指数*/
- {
- pre->next=q; /*p结点不动,将q结点加入到和多项式中*/
- pre=pre->next;
- q=q->next;
- }
- }
- if(p!=NULL) /*多项式A中还有剩余,则将剩余的结点加入到和多项式中*/
- pre->next=p;
- else /*否则将B的结点加入到和多项式中*/
- pre->next=q;
- }
- void print(node * p) /*输出函数,打印出一元多项式*/
- {
- while(p->next!=NULL)
- {
- p=p->next;
- cout<<p->coef<<"*x^"<<p->exp;
- if(p->next != NULL) cout<<"+";
- }
- }
- void main()
- {
- node * polya,* polyb;
- cout<<"输入第一个多项式的系数和指数,以系数为0结束:"<<endl;
- polya=create(); /*调用建立链表函数,创建多项式A*/
- print(polya);
- cout<<endl<<"输入第二个多项式的系数和指数,以系数为0结束:"<<endl;
- polyb=create();
- print(polyb);
- cout<<endl<<"相加的结果是:";
- polyadd(polya,polyb); /*调用一元多项式相加函数*/
- print(polya); /*调用输出函数,打印结果*/
- cout<<endl;
- }
上一篇:逆波兰表达式_数据结构作业 下一篇:C++求解八皇后问题_数据结构作业
相关文章
查看全部评论相关评论
What's New?
What's Hot?
Google Adsense!