数据结构与算法----数学应用之一元多项式
PS:上一篇说了线性表的顺序表和链式表表达,该片就写一下应用到现实数学中去,一元多项式的加减。
一元多项式我们在本子上可以说是手到拈来,但是在电脑上用语言敲出来,估计这会让很多人头疼,比如下面的多项式
y1 = 9x^1 + 4x^3 + 6x^4
y2 = 2x^3 + 4x^4 + 3x^7 + 3x^8
yz = y1 + y2 ;
效果图
思路:
- 创建一个结构体,里面只存连个数,一个是系数data,一个是次幂,至于x就不用存了,只在打印的时候写上就OK了,
- 然后写插入操作,注意一定要是有序的,方便在后期相加
- 两个多项式相加就是合并,我们可以按照顺序两两比较,先拿y1的第一个数和y2第一个比较,如果y1>y2,则把y2添加到yz,相反之,如果y1=y2则相加系数,按照y1(也可y2)加入yz,等全都比较过后,如果y1(y2)还有项的话,就把剩下的全都加载到yz中,其实就是直接把next指向y1(y2)即可。
1:结构体
定义一个结构体类型
在SlinkOnez调用变量是,都是
L->data;L->next;的形式
typedef struct SlinkOne { int data; int cimi; struct SlinkOne *next; } SlinkOne, *SlinkOnez;
2:初始化
/**c * 初始化 * */ SlinkOnez initLink() { SlinkOnez L = (SlinkOnez) malloc(sizeof(SlinkOne)); if (!L) { exit(-1); } L->next = NULL; return L; }
3:插入操作
/** * 插入 * */ int insertLink(SlinkOnez &L, int pos, int e, int cimi) { SlinkOnez p = L; int i = 0; while (p && i < pos-1) { p = p->next; i++; } if (!p || i > pos-1) { printf("单链表未被创建\n"); return -1; } //创建一个新的结点,并赋值 SlinkOnez s = (SlinkOnez) malloc(sizeof(SlinkOne)); s->data = e; s->cimi = cimi; s->next = p->next; p->next = s; printf("插入成功\n"); return 0; }
4:打印全部数据
注意:我在这里面加入了几个判断,一个是当p->next ==NULL时,后面的加号就不要了,如果次幂==0的话那就只打印系数,当然如果系数==0,那就不打印,下方并未给出。
/** * 打印全部数据 * */ void printL(SlinkOnez L) { SlinkOnez p = L->next; if (!p) { printf("单链表不成立或者为NULL"); return; } while (p) { if (p->next == NULL) { printf("%dX^%d", p->data, p->cimi); } else { if (p->cimi == 0) { printf("%d + ", p->data); } else { printf("%dX^%d + ", p->data, p->cimi); } } p = p->next; } printf("\n"); }
5:合并(重点)
注意:pz = p1;//往下走一个,这句话其实就相当于 pz = pz->next;
下面的全部代码实现都是在我上面说的思路上一一对应的,只要有思路,问题就已经解决了一半了,
/** * 合并 * */ SlinkOnez mergeLink(SlinkOnez &Lz, SlinkOnez &L1, SlinkOnez &L2) { Lz->next=NULL; SlinkOnez pz = Lz; SlinkOnez p1 = L1->next; SlinkOnez p2 = L2->next; while (p1 && p2) { if (p1->cimi < p2->cimi) { pz->next = p1; pz = p1;//往下走一个 p1 = p1->next; } else if (p1->cimi > p2->cimi) { pz->next = p2; pz = p2;//往下走一个 p2 = p2->next; }else{ if(0 !=(p1->data + p2->data)){ p1->data = (p1->data+p2->data);//注意此处,重点,不能写成pz->data,否则会把当前p的值给替换掉,而不是赋值给下一个指针的值 pz->next = p1; pz = p1;//往下走一个 } p1=p1->next; p2=p2->next; } } if (p1!=NULL){ pz->next=p1; } if (p2!=NULL){ pz->next=p2; } return Lz; }
6:使用
int main() { //第一个多项式 SlinkOnez L; L = initLink(); insertLink(L, 1, 9, 1); insertLink(L, 2, 4, 3); insertLink(L, 3, 6, 4); printL(L); //第二个多项式 SlinkOnez L2; L2 = initLink(); insertLink(L2, 1, 2, 3); insertLink(L2, 2, 4, 4); insertLink(L2, 3, 3, 7); insertLink(L2, 4, 3, 8); printL(L2); //合并后多项式 SlinkOnez L3; L3=initLink(); L3=mergeLink(L3,L,L2); printL(L3); return 0; }
完
本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。