問題描述
數據結構(C語言)用單鏈表存儲一元多項式,並實現兩個多項式的相加運算
基本要求
(1)輸入並建立多項式;
(2)輸出多項式,輸出形式爲整數序列:n,c1,e1,c2,e2,……,cn,en,其中n是多項式的項數,ci和ei分別是第i項的係數和指數,序列按指數降序排列;
(3)多項式a和b相加,建立多項式a+b。
思路分析
由於多項式有指數和係數,所以結構體中應該定義三個值:指數,係數,next。然後提示用戶輸入,第一個多項式的項數,每一項的係數和指數,第二個多項式的項數,每一項的係數和指數。申請兩個鏈表存放他們的係數和指數。
這裏以y=1x^2 +2x^3爲例
比較兩個多項式的指數,如果第一個多項式大,第二個多項式指針就向後一位。
相反如果第二個多項式大,第一個就向後指一位。
如果第一個多項式的指數等於第二個多項式,就讓他們的係數相加。
直到有一個多項式到了最後一位,退出循環,不在比較。將指針指向不爲空的那個多項式。最後輸出,即可。
源代碼
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;//係數
ElementType Number;//指數
PtrToNode Next;
};
typedef PtrToNode List;
List Read(); /* 細節在此不表 */
void Print( List L );
int main()
{
List L,L1,L2,p1,p2,p;
printf("請輸入第一個多項式\n");
L1 = Read();
printf("請輸入第二個多項式\n");
L2=Read();
printf("第一個多項式:");
Print(L1);
printf("第二個多項式:");
Print(L2);
p1=L1->Next;
p2=L2->Next;
L=p=L1;// 用L1的頭結點作爲L的頭結點
while(p1&&p2){
if(p1->Number > p2->Number){
p->Next=p2;
p=p2;
p2=p2->Next;
}else if(p1->Number < p2->Number){
p->Next=p1;
p=p1;
p1=p1->Next;
}else{
p1->Data=p1->Data + p2->Data;
p->Next=p1;
p=p1;
p1=p1->Next;
p2=p2->Next;
}
}
p->Next=p1?p1:p2;
printf("相加結果:");
Print(L);
return 0;
}
List Read(){
int m,n;
List L,head;
head = L = (List)malloc(sizeof(struct Node));
printf("請輸入多項式的項數\n");
scanf("%d",&n);
for(int i=0;i<n;i++){
L->Next = (List)malloc(sizeof(struct Node));
printf("請輸入每一項的係數和指數\n");
scanf("%d%d",&(L->Next->Data),&(L->Next->Number));
L = L->Next;
}
return head;
}
void Print( List L ){
List p=L->Next;
printf("y=");
while(p){
printf("%dx^%d", p->Data,p->Number);
if((p->Next)!=NULL){
printf("+");
}
p=p->Next;
}
//printf("%dx^%d", p->Data,p->Number);
printf("\n");
}