【データ構造】 順序表の挿入・拡張・ソート順

シーケンシャルテーブルのシーケンシャル挿入

Status SeqListInsert(SqList &L,ElemType e)//有序插入的函数
{
    int i=0;
    while(i<L.length&&L.elem[i]<e)//判断插入位置合法性
    {
        i++;
    }
    ListInsert(L,i+1,e);
    //调用插入函数
    return OK;
}
Status ListInsert(SqList &L,int i,ElemType e)//插入函数
{
    int j;
    if((i<1)||(i>L.length+1)) return ERROR;
    if(L.length==MAXSIZE) return ERROR;
    for(j=L.length-1;j>=i-1;j--)
    {
        L.elem[j+1]=L.elem[j];
    }
    L.elem[i-1]=e;
    ++L.length;
    return OK;
}

簡易挿入機能については皆さんよく理解されていると思いますが、順次挿入を実現したい場合には、上記と同様に、どこに挿入するかの判断を追加するだけで済みます。


シーケンステーブルの拡張

#define INcrease 100
void expandList(SqList& L)//扩容
{ 
    ElemType *newelem=new ElemType[INcreast];
    //INcrease为你想要扩容后表的大小
    int i = 0;
    for(i = 0; i < L.length; i++) 
    {
        newelem[i] = L.elem[i];
    }//将旧表的数据放入新表中
    delete L.elem; 
    L.elem = newelem; 
}

ここで私が採用する方法は、より大きなスペースを再申請し、古いテーブルのデータを新しいテーブルに配置することです。操作はコードセグメント内の for ループであり、影響を与えないように古いテーブルを削除します。 main 関数.elem での L の使用、最後に newelem を L.elem として再表現しました。


数列テーブルのソート

void Listpaixu(SqList &L)// 排序
{
    int i,j,t;
    for(i=1;i<L.length;i++)
    {
        for(j=1;j<=L.length-i;j++)//每次循环都会从第一个元素开始判断
        {
            if(L.elem[j]<L.elem[j-1])
            {
                t=L.elem[j];
                //用t来保存一下要移位的数据
                L.elem[j]=L.elem[j-1];
                //移位
                L.elem[j-1]=t;
                //把之前保存的数据放到新的位置
                
            }
        }
    }
}

妊娠するときは、大きな値から小さな値まで紙にリストを書いてみるとよいでしょう。

1. 位置を変える

このようなアルゴリズムを実装するには、必ず同じような2つの要素の値の大小関係を判断して位置を変更する必要があり、位置を変更する際には、その値を格納する変数を設定する必要があります。シフト前の要素の値を変更できるようにするため、要素の位置を変更できます。

2. 入れ子になったループ

この入れ子のループにより、無理な位置にあるすべての要素を完全かつスムーズに返すことができますが、アルゴリズムを記述する際には、どのような機能を実現したいのかを最初に検討する、つまり実現する具体的な操作を記述することをお勧めします。まず、どのようなループ条件が必要かを検討し、最後に演算をループに入れると、問題が非常に複雑になります。


この記事で私のような初心者に一番伝えたいのは、コードを書くときは、まず実行文、つまりどのような操作を行いたいのかを書いて、最後に何回実行するかを検討することをお勧めします。もちろん、これは私が実際にまとめたアイデアにすぎません。

おすすめ

転載: blog.csdn.net/2301_77112634/article/details/130244192