データ構造(C言語)-線形テーブルでのシーケンシャルテーブルの基本的な操作と実装

1.シーケンステーブルとは何ですか?シーケンステーブルは何に反映されますか?

 

        シーケンステーブルは論理的に隣接する2つの要素であり、シーケンステーブル内のそれらの位置も同じです。文字AZはシーケンステーブルです。シーケンステーブルは1つずつ要素で構成されており、これらの要素は同じタイプです。

        このシーケンステーブルを配列で表すことができます。つまり、シーケンステーブルを作成する前に、固定サイズのスペースを指定できます。

次に、最初に、シーケンステーブルに関連する操作、または実装できる操作について考えることができます。

        1.初期化シーケンステーブル

        2.シーケンステーブルを印刷します

        3.要素をシーケンステーブルに挿入します

        4.シーケンステーブルの要素を削除します

        5.シーケンステーブルで値がXである添え字を見つけます

        6.シーケンステーブルでi番目の要素の値を見つけます

        7.現在のシーケンステーブルの長さ、つまり要素を格納している配列の長さを取得します。

注:これらのことを暗記するのではなく、これらの操作の実装方法を理解してください。

3.上記の操作に従って、これらの操作ごとに実装する関数を定義します。

(1)構造を定義します。

       私の意見では、データ構造とは、問題が発生したときに、この問題に関する構造を定義できることを意味します。たとえば、シーケンステーブルの場合、要素を格納するための配列が必要です。また、現在の要素の数、つまり配列の長さも記録する必要があります。したがって、次の構造を定義できます。

#define MaxSize 10  //
typedef int ElemType//将int类型重新命名为ElemType,即ElemType可以代替int
typedef struct {
	ElemType data[MaxSize];//定义一个ElemType类型的数组,数组名为data,数组大小为MaxSzie
	int length;//顺序表的当前长度
}SqList;

 (2)シーケンステーブルを初期化します。シーケンステーブルを初期化するには、現在のシーケンステーブルの長さを0に設定するだけで済みます。つまり、ポインタを空としてマークする代わりに、現在のシーケンステーブルには何もありません。リンクリスト内。コードは次のように表示されます。

//初始化顺序表
void InitSq(SqList *L)
{
    L->length=0;
    printf("初始化之后,数组的长度为:%d\n",L->length);//输出顺序表的初始化后的长度。
    printf("-------------------------------------------------\n");
}

(3)現在のシーケンステーブルを出力します。つまり、配列data []をループします。現在の配列のすべての要素を出力できます。コードは次のとおりです。宣言したLは構造型変数であるため、次のことができます。 L.data []とL.lengthを渡して現在の配列と長さを取得します。宣言が構造体SqListタイプのポインターである場合は、L->data[]とL->lengthを介して現在の配列と長さを取得します。

//打印输出当前顺序表中的元素
void Print(SqList L)
{
    printf("当前表中的元素为:");
    for(int i=0;i<L.length;i++)
    {
        printf("%d ",L.data[i]);
    }
    printf("\n");
    printf("-------------------------------------------------\n");
}

(4)現在のシーケンステーブルに挿入し、値eをシーケンステーブルのi番目の位置に挿入します。i番目の位置は1から始まることを示します。まず、iが有効な挿入範囲内にあるかどうかを判断する必要があります。最初の位置、またはL->長さ位置の後のL->長さ位置に挿入できます。この範囲を超えるものは無効です。挿入が成功した場合は、すべての要素をi番目の位置に移動し、その後に1ビット移動します。配列のi番目の位置の添え字はi-1であることがわかっているため、i-1からL-になります。 >length-1これらの要素は1ビット後方に移動する必要があります。

//向元素中插入元素
void InsertSq(SqList *L,int i,ElemType e)
{
    //首先要判断这个顺序表是否满了
    if(i>L->length+1||i<=0)
    {
        printf("i=%d插入位置不存在\n当前表的长度为:%d\n",i,L->length);
        printf("-------------------------------------------------\n");
    }
    else
    {
        for(int k=L->length-1;k>=i-1;k--)
        {
            L->data[k+1]=L->data[k];        //把它后面的都往后移动一位
        }
        L->data[i-1]=e;
        L->length++;//因为此时我们插入了一个元素,数组的长度要加1.
    }
}

(5)現在のシーケンステーブルで値がeの要素を削除します。また、この配列をループし、配列の開始アドレスから開始して、値がeの要素を見つける必要があります。この場合、2つのケースがあります。 、いずれかが見つかった場合は、すべての要素を1つ進めた後に配置し、配列の長さを1つ減らします。見つからない場合は、削除する値が現在の配列に存在しないことを出力します。削除に成功したら、要素を移動する必要があります。このとき、削除した要素の現在の位置をiに設定する必要があります。このとき、iの位置は空で、配列内の添え字はi-1です。 。の要素はすべて1つの場所に移動し、L-> length-2にループするだけで、コードを確認できます。

//在当前列表中删除值为x的元素
void DeleteSq(SqList *L,ElemType x)
{
    int i=0;
    while(i<L->length&&L->data[i]!=x){  //从头开始遍历,如果没找到,在符合条件下一直循环
        i++;
    }
    if(i>=L->length){//遍历完数组没有我们要删除的那个值
        printf("数组中没有你要删除的值为:%d的元素\n",x);
        printf("-------------------------------------------------\n");
    }
    else{
        printf("删除成功");
        for(int j=i;j<L->length-1;j++){    //把后一个值赋值到它的前一个元素所在的位置,所以到L->length-2即可。
            L->data[j]=L->data[j+1];
        }
        L->length--;
    }
}

(6)配列内の値がXである要素の添え字を取得し、配列をループして、配列が見つかった場合はその添え字値を返し、見つからなかった場合は-1を返します。

//获取值为X的元素在数组中的下标
int FindValue(SqList L,ElemType x)
{
    int i=0;
    while(i<L.length&&L.data[i]!=x)//循环遍历数组,如果不相等就循环找下一个
    {
        i++;
    }
    if(i>=L.length)      //遍历完数组还是没有找到
    {
        return -1;
    }
    return i;           //返回元素X所在的数组下标值
}

(7)i番目の要素の値を取得するには、まずiが有効な範囲内にあるかどうかを判断します。有効な範囲内にある場合は、*eを使用して値を格納します。*eと異なる場合、この値は次のようになります。この関数で有効です。これは、メイン関数に戻すことはできません。具体的なコードは次のとおりです。

//获取第i个元素的值
void GetValue(SqList L,int i,ElemType *e)
{

    if(i<=0||i>L.length)
    {
        printf("您要查找的位置的有效范围为:1——%d\n",L.length);
        printf("您的输入为:%d,它不在数组的有效数字内\n",i);
    }
    else
    {
        (*e)=L.data[i-1];
        printf("您要查找的元素在第%d个位置,值为:e=%d\n",i,*e);
    }
    printf("-------------------------------------------------\n");
}

(8)シーケンステーブルの長さを取得するためのコードは次のとおりです。

//获取顺序表当前的长度
int GetLength(SqList L)
{
    return L.length;
}

(9)主な機能コード:

int main()
{
    SqList s;//声明一个SqList类型的变量s,来标记这个顺序表
    ElemType e=0;
    InitSq(&s);            //初始化这个顺序表
    InsertSq(&s,1,23);     //插入五个元素
    InsertSq(&s,1,12);
    InsertSq(&s,1,5);
    InsertSq(&s,1,46);
    InsertSq(&s,3,89);
    Print(s);              //打印输出这五个元素
    int n,m;                 //定义变量,用来获取用户输入的要查找的元素的位置n,和值m
    printf("请输入你要查找的元素的位置:");
    scanf("%d",&n);
    GetValue(s,n,&e);     //获取第n个位置元素值
    printf("请输入你要查找的元素的值:");
    scanf("%d",&m);
    e=FindValue(s,m);     //获取值m在数组下标中的位置
    if(e>=0&&e<GetLength(s)){   //判断是否找到了那个元素。
        printf("您查找的元素%d,在数组中的下标为:%d\n",m,e);
        printf("-------------------------------------------------\n");
    }
    else{
        printf("您查找的元素%d不在数组中\n",m);
        printf("-------------------------------------------------\n");
    }
    int f;//f用于存储当前我们要删除的那个值
    printf("请输入你要删除的那个值:");
    scanf("%d",&f);
    DeleteSq(&s,f);
    Print(s);
    printf("当前数组的长度为:%d\n",s.length);
    printf("-------------------------------------------------\n");
    int r=0;
    printf("请输入你要插入的元素的值:");
    scanf("%d",&r);
    printf("向表中插入元素%d,插入之前顺序表的长度为:%d\n",r,s.length);
    InsertSq(&s,3,r);//在元素的第三个位置上插入888;
    Print(s);
    printf("插入之后顺序表的长度为:%d\n",s.length);
    return 0;
}

(10)試験結果は以下のとおりです。

概要:シーケンステーブルを実装する方法はたくさんありますが、これは参考用です。自分の習慣に合わせて使用​​できます。

おすすめ

転載: blog.csdn.net/BaoITcore/article/details/121123351