一元多項式求和(c語言實現)
把任意給定的兩個一元多項式P(x) ,Q(x) 輸入計算機,計算它們的和並輸出計算結果。
#include <stdio.h>
#include <malloc.h>
typedef struct LNode
{
int coef; // 系數
int exp; // 指數
struct LNode* next;
} LinkNode;
void Create(LinkNode*& head) // 創建多項式
{
int n, coef, exp;
LinkNode* index, * node;
head = (LinkNode*)malloc(sizeof(LinkNode)); // 創建頭節點
index = head; // 輔助指針,使 index 指向最后一個節點,沒次新增加一個節點,index就后移
printf("請輸入多項式的項數:");
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
printf("請輸入第%d項的系數和指數", i);
scanf("%d %d", &coef, &exp);
node = (LinkNode*)malloc(sizeof(LinkNode)); // 創建新的節點
node->coef = coef;
node->exp = exp;
index->next = node; // 將新創建的加入到鏈表中
index = node; // index指向新的節點
}
index->next = NULL;
}
void Display(LinkNode* L) // 輸出多項式
{
L = L->next; // 讓 指向第一個節點
while (L != NULL) // 如果 p 不為空(鏈表不為空),則輸出
{
printf("%dX^%d", L->coef, L->exp); // 輸出系數 和 指數
if (L->next != NULL) // 如果 p 的下一個節點不為空,這就輸出一個 + 號(防止多輸出一個 + 號)
{
printf("+");
}
L = L->next;
}
printf("\n");
}
LinkNode* ListAdd(LinkNode* p, LinkNode* q) // 多項式相加
{
p = p->next;
q = q->next;
LinkNode* addL, * index, * node = NULL; // 用 addL存儲相加后的二項式, index 為輔助指針,node為新節點
addL = (LinkNode*)malloc(sizeof(LinkNode));
index = addL;
while (p != NULL && q != NULL) // 目的是為了讓兩個多項式為空去比較
{
if (p->exp > q->exp) // 如果 p 的指數大於 q 的指數就把 p 的該項做為新節點,讓后讓 p 后移一位
{
node = (LinkNode*)malloc(sizeof(LinkNode));
node->coef = p->coef;
node->exp = p->exp;
index->next = node;
index = node;
p = p->next;
}
else if (p->exp == q->exp) // 如果 p 的指數等於 q 的指數,就把 p 和 q 的系數相加作為新節點,讓后讓 p 和 q 后移一位
{
node = (LinkNode*)malloc(sizeof(LinkNode));
node->coef = p->coef + q->coef;
node->exp = p->exp;
if (node->coef == 0)
{
free(node);
}
else
{
index->next = node;
index = node;
}
p = p->next;
q = q->next;
}
else // 如果 q 的指數大於 p 的指數就把 q 的該項做為新節點,讓后讓 q 后移一位
{
node = (LinkNode*)malloc(sizeof(LinkNode));
node->coef = q->coef;
node->exp = q->exp;
index->next = node;
index = node;
q = q->next;
}
}
if (p != NULL) // 如果 p 不為空,說明 q 為空了,就可以直接將 p 后面的節點給 node
{
node->next = p->next;
}
else if (q != NULL) // 如果 q 不為空,說明 p 為空了,就可以直接將 q 后面的節點給 node
{
node->next = q->next;
}
else // 如果執行這個則所民 p 和 q 都為空了,就讓node指向的最后的節點指向空
{
node->next = NULL;
}
return addL;
}
int main(int argc, char const* argv[])
{
LinkNode* P, * Q;
printf("請輸入第一個多項式");
Create(P);
Display(P);
printf("請輸入第二個多項式");
Create(Q);
Display(Q);
LinkNode* List = ListAdd(P, Q);
printf("相加后的多項式為:");
Display(List);
return 0;
}