本文編程學習網主要和大家介紹C語言實現一元多項式相加運算,通過具體的代碼向大家展示,希望對大家學習C語言編程入門有所幫助。
今天寫一個關于一元多項式相加的程序,就當是在練習運用一下鏈表的知識。首先,我們先來分析一波,一元多項式相加,首先要用鏈表創建兩個或多個多項式,每個節點里的數據有兩個,系數和指數;其次,如果要實現亂冪輸入,那么還需要一個排序函數;然后就是多項式相加求和的部分,當指數相等時其系數相加,如果不相等那么就比較大小,依次存入新的鏈表;最后是輸出函數,這個部分也分了很多類型,比如:兩式相加為常數(2,4,6)、0、系數為1不顯示系數(x,x^4)、指數為1不顯示指數(x,2x)等等。
先來定義結構體變量,和單鏈表的定義結構體一樣,不同的是此時我們的數據變成了兩個:系數和指數。所以我們這樣定義:typedef struct node{//構造結構體變量
int coefficient;//定義一個結構體變量“系數”
int exponent;//定義一個結構體變量“指數”
node *next;
}node;
然后創建單鏈表來存儲第一個多項式的各項式:
node *create(){//尾插法創建單鏈表
node *head,*p,*q;
int n;//定義一個整型數據n,用來表示輸入的多項式的個數
int i = 0;//定義一個整型數據i=0,用來表示的輸入的第幾個多項式的系數或指數
head = (node*)malloc(sizeof(node));//給head分配內存空間
head->next = NULL; //先讓head為空表
q = head;//讓q等于head的頭節點
printf("你想要輸入多少個多項式的數據:");
scanf("%d",&n);
for(i = 0;i < n;i++){
p = (node*)malloc(sizeof(node));//給p分配內存空間
printf("請輸入第%d項的系數:",i+1);
scanf("%d",&p->coefficient);//輸入系數
printf("請輸入第%d項的指數:",i+1);
scanf("%d",&p->exponent);//輸入指數
p->next = q->next;
q->next = p;
q = q->next;
}
return head;
}
輸出函數,注意這個函數是將兩個多項式相加的和已經求出來了進行輸出,是把沒必要的省略(比如結果為2x^0輸出為2),大家看程序就懂了,我就不廢話了。
void print(node *head){//輸出單鏈表
node *p;
p = (node*)malloc(sizeof(node));
p = head->next;
while(p->next != NULL){//如果p的后繼節點不為空時執行下列語句
if(p->coefficient != 0 && p->exponent == 0){//系數不為0指數為0的情況(常數)
printf("%d+",p->coefficient);//所以只輸入系數
}
else if(p->coefficient == 1 && p->exponent == 1){//系數為1指數為1的情況
printf("x+");
}
else if(p->coefficient != 0 && p->exponent == 1){//系數不為0指數為1的情況(x,2x,5x……)
printf("%dx+",p->coefficient);//注意前面%d后的x
}
else if(p->coefficient == 1 && p->exponent != 0){//系數為1指數不為0的情況(x^2,x^5……)
printf("x^%d+",p->exponent);
}
else if(p->coefficient == 0){//兩個多項式相加的和為0時的情況,不輸出
printf("");
}
else if(p->coefficient != 1 && p->exponent != 0){//系數不為1指數不為0的情況(2x^3,3x^2……)
printf("%dx^%d+",p->coefficient,p->exponent);
}
p = p->next;//讓p等于它的后繼結點,繼續循環
}
if(p->exponent == 0 && p->coefficient != 0){//判斷最后一個多項式的類型 (ps:因為上述循環當中我們定義p->next!=NULL時執行,那么當p為最后一個結點時,p->next已經是空了,那么這個時候就會跳出循環,最后一個結點的數據就會不運行出來,所以我們需要另寫,如果不想寫這么多代碼的話讓它在循環內輸出也很簡單,大家可以動腦筋想一想),下列語句同上
printf("%d",p->coefficient);
}
else if(p->coefficient == 1 && p->exponent == 1){//系數為1指數為1的情況
printf("x+");
}
else if(p->exponent == 1 && p->coefficient != 0){
printf("%dx",p->coefficient);
}
else if(p->coefficient == 1 && p->exponent != 0){
printf("x^%d",p->exponent);
}
else if(p->coefficient == 0){
printf("0"); //這條語句和上面不一樣,因為這是最后一個多項式的輸出,如果最后一個多項式的計算結果為0,那么不這樣寫就會輸出(……+)有一個加號,不美觀
}
else if(p->coefficient != 1 && p->exponent != 0){
printf("%dx^%d",p->coefficient,p->exponent);
}
}
void paixu(node *head){//將多項式按升冪排序
node *p,*q;
int temp,temp1;
for(p=head->next;p!=NULL;p=p->next){//運用了兩個for循環
for(q=p->next;q!=NULL;q=q->next){//q為p的后繼結點
if(p->exponent > q->exponent){//如果p的指數比q的指數大,也就是前一項的指數比后一個指數大,那么交換它們的指數和系數
temp = p->exponent;
p->exponent = q->exponent;
q->exponent = temp;
temp1 = p->coefficient;
p->coefficient = q->coefficient;
q->coefficient = temp1;
}
}
}
}
node *add(node *&head1,node *head2){//一元多項式相加 (將一元多項式相加的結果存放在head1中)
node *a,*b,*p;
a = head1->next;
b = head2->next;
p = head1;
while(a != NULL && b != NULL){
if(a->exponent == b->exponent){
a->coefficient = a->coefficient+b->coefficient;
p->next = a;
p = p->next;
a = a->next;
b = b->next;
}
else if(a->exponent < b->exponent){
p->next = a;
p = p->next;
a = a->next;
}
else{
p->next = b;
p = p->next;
b = b->next;
}
}
if(a != NULL){//比較結束之后a或b如果有一個還未空就執行下述語句
p->next = a;
}
else{
p->next = b;
}
return head1;
}
int main(){
node *head1,*head2,*h;
head1 = create();//創建第一個多項式
head2 = create();//創建第二個多項式
paixu(head1);//將第一個多項式按升冪排序
paixu(head2);//同上
h = add(head1,head2);//相加
print(h);//輸出
return 0;
}
然后一個多項式相加的代碼就完成了,在寫博客的過程中突然發現自己相加和輸出函數有一些問題,就順便改正了,不得不說這寫博客真的好處多多啊,還有就是輸出函數里的分類沒有完整,因為有系數為負數的情況,我懶得寫了,大家有興趣的可以寫一寫,不難的,就是簡單的判斷語句。
哦!還缺一個頭文件
#include<stdio.h>#include<stdlib.h>
這就完美了。
最后奉上一個運行結果
這是vscode的運行結果
上述程序依次寫入Dev-C++和vscode以及vs2019中都可以執行,但如果是vs2019里其scanf要改為scanf_s,因為這是vs2019的編譯規則,而且還可能出現警告(取消NULL指針對P的調用),這個問題的解決大家可以看我的第一個博客里有解決方法,這里就不多說了。
以上就是“C語言實現一元多項式相加運算”的詳細內容,想要了解更多C語言教程歡迎持續關注編程學習網!
掃碼二維碼 獲取免費視頻學習資料
- 本文固定鏈接: http://www.wangchenghua.com/post/10575/
- 轉載請注明:轉載必須在正文中標注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費視頻資料