シーケンステーブルおよびC実装

4410 ワード

論理構造上線形に分布するデータ要素は、実際の物理記憶構造においても同様に互いに隣接しており、この記憶構造を線形テーブルの順序記憶構造と呼ぶ
論理的に線形関係を持つデータは、前後の順序ですべて連続したメモリ空間に格納され、間に隙間が存在しない.このような記憶構造を順序記憶構造と呼ぶ.シーケンスストレージ構造を使用して格納されたデータは、最初の要素が存在するアドレスがこのストレージ空間の最初のアドレスです.ヘッダアドレスにより、格納されているすべてのデータに簡単にアクセスできます.ヘッダアドレスが失われない限り、データは永遠に見つかります(ロープの上のバッタは、あればあります).
1.順序テーブルの構造を定義する
    typedef struct Table{
        int * head;//       head         ,  “    ”
        int length;//          
        int size;//            
    }table;

2.順序表の作成
    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;
    }

3.順序表検索要素
普通遍歴
    //    ,  ,elem            
    int selectTable(table t,int elem){
        for (int i=0; i

4.順序表の要素の変更
検索アルゴリズムを呼び出して、データ要素の場所を見つけ、その場所で直接変更します.
    //    ,  ,elem       ,newElem       
    table amendTable(table t,int elem,int newElem){
        int add=selectTable(t, elem);
        t.head[add-1]=newElem;//                ,  -1            
        return t;
    }

5.順序表挿入要素
データ要素を挿入するには、次の3つのケースがあります.
1).     
2).           
3).       ,          

シーケンステーブルのどの位置にデータ要素を挿入しても、挿入する位置を見つけて、後続のデータ要素を全体的に1つ後ろに移動し、最後に直接飛び出した位置にデータ要素を挿入します.
    //    ,  ,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;
    }

6.順序表削除要素
配列から要素を削除する場合は、その要素が位置するすべてのデータ要素を1つ前に移動するだけでよい.
前に移動中に削除された要素が後の要素で上書きされ、間接的に削除操作が実現されます.
    table delTable(table t,int add){
        if (add>t.length || add<1) {
            printf("          ");
            exit(0);
        }
        //    
        for (int i=add; i

完全なコードインスタンス
    #include 
    #include 
    #define Size 6
    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;
    }
    table addTable(table t,int elem,int add)
    {
        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("      ");
            }
            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;
        t.length++;
        return t;
    }
    table delTable(table t,int add){
        if (add>t.length || add<1) {
            printf("          ");
            exit(0);
        }
        for (int i=add; i

注意for(int i;)
出力:
    :123456
    :23456
  2      5:253456
    3   :3
   3  6:256456