この記事は、オンラインコースの統合ノートに基づいた、データ構造の線形構造(アプリケーション例)です。
栗:
2つの単変量多項式の積と和を求める関数を設計します
この質問の入力と出力の例:
ソリューションのアイデア
- 多項式表現
- プログラムフレームワーク
- 多項式を読む
- 付加的な実現
- 乗算の実現
- 多項式出力
1つは、多項式の表現です。
(ゼロ以外の項目のみを示します)
アレイ:
- シンプルなプログラミングと簡単なデバッグ
- 事前にアレイのサイズを決定する必要があります(わからない場合は、スペースの浪費になります)
リンクリスト:
- 動的
- プログラミングは少し複雑で、デバッグはより困難です
PS:より良い実装方法は次のとおりです:動的配列
以下に、リンクリスト表現について説明します。
データ構造設計
typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef;/*系数*/
int expon;/*指数*/
Polynomial link;
};
第二に、プログラムフレームワークの構築
int main()
{
读入多项式1
读入多项式2
乘法运算并输出
加法运算并输出
return 0;
}
設計する機能:
- 多項式で読む
- 2つの多項式を乗算する
- 2つの多項式を追加します
- 多項式出力
int main()
{
Polynomial P1,P2,PP,PS;
P1 = ReadPoly();
P2 = ReadPoly();
PP = Mult(P1,P2);
PrintPoly(PP);
PS = Add(P1,P2);
PrintPoly(PS);
return 0;
}
3.多項式の読み方
入力データ形式:4 3 4 -5 2 6 1 -2 0(4は4グループの数であり、ループ内のペアの1つのペアで読み取られます)
Polynomial ReadPoly()
{
...
scanf("%d",&N);
...
while(N--){
scanf("%d %d",&c,&e);/*每对数据按指数递减顺序读入*/
Attach(c,e,&Rear);/*构造并插入新结点*/
}
...
return P;
}
思考:リアの初期値は何ですか?
2つの治療法:
1.リアの初期値はNULLです
アタッチ機能では、RearがNULLであるかどうかに応じて異なる処理が行われます(Attachは、Rearが最初にNULLであるかどうかを判別します。NULLの場合、ノードに適用して、RearをNULLに変更し、Rearがこのノードを指すようにします。 NULLではありません。最後に新しいノードを直接挿入してください)
2.後部は空のノードを指します
終了後、最後の空のノードを削除します
第四に、多項式の読み方
void Attach(int c,int e,Polynomail *pRear)/*pRear是指针的指针*/
{
Polynomial P;
P = (Polynomial)malloc(sizeof(struct PolyNode));/*申请结点*/
P->coef = c; /*对新结点赋值*/
P->expon = e;
P->link = NULL;
(*pRear)->link = P;
*pRear = P; /*修改pRear值*/
}
Polynomial ReadPoly()
{
Polynomial P,Rear,t;
int c,e,N;
scanf("%d",&N);
P = (Polynomial)malloc(sizeof(struct PolyNode));/*链表头空结点*/
P->link = NULL;
Rear = P;/*第二种处理方法,一开始就是空结点*/
while(N--){
scanf("%d %d",&c,&e);
Attach(c,e,&Rear);/*将当前项插入多项式尾部*/
}
t = P;P = P->link;/*删除临时生成的头结点*/
free(t);
return P;
}
5、2つの多項式を追加する方法
建築
Polynomial Add(Polynomial P1,Polynomial P2)
{
...
t1 = P1,t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode));/*构造空结点*/
P->link = NULL;
Rear = P;
while(t1 && t2){
if(t1->expon == t2->expon){
...
}
else if(t1->expon > t2->expon){
...
}
else{
...
}
}
while(t1){
...
}
while(t2){
...
}
...
return P;
}
最初のwhileはインデックスを判断し、係数を計算します
2番目のwhileと3番目のwhileは、それぞれt1とt2が空であるという状況を判断します。
方法:
1.乗算演算を加算演算に変換します
P1の現在の項(ci、ei)にP2多項式を掛けて、結果の多項式に追加します
t1 = P1;t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P;
while(t2){
Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
t2 = t2->link;
}
2.アイテムごとに挿入します
P1の現在の項(ci、ei)にP2の現在の項(c2i、e2i)を掛けて、結果の多項式に挿入します。重要なのは挿入位置を見つけることです
最初の結果の多項式は、P1の最初の項にP2を掛けることによって取得できます(上記のように)
Polynomail Mult(Polynomial P1,Polynomial P2)
{
Polynomial P,Rear,t1,t2,t;
int c,e;
if(!P1||!P2) return NULL;
t1 = P1;t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P;
while(t2){
/*先用P1的第1项乘以P2,得到P*/
Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
t2 = t2->link;
}
t1 = t1->link;
while(t1){
t2 = P2;Rear = P;
while(t2){
e = t1->expon + t2->expon;/*计算指数*/
c = t1->coef*t2->coef;/*计算系数*/
while(Rear->link&&Rear->link->expon>e)
Rear = Rear->link;
if(Rear->link&&Rear->link->expon == e){
if(Rear->link->coef+c)
Rear->link->coef+=c;
else{
t = Rear->link;
Rear->link=t->link;
free(t);
}
}
else{
t = (Polynomial)malloc(sizeof(struct PolyNode));
t->coef = c;t->expon = e;
t->link = Rear->link;
Rear->link = t;Rear = Rear->link;
}
t2 = t2->link;
}
t1 = t1->link;
}
t2 = P;P = P->link;
free(t2);
return P;
}
6.多項式の出力方法
void PrintPoly(Polynomial P)
{
/*输出多项式*/
int flag = 0;/*辅助调整输出格式用*/
if(!P){
printf("0 0\n");
return;
}
while(P){
if(!flag)
flag = 1;
else
printf(" ");
printf("%d %d",P->coef,P->expon);
P = P->link;
}
printf("\n");
}
免責事項:情報の一部はインターネットからのものです。侵害がある場合は、削除するために私に連絡してください!
記事に誤りや混乱などがある場合は、批判や訂正を歓迎します!