目次
問題の説明:
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を合体させたもの。
アルゴリズムのステップ:
- まず、線形テーブルLAと線形テーブルLBのテーブル長を求め、mとnに代入します。
- LB の最初の要素から LB の最後の要素までを 1 つずつ取り出し、合計 n 回ループします。
- 抽出した要素を LA の要素と 1 つずつ比較します
- 同じ要素が 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);
}
}
実行中のスクリーンショット: