1、一元多項式的運算:實現(xiàn)兩個多項式加、減乘運算
設(shè)計內(nèi)容:
用順序存儲結(jié)構(gòu)實現(xiàn)一元多項式的加法、減法和乘法。具體要求為:用五個函數(shù)分別實現(xiàn)一元多項式的創(chuàng)建、輸出、加法、減法和乘法;
設(shè)計思路:
將順序表數(shù)組下標作為多項式的指數(shù)項,數(shù)組內(nèi)的數(shù)據(jù)元素存放多項式的系數(shù),通過訪問數(shù)組內(nèi)元素的同時獲取下標并對二者進行不同的運算后,將運算結(jié)果依舊按原形式放入新的數(shù)組中,完成對兩個多項式的加減乘運算。
測試數(shù)據(jù):
多項式1: 10 + 5 x ? 4 x 2 + 3 x 3 + 2 x 4 10 + 5x -4x^2 + 3x^3 + 2x^4 10+5x?4x2+3x3+2x4(即輸入10 0 5 1 -4 2 3 3 2 4)(輸入-1 -1結(jié)束)
多項式2: ? 3 + 8 x + 4 x 2 ? 5 x 4 + 7 x 5 ? 2 x 6 -3 + 8x + 4x^2 - 5x^4 + 7x^5 -2x^6 ?3+8x+4x2?5x4+7x5?2x6(即輸入 -3 0 8 1 4 2 -5 4 7 5 -2 6)(輸入 -1 -1結(jié)束)
代碼實現(xiàn):
1、構(gòu)造一個空的線性表L
void InitList(SqList *L) {
/**申請連續(xù)的MAXSIZE長度空間*/
L->data = (ElemType *) malloc(sizeof(ElemType) * MAXSIZE);
/**判斷空間是否申請成功*/
if (!L->data)
exit(-1);
for (int i = 0; i < MAXSIZE; i++)
L->data[i] = 0;
/**空表最高次項為0*/
L->highPower = 0;
}
2、銷毀線性表L
- 釋放data指向的空間
- 讓L -> data指向null
- 讓L- > highPower =0
void DestroyList(SqList *L) {
/**釋放data指向的空間*/
free(L->data);
L->data = NULL;
L->highPower = 0;
}
3、兩多項式相加
/**兩多項式相加*/
void TwoPolynomialAdd(SqList L1, SqList L2, SqList *L3) {
/**獲取兩多項式的最大項以確定相加后的多項式的最大項*/
L3->highPower = L1.highPower > L2.highPower ? L1.highPower : L2.highPower;
/**通過循環(huán)將兩個多項式的同指數(shù)項的系數(shù)相加并保存到新的多項式中*/
for (int i = 0; i <= L3->highPower; i++)
L3->data[i] = L1.data[i] + L2.data[i];
}
4、兩多項式相減
/**兩多項式相減*/
void TwoPolynomialSub(SqList L1, SqList L2, SqList *L3) {
/**獲取兩多項式的最大項以確定相加后的多項式的最大項*/
L3->highPower = L1.highPower > L2.highPower ? L1.highPower : L2.highPower;
/**通過循環(huán)將兩個多項式的同指數(shù)項的系數(shù)相減并保存到新的多項式中*/
for (int i = 0; i <= L3->highPower; i++)
L3->data[i] = L1.data[i] - L2.data[i];
}
5、兩多項式相乘
/**兩多項式相乘*/
void TwoPolynomialMul(SqList L1, SqList L2, SqList *L3) {
/**兩多項式的最高項相加為新多項式的最高項*/
L3->highPower = L1.highPower + L2.highPower;
for (int i = 0; i <= L1.highPower; i++)
/**通過雙層循環(huán)將兩個多項式的每一項兩兩相乘與并保存到新的多項式中*/
for (int j = 0; j <= L2.highPower; j++)
/**相乘后的指數(shù)項為兩項指數(shù)項相加*/
L3->data[i + j] += L1.data[i] * L2.data[j];
}
6、完整代碼實現(xiàn)
#include <stdio.h>
#include <stdlib.h>
/**表可能達到的最大長度,存儲空間初始分配量*/
#define MAXSIZE 20
/**表的數(shù)據(jù)類型,根據(jù)實際情況而定*/
typedef int ElemType;
typedef struct {
/**數(shù)組存儲數(shù)據(jù)元素,最大值為MAXSIZE*/
ElemType *data;
/**最高次項*/
int highPower;
} SqList;
/**構(gòu)造一個空的線性表L*/
void InitList(SqList *L) {
/**申請連續(xù)的MAXSIZE長度空間*/
L->data = (ElemType *) malloc(sizeof(ElemType) * MAXSIZE);
/**判斷空間是否申請成功*/
if (!L->data)
exit(-1);
for (int i = 0; i < MAXSIZE; i++)
L->data[i] = 0;
/**空表最高次項為0*/
L->highPower = 0;
}
/**銷毀線性表L*/
void DestroyList(SqList *L) {
/**釋放data指向的空間*/
free(L->data);
L->data = NULL;
L->highPower = 0;
}
/**創(chuàng)建多項式:由用戶輸入多項式的每項系數(shù)與指數(shù)*/
void CreatePolynomial(SqList *L) {
int coefficient, exponent;
/**循環(huán)輸入常數(shù)項的每一項*/
for (int i = 0; i < 10; i++)
{
printf("\n請輸入第%d項的常數(shù)項和指數(shù)項,結(jié)束請輸入-1 -1:", i + 1);
scanf("%d%d", &coefficient, &exponent);
/**指數(shù)為-1則結(jié)束輸入*/
if (exponent != -1)
{
/**數(shù)組下標為指數(shù)項,常數(shù)項存入下標對應(yīng)的位置,若有相同指數(shù)項則常數(shù)項相加*/
L->data[exponent] += coefficient;
/**指數(shù)項最大項為多項式長度*/
if (L->highPower < exponent)
L->highPower = exponent;
} else
break;
}
printf("輸入完畢\n");
}
/**輸出常數(shù)項:按多項式指數(shù)大小依次輸出多項式每一項*/
void PrintPolynomial(SqList L) {
printf("多項式為:");
/**若常數(shù)項為0則不輸出,若不為0則只輸出常數(shù)項*/
if (L.data[0] != 0)
printf("%d", L.data[0]);
/**若常數(shù)項為0則不輸出*/
if (L.data[1] > 0)
printf("+%dx", L.data[1]);/**不輸出指數(shù)項為1*/
else if (L.data[1] < 0)
printf("%dx", L.data[1]);
/**從第二項開始輸出指數(shù)項*/
for (int i = 2; i <= L.highPower; i++)
/**若常數(shù)項為0則不輸出該項*/
if (L.data[i] > 0)
printf("+%dx^%d", L.data[i], i);
else if (L.data[i] < 0)
printf("%dx^%d", L.data[i], i);
printf("\n");
}
/**兩多項式相加*/
void TwoPolynomialAdd(SqList L1, SqList L2, SqList *L3) {
/**獲取兩多項式的最大項以確定相加后的多項式的最大項*/
L3->highPower = L1.highPower > L2.highPower ? L1.highPower : L2.highPower;
/**通過循環(huán)將兩個多項式的同指數(shù)項的系數(shù)相加并保存到新的多項式中*/
for (int i = 0; i <= L3->highPower; i++)
L3->data[i] = L1.data[i] + L2.data[i];
}
/**兩多項式相減*/
void TwoPolynomialSub(SqList L1, SqList L2, SqList *L3) {
/**獲取兩多項式的最大項以確定相加后的多項式的最大項*/
L3->highPower = L1.highPower > L2.highPower ? L1.highPower : L2.highPower;
/**通過循環(huán)將兩個多項式的同指數(shù)項的系數(shù)相減并保存到新的多項式中*/
for (int i = 0; i <= L3->highPower; i++)
L3->data[i] = L1.data[i] - L2.data[i];
}
/**兩多項式相乘*/
void TwoPolynomialMul(SqList L1, SqList L2, SqList *L3) {
/**兩多項式的最高項相加為新多項式的最高項*/
L3->highPower = L1.highPower + L2.highPower;
for (int i = 0; i <= L1.highPower; i++)
/**通過雙層循環(huán)將兩個多項式的每一項兩兩相乘與并保存到新的多項式中*/
for (int j = 0; j <= L2.highPower; j++)
/**相乘后的指數(shù)項為兩項指數(shù)項相加*/
L3->data[i + j] += L1.data[i] * L2.data[j];
}
int Menu() {
int a;
printf("輸入1創(chuàng)建兩個多項式\t\t輸入2輸出兩個多項式\n");
printf("輸入3將兩個多項式相加 \t\t輸入4將兩個多項式相減\n");
printf("輸入5將兩個多項式相乘 \t\t輸入0退出\n");
printf("請輸入:");
scanf("%d", &a);
return a;
}
int main() {
SqList L1, L2, L3;
InitList(&L1);
InitList(&L2);
InitList(&L3);
while (1) {
switch (Menu()) {
case 1:
printf("\n請輸入多項式 1 :");
CreatePolynomial(&L1);
printf("\n多項式 1 為:\n");
PrintPolynomial(L1);
printf("\n請輸入多項式 2 :");
CreatePolynomial(&L2);
printf("\n多項式 2 為:\n");
PrintPolynomial(L2);
break;
case 2:
printf("\n多項式 1 為:\n");
PrintPolynomial(L1);
printf("\n多項式 2 為:\n");
PrintPolynomial(L2);
break;
case 3:
InitList(&L3);
TwoPolynomialAdd(L1, L2, &L3);
printf("兩多項式相加后的結(jié)果");
PrintPolynomial(L3);
break;
case 4:
TwoPolynomialSub(L1, L2, &L3);
printf("兩多項式相減后的結(jié)果");
PrintPolynomial(L3);
break;
case 5:
DestroyList(&L3);
InitList(&L3);
TwoPolynomialMul(L1, L2, &L3);
printf("兩多項式相乘后的結(jié)果");
PrintPolynomial(L3);
break;
case 0:
exit(0);
default:
printf("暫無此功能\n");
}
}
}
運行結(jié)果:
相加后的多項式為: 7 + 13 x + 3 x 3 ? 3 x 4 + 7 x 5 ? 2 x 6 7+13x+3x^3-3x^4+7x^5-2x^6 7+13x+3x3?3x4+7x5?2x6
相減后的多項式為: 13 ? 3 x ? 8 x 2 + 3 x 3 + 7 x 4 ? 7 x 5 + 2 x 6 13-3x-8x^2+3x^3+7x^4-7x^5+2x^6 13?3x?8x2+3x3+7x4?7x5+2x6文章來源:http://www.zghlxwxcb.cn/news/detail-414207.html
相乘后的多項式為:- 30 + 65 x + 92 x 2 ? 21 x 3 ? 48 x 4 + 73 x 5 + 43 x 6 ? 53 x 7 + 19 x 8 + 8 x 9 ? 4 x 1 0 30+65x+92x^2-21x^3-48x^4+73x^5+43x^6-53x^7+19x^8+8x^9-4x^10 30+65x+92x2?21x3?48x4+73x5+43x6?53x7+19x8+8x9?4x10文章來源地址http://www.zghlxwxcb.cn/news/detail-414207.html
到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)(嚴蔚敏)【一元多項式的運算】【C語言】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!