PS:上一篇說了線性表的順序表和鏈式表表達,該片就寫一下應用到現實數學中去,一元多項式的加減。spa
一元多項式咱們在本子上能夠說是手到拈來,可是在電腦上用語言敲出來,估計這會讓不少人頭疼,好比下面的多項式指針
y1 = 9x^1 + 4x^3 + 6x^4code
y2 = 2x^3 + 4x^4 + 3x^7 + 3x^8blog
yz = y1 + y2 ;ci
效果圖數學
定義一個結構體類型
在SlinkOnez調用變量是,都是
L->data;L->next;的形式it
typedef struct SlinkOne { int data; int cimi; struct SlinkOne *next; } SlinkOne, *SlinkOnez;
/**c * 初始化 * */ SlinkOnez initLink() { SlinkOnez L = (SlinkOnez) malloc(sizeof(SlinkOne)); if (!L) { exit(-1); } L->next = NULL; return L; }
/** * 插入 * */ 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; }
注意:我在這裏面加入了幾個判斷,一個是當p->next ==NULL時,後面的加號就不要了,若是次冪==0的話那就只打印係數,固然若是係數==0,那就不打印,下方並未給出。class
/** * 打印所有數據 * */ 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"); }
注意:pz = p1;//往下走一個,這句話其實就至關於 pz = pz->next;變量
下面的所有代碼實現都是在我上面說的思路上一一對應的,只要有思路,問題就已經解決了一半了,im
/** * 合併 * */ 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; }
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; }
完