データ構造の線形構造(アプリケーション例)

この記事は、オンラインコースの統合ノートに基づいた、データ構造の線形構造(アプリケーション例)です。

栗:

2つの単変量多項式の積と和を求める関数を設計します

ここに画像の説明を挿入します

この質問の入力と出力の例:

ここに画像の説明を挿入します

ソリューションのアイデア

  1. 多項式表現
  2. プログラムフレームワーク
  3. 多項式を読む
  4. 付加的な実現
  5. 乗算の実現
  6. 多項式出力
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");	
}

免責事項:情報の一部はインターネットからのものです。侵害がある場合は、削除するために私に連絡してください!
記事に誤りや混乱などがある場合は、批判や訂正を歓迎します!

おすすめ

転載: blog.csdn.net/hxtxsdcxy/article/details/113829071