C言語の配列表(順次記憶構造体)

シーケンステーブル(順次記憶構造体)および詳細な初期化処理

注文表のフルネーム順次記憶構造は、リニアテーブルです。「直線状」を学習することで、私たちは、線形の表は、「一対一」のデータとして論理的な関係を格納するために使用されることを知って、順位表も例外ではありません。

また、テーブルデータ格納構造の物理的順序も必要とされます。、データが順次格納されている場合のシーケンステーブルストアデータは、事前に十分な大きさの物理空間の一部を適用する、データ要素が格納された時間との間の隙間の跡を残しません。

例えば、シーケンステーブルストアのセット用い{1,2,3,4,5}、以下に示すように最終状態に格納されたデータを:
ここに画像を挿入説明
したがって、我々はメモリ「順次、物理空間の一部に記憶された順にデータの論理的な関係『一対一』を有する」ことを結論付けることができます構造は、順次ストレージ構造です。

図観測のステータスデータを格納することにより、我々は、同じデータシーケンステーブルのストレージアレイが非常に近いことがわかります。実際には、使用順テーブルにデータがアレイです。

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

シーケンステーブル記憶データを使用する前に、外部に適用するのに十分な大きさの物理的空間に加えて、後の表内のデータを使用しやすくするために、注文テーブルには、次の二つのデータを記録する実時間を要します。

  1. アプリケーションシーケンステーブル記憶容量。
  2. シーケンステーブルの長さは、テーブルに格納されたデータ要素の数、すなわち、

注意:通常の条件下では、シーケンステーブルの長さよりもシーケンステーブル記憶容量以上のアプリケーション

次のようにそのため、私たちはテーブルの順序をカスタマイズする必要があり、C言語のコードは次のとおりです。

typedef struct Table{
    int * head;//声明了一个名为head的长度不确定的数组,也叫“动态数组”
    int length;//记录当前顺序表的长度
    int size;//记录顺序表分配的存储容量
}table;

注、ヘッドの動的な配列が初期化されていない私たちの声明で、ちょうど通常のポインタのようなものとは思いません。

そして、シーケンステーブルの最初の確立である初期化シーケンステーブルを、学習を開始。次の手順を実行するには、テーブルの必要性に順位を確立します。

  • 十分な大きさの物理的空間にアプリケーションヘッド動的データ、
  • 初期値の大きさや長さ、
    したがって、C言語コードは次の通りであります:
#define Size 5 //对Size进行宏定义,表示顺序表申请空间的大小
table initTable(){
    table t;
    t.head=(int*)malloc(Size*sizeof(int));//构造一个空的顺序表,动态申请存储空间
    if (!t.head) //如果申请失败,作出提示并直接退出程序
    {
        printf("初始化失败");
        exit(0);
    }
    t.length=0;//空表的长度初始化为0
    t.size=Size;//空表的初始存储空间为Size
    return t;
}

我々は、関数は、戻り値は、フォームの初期化シーケンスである有し、全体のシーケンステーブルの初期化プロセスが関数にカプセル化されていることがわかり。これの利点は、コードの可用性を高めることであるだけでなく、より美しく。同時に、順序テーブルの初期化処理、ここでは、処理のアプリケーションに障害が発生した場合にアプリケーションの裁判官の物理的なスペースに注意を払うだけで、独自のニーズに応じて、「迅速な情報とアウト強制する」の操作を持っていました改善するためのif文のコード。

次のように主な機能にinitTableステートメントを呼び出すことによって、あなたは成功した空白の注文フォームを作成することができ、同時に、我々はまた、順序でテーブルにいくつかの要素を追加しようとすることができ、C言語のコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#define Size 5
typedef struct Table{
    int * head;
    int length;
    int size;
}table;
table initTable(){
    table t;
    t.head=(int*)malloc(Size*sizeof(int));
    if (!t.head)
    {
        printf("初始化失败");
        exit(0);
    }
    t.length=0;
    t.size=Size;
    return t;
}
//输出顺序表中元素的函数
void displayTable(table t){
    for (int i=0;i<t.length;i++) {
        printf("%d ",t.head[i]);
    }
    printf("\n");
}
int main(){
    table t=initTable();
    //向顺序表中添加元素
    for (int i=1; i<=Size; i++) {
        t.head[i-1]=i;
        t.length++;
    }
    printf("顺序表中存储的元素分别是:\n");
    displayTable(t);
    return 0;
}

次のようにプログラムの結果は以下のとおりです。

顺序表中存储的元素分别是:
1 2 3 4 5

あなたは順序テーブルは正常に初期化され、見ることができます。

基本的な操作シーケンステーブル

要素の挿入順序テーブル

挿入位置に応じて、テーブル内の既存のためにデータ要素を挿入し、次の3つの場合に分けることができます。

  1. 配列表のヘッダに挿入されました。
  2. テーブルの中間位置に要素を挿入します。
  3. 配列表の最後の要素として、配列表に既に要素をトレーリング。

挿入されるデータ要素の位置を見つけ、その後、次の2つのステップを行うためにトラバースすることによって表の位置の順にデータ要素がすべての使用、すなわち、解決するために同様異なるが、。

  • 挿入される要素の位置と全要素後方位置のその後の運動;
  • 空いた位置に配置された要素。

例えば、{1,2,3,4,5}以下のように三つの位置における要素6の挿入は、実装プロセスです。

  • 以下に示すように、第3のデータテーブル記憶素子を位置決めするトラバーサル順序
    ここに画像を挿入説明
    図に示すように、要素3と一体的に後方に位置を移動する後続の要素4と5:
    ここに画像を挿入説明
  • 下に示すように空いた位置に新しい要素6は、:
    ここに画像を挿入説明
    したがって、C言語データエレメント挿入された配列表のコードは次の通りであります:
//插入函数,其中,elem为插入的元素,add为插入到顺序表的位置
table addTable(table t,int elem,int add)
{
    //判断插入本身是否存在问题(如果插入元素位置比整张表的长度+1还大(如果相等,是尾随的情况),或者插入的位置本身不存在,程序作为提示并自动退出)
    if (add>t.length+1||add<1) {
        printf("插入位置有问题");
        return t;
    }
    //做插入操作时,首先需要看顺序表是否有多余的存储空间提供给插入的元素,如果没有,需要申请
    if (t.length==t.size) {
        t.head=(int *)realloc(t.head, (t.size+1)*sizeof(int));
        if (!t.head) {
            printf("存储分配失败");
            return t;
        }
        t.size+=1;
    } 
    //插入操作,需要将从插入位置开始的后续元素,逐个后移
    for (int i=t.length-1; i>=add-1; i--) {
        t.head[i+1]=t.head[i];
    }
    //后移完成后,直接将所需插入元素,添加到顺序表的相应位置
    t.head[add-1]=elem;
    //由于添加了元素,所以长度+1
    t.length++;
    return t;
}

複数の物理的空間の追加アプリケーションの動的配列がrealloc関数を使用していることに注意してください。そして、その後の要素の後、実際には、目標位置データ、または3は、直接超える古い要素は、次の新しい要素が挿入された場合にのみ、全体的なシフト処理を実現しています。

削除要素のシーケンステーブル

単にターゲット要素を見つけて、前方位置に、全体的なフォローアップのすべての要素、非常に単純な達成するためには、テーブルから指定された要素を削除します。

后续元素整体前移一个位置,会直接将目标元素删除,可间接实现删除元素的目的。

例えば、{1,2,3,4,5}下に示すように、要素3の削除処理:
ここに画像を挿入説明
したがって、C言語コードのシーケンステーブル削除要素:

table delTable(table t,int add){
    if (add>t.length || add<1) {
        printf("被删除元素的位置有误");
        exit(0);
    }
    //删除操作
    for (int i=add; i<t.length; i++) {
        t.head[i-1]=t.head[i];
    }
    t.length--;
    return t;
}

要素の順序テーブルを探します

ターゲット要素を見つけるためにテーブルの順序は、次のような、達成するための検索アルゴリズムの様々なを使用することができ、バイナリサーチアルゴリズム補間検索アルゴリズムと上のようにします。

ここでは、検索アルゴリズムの順序を選択し、特定の実装コードは次のように:

//查找函数,其中,elem表示要查找的数据元素的值
int searchable(table t,int elem)
{
	for (int i=0; i<t.length; i++) {
		if (t.head[i]==elem) {
			return i+1;
		}
	}
	return -1;//如果查找失败,返回-1
}

テーブル内の要素の順序を変更します

実装プロセスがある要素のテーブルの順序を変更します。

  1. ターゲット要素を探します。
  2. 直接要素の値を変更します。

要素C言語コードのテーブルの順序を変更します。

//更改函数,其中,elem为要更改的元素,newElem为新的数据元素
table replaceTable(table t,int elem,int newElem)
{
	int add=searchable(t, elem);
	t.head[add-1]=newElem;//由于返回的是元素在顺序表中的位置,所以-1就是该元素在数组中的下标
	return t;
}
void displayTable(table t){
	for (int i=0;i<t.length;i++) {
		printf("%d ",t.head[i]);
	}
	printf("\n");
}

復帰シーケンステーブルの最大エントリ数と長さを受け取ります

構造に属する2つの要素は、直接返すことができます

//返回顺序表的长度
int returnLength(table t)
{
	return t.length;//返回结构体的长度元素即可
}
//返回顺序表最大容纳表项个数
int returnSize(table t)
{
	return t.size;
}

これらは、完全なコードに関連する最も一般的な操作の使用時にテーブルの順序は、GitHubのにプッシュされています小さなパートナー自身のクローンを必要とし、あなたが良いと感じた場合、ここでは、スターを歓迎するポータルであるシーケンステーブル(順次記憶構造)に加えて、これに加えて、子供の靴の知識が私のブログに、歓迎(以上C、C ++、Javaの、Pythonの、などを知りたい再会のブログ)、私たちは一緒に議論!次に、私は次の時間アルゴリズム分析は、あなたと共有するC ++で実装する場合、ので、しばらくお待ちます他の言語のシーケンス・テーブルを更新していきます!

公開された19元の記事 ウォンの賞賛8 ビュー614

おすすめ

転載: blog.csdn.net/qq_43336390/article/details/103958584