線形テーブルの応用 - 線形テーブルの結合

目次

 問題の説明:

問題分析:

アルゴリズムのステップ:

使用される基本操作:

(1) 線形テーブルの初期化:

(2)線形テーブルの格納値

(3) 線形テーブルの長さを取得する

 (4) 線形テーブルの値

(5) 線形テーブルの要素の検索

 (6) 線形テーブルへの要素の挿入

(7)線形テーブルの表示

(8) 線形テーブルのマージ (強調!!!) 

 コード全体 (コメント + 実行中のスクリーンショット)

 問題の説明:

A=(1,4,3,7,8) と B=(5,3,2,7) などの 2 つのセットが与えられた場合、線形テーブルのシーケンス テーブルから学習した基本演算を使用して 2 つのセットをマージします。はセット、A=(1,4,3,7,8,5,2)

問題分析:

2 つの線形テーブル LA と LB を使用してそれぞれ集合 A と集合 B を表し、線形テーブル LB 内のすべての要素を走査し、各走査の要素を取り出して、それらを線形テーブル LA 内の要素と 1 つずつ比較します。線形テーブル LA にその要素と同じ要素がない場合、線形リスト LA の長さに 1 を加えてその要素を最後尾に挿入することで、線形リスト LA は次の要素を表しますセットAとセットBを合体させたもの。

アルゴリズムのステップ:

  1. まず、線形テーブルLAと線形テーブルLBのテーブル長を求め、mとnに代入します。
  2. LB の最初の要素から LB の最後の要素までを 1 つずつ取り出し、合計 n 回ループします。
  3. 抽出した要素を LA の要素と 1 つずつ比較します
  4. 同じ要素が LA に存在しない場合は、その要素を線形リスト LA に挿入します

使用される基本操作:

(1) 線形テーブルの初期化:

空のシーケンス テーブルを構築し、テーブルの長さを 0 に設定します。特定のコードは次のように実装されます。

Status InitList(SqList &L)
{
	L.elem=new ElemType[MAXSIZE];
	if(L.elem==NULL) return ERROR;
	L.length=0;
	return OK;
}

(2)線形テーブルの格納値

このユースケースでは、保存する値の数を自分で定義できます(ただし、 MAXSIZE で定義された値は 10 なので、それ以上の値を保存したい場合は MAXSIZE の値を変更する必要があります。シーケンス テーブルの値。保存するたびに、テーブルの長さを 1 つ増やすには、仮パラメータの L を参照によって渡す必要があることに注意してください。そうしないと、線形テーブルは保存後も空の線形テーブルのままになります。節約中!

void Creat_n(SqList &L)
{
	int p;
	printf("该线性表的长度为:");
	scanf("%d",&p); 
	ElemType c;
	printf("请输入线性表的%d个值:\n",p);
	for(int i=1;i<=p;i++){
		scanf("%d",&c);
		L.elem[i]=c;
		L.length++;
	}
} 

(3) 線形テーブルの長さを取得する

線形テーブルの長さを取得するには、関数に値 L.length を返すだけです。

Status ListLength(SqList L)
{
	return L.length;
} 

 (4) 線形テーブルの値

値を取得する要素の位置を入力して値を取得し、取得した結果を同じ変数型 e に代入します。ここでも、取得した値を変数 e に代入した後、その値を参照渡しする必要があります。 e が変わりました。同時に、入力された i 値 (取得された要素の位置) を判断する必要があります。i 値が妥当であれば続行できます。そうでない場合は、安全な出口を見つけて終了する必要があります (エラーを返す)。具体的なコードは次のとおりです。

Status GetElem(SqList L,int i,ElemType &e) 
{
	if(i<1 || i>L.length) return ERROR;
	e=L.elem[i];
	return OK;
} 

(5) 線形テーブルの要素の検索

要素を検索するには、1 つずつ比較します。最初の要素から始めて、渡された値 e と比較します。同じ場合は、i+1 を返します。同じ値がない場合は、i+1 を返します。渡された要素は 0 を返します。特定のコードは次のように実装されます。

int LocateElem(SqList L,ElemType e)
{
	for(int i=1;i<=L.length;i++)
		if(L.elem[i]==e) return i;
	return 0;
}

 (6) 線形テーブルへの要素の挿入

要素を挿入するには、まず挿入位置が妥当であるかどうかを判断し、(i<1 || i>L.length+1)、不適切な場合は ERROR 値を返します (この例では、要素の最後の位置を直接挿入します) 。次に、線形テーブルの長さが最大値 MAXSIZE に達しているかどうかを判断し、達している場合には ERROR 値も返します 挿入位置が適切で、線形テーブルの長さが最大値に達していない場合, 要素を挿入し、挿入位置以降のすべての要素を順番に後方へ移動します。位置を移動(後ろから開始)し、指定した位置に要素を挿入します。挿入後、線形テーブルの長さに 1 を加えます。コードは次のように実装されます。

Status ListInsert(SqList &L,int i,ElemType e)
{
	if(i<1 || i>L.length+1) return ERROR;
	if(L.length==MAXSIZE) return ERROR;
	for(int j=L.length;j>=i;j--)
		L.elem[j+1]=L.elem[j];
	L.elem[i]=e;
	++L.length;
	return OK;
}

(7)線形テーブルの表示

線形テーブルの表示では、ループを直接使用して線形テーブル内の要素の値を走査して出力します。

void Display(SqList L)
{
	for(int i=1;i<=L.length;i++)
		 printf("%d ",L.elem[i]);
	printf("\n");
}

(8) 線形テーブルのマージ (強調!!!) 

アルゴリズムのステップで説明したように、ここでは繰り返しません。

void MergeList(SqList &LA,SqList LB)
{
	ElemType e;
	int k,m,n;
	m=ListLength(LA);n=ListLength(LB);
	for(int i=1;i<=n;i++){
		GetElem(LB,i,e);//将LB中的元素逐一取出来赋值给e
		k=LocateElem(LA,e);//将元素e与LA中的元素逐一比较
		if(k==0)//LA中不存在该元素
			ListInsert(LA,++m,e);//将其插入到线性表LA中
	}
} 

 コード全体 (コメント + 実行中のスクリーンショット)

#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 10
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct
{
	ElemType *elem;
	int length; 
}SqList;
 
//线性表的初始化 
Status InitList(SqList &L)
{
	L.elem=new ElemType[MAXSIZE];
	if(L.elem==NULL) return ERROR;
	L.length=0;
	return OK;
}
 
//线性表的存值
void Creat_n(SqList &L)
{
	int p;
	printf("该线性表的长度为:");
	scanf("%d",&p); 
	ElemType c;
	printf("请输入线性表的%d个值:\n",p);
	for(int i=1;i<=p;i++){
		scanf("%d",&c);
		L.elem[i]=c;
		L.length++;
	}
} 

//线性表的长度
Status ListLength(SqList L)
{
	return L.length;
} 

//线性表的取值
Status GetElem(SqList L,int i,ElemType &e) 
{
	if(i<1 || i>L.length) return ERROR;
	e=L.elem[i];
	return OK;
} 
 
//线性表的查找元素
int LocateElem(SqList L,ElemType e)
{
	for(int i=1;i<=L.length;i++)
		if(L.elem[i]==e) return i;
	return 0;
}
 
//线性表的插入元素
Status ListInsert(SqList &L,int i,ElemType e)
{
	if(i<1 || i>L.length+1) return ERROR;
	if(L.length==MAXSIZE) return ERROR;
	for(int j=L.length;j>=i;j--)
		L.elem[j+1]=L.elem[j];
	L.elem[i]=e;
	++L.length;
	return OK;
} 

//打印线性表
void Display(SqList L)
{
	for(int i=1;i<=L.length;i++)
		 printf("%d ",L.elem[i]);
	printf("\n");
}
 
//线性表的合并
void MergeList(SqList &LA,SqList LB)
{
	ElemType e;
	int k,m,n;
	m=ListLength(LA);n=ListLength(LB);
	for(int i=1;i<=n;i++){
		GetElem(LB,i,e);//将LB中的元素逐一取出来赋值给e
		k=LocateElem(LA,e);//将元素e与LA中的元素逐一比较
		if(k==0)//LA中不存在该元素
			ListInsert(LA,++m,e);//将其插入到线性表LA中
	}
} 
 
int main()
{
	SqList LA,LB;
	int p1,p2;
	p1=InitList(LA);p2=InitList(LB);
	if(p1==0 || p2==0) printf("初始化失败!");
	else{
		Creat_n(LA);Creat_n(LB);
		MergeList(LA,LB);
		printf("合并后的线性表为:");
		Display(LA);
	}
}

実行中のスクリーンショット: 

おすすめ

転載: blog.csdn.net/m0_74472474/article/details/133314622