はじめにトライリニアテーブルのデータ構造 - 順次ストレージ

リニアテーブルは似ているのですか?

 

 

 組立ラインの作業寿命が同じであるように、このような本として、使用することができます。

リニアテーブルは、nそのようなA1、A2、A3等のデータ要素(ノード)の(N> = 0)である....から成る有限のシーケンス

Nは、テーブルの長さのデータ要素の数を定義します

n = 0の場合、テーブルは、(NULL)が空であります 

 

場合n> 0の非空のリストL =(A1 ...)であります

開始点と呼ばれるA1、ノードの終わり。

任意の隣接ノードパイルがAIと1 + aiを(1 <I <N)は、愛+ 1愛+ 1を愛するAIの直接の後継であり、直接の前駆体であります

 

 

 (インターネットからの写真)

もし線形形式が列車より明らかになるように、列車が唯一の機関車である(ノード開始)後(終端ノード)

機関車(ノード開始)キャビン(直接の前駆体)の正面ではなく、余分な後部(直接後継)の後ろにさらにキャリッジ(直接後継)、後部(終端ノード)の後ろではなく、後の前にものがありますコンパートメント(直接の前駆体)。

加算があることを理解することができ、各ノードは、直接かつ即時の前任者と後継者を持っています

 

リニアフォームの論理構造

線状の非空のテーブルの場合:線形テーブル・ノードは、一対一の関係(具体的には上記の例を訓練参照)を有しています

1)実際には直線状で唯一ノードA1が、前駆体は直接ではなく、唯一の直接後継A2です。

2)一つだけの端末ノードとがあり、直接的な後継者、およびいくつかの唯一の直接前駆体1は存在しません。

3)残りの内部ノードは、Al(<= I <= N-1)のみを有する直接前駆体は-1 AI、および直接後継+ 1愛。

 

リニアフォームの基本的な操作

 

削除しますが、探して挿入し、挿入バケットの位置は、初期秋のテーブル長の長さが取られます開始します

 

順番に格納されたリニアテーブルである。テーブルの接合を順次コンピュータメモリに格納されている連続したメモリ位置のグループ、線形化テーブル判定する内のデータ要素の当接関係即ち記憶空間内の記憶場所、論理構造隣接ノードの記憶場所が隣接しています。

リニアフォームを達成する格納順序との配列表と呼ばれます。それは一般的に使用される配列の配列にテーブル。 

配列との間のデータがある、データのセットを仮定:1,345,159,532,450,884,211

すなわち、ここで配列データ間の線形形式に線形関係、このデータの集合であるデータ間の論理的関係を表します。

 

 

 LOCアドレスA1(A1)を付与し、Cを表すデータユニットの各々は、アドレスAI算出します

場所(AI)=ランク(A1)+ C *(I-1)

例a3のアドレスのための

1、A1 = 0  
2  
3ポジション(A3)= A1 +(3 - 1 4  
5              = 0 + 2 
6  
7              = 2

初期化

学生{strudt 
INT ID、ID // 
文字名[30]; //名前
チャー性別; //性別
INTクラス; //クラス
のint年齢; //年齢

} 
学生= { "01"、 "zhangsan"、「M "" 201 "" 20「}。

  挿入

私はテーブルを参照に直線状の挿入動作(1 <= I <= N + 1)番目の位置、新しいノードxインサート、Nリニア形「の長さである:(a1は、.... AI-1は、+ 1のAI、AI、...)

N + 1リニアテーブルの長さに:

(A1、... AI-1 Xを、AI、1 + AI、...)

1)テーブルがいっぱいになると、挿入されません。

2)不正位置の挿入位置は、ない通常の挿入操作

 

 

 

void  InsertSeqlist (SeqList l,dataType x,int i){
if (l.length==Maxsize)exit("表已满");
if(i<1||l.length+1) exit (”位置错误“);//插入位置是否正确
for(j=l.length;j>=i;j--){//初始化i=l.length
l.data[j]=l.data[j-1];//依次后移
l.data[i-1]=x;//元素x置入到下标为i-1的位置
l.length++;}//表长度加1

假设线性表中含有n个数据元素,
在进行插入操作时,有 n+1个位置可插入
在每个位置插入数据的概率是:1/(n+1)
在i位置插入时,要移动n-i+1 个数据

平均时间复杂度为O(n)

 

删除

线性表的删除运算是指将表的i的结点删去,使长度为n的线性表长度”减一“

当要删除元素的位置I不在表长范围内(即i<1或i->length)时,为非法位置,不能做正常的删除操作

操作过程:

1,若i=n,则只要删除终端结点,无需移动结点;

2,若1<=i<=n-1,则必须将表中位置i+1,i+2,,,,,n的结点,依次前移到位置I

3,该表长度减1

void DeleteSeqList(SeqList L,int i) {
//删除线性表L中的第i个数据结点
if(i<1 || i>L.length) //检查位置是否合法
exit(“非法位置”);
for(j=i;j<L.length;j ++) //第i个元素的下标为i-1
L.data[j-1]=L.data[j]; //依次左移
L.length--; //表长度减1
}

 删除算法的分析

 

假设线性表中含有n个数据元素,
在进行删除操作时,有 n位置可删除
在每个位置删除数据的概率是:1/n
在i位置删除时,要移动 n-i+1个数据
假定在n个位置上删除元素的可能性均等,

平均时间复杂度为O(n)顺序存储结构表示的线性表,在做插入或删除操作时,平均需要移动大约一半的数据元素。

当线性表的数据元素量较大,并且经常要对其做插入或删除操作时,这一点需要值得考虑 

定位(查找)

定位运算LocateSeqlist(L,X)的功能是
求L中值等于X的结点序号的最小值,

当不存在这种结点时结果为0 从第一个元素 a1 起依次和x比较,直到找到一个与x相等的数据元素,则返回它在顺序表中的存储下标或序号;或者查遍整个表都没有找到与 x 相等的元素,返回0 

int LocateSeqlist(SeqList L, DataType x)
{
int i=0;
while ((i<L. length) && (L.data[i]!=x) ) //在顺序表中查找值为 x 的结点
i++;
if(i<L.length) return i+1; //若找到值为x的元素,返回元素的序号
else return 0; //未查找到值为x的元素,返回0
}
//顺序表的求表长操作,直接输出L.length即可

  1)设表的长度length=n,在插入算法中,元素的移动次数不仅与顺序表的长度
n有关, 还与插入的位置i有关。 插入算法在最坏情况下,其时间复杂度为O(n)
一般情况下元素比较和移动的次数为n-i+1次,插入算法的平均移动次数约为n/2
其时间复杂度是O(n)
2)删除算法DeleteSeqlist,可得其在最坏情况下元素移动次数为n-1,时间复杂
度为O(n),元素平均移动次数约为(n-1/2,时间复杂度为O(n)
3)对于定位算法,需要扫描顺序表中的元素。以参数x与表中结点值的比较为
标准操作,平均时间复杂度为O(n)。求表长和读表元素算法的时间复杂度为O(1)
就阶数而言,己达到最低

顺序表的优点:

无需为表示结点间的逻辑关系而增加额外存储空间
可以方便地随机存取表中的任一结点

顺序表的缺点:

插入和删除运算不方便,必须移动大量的结点
顺序表要求占用连续的空间,存储分配只能预先进
行,因此当表长变化较大时,难以确定合适的存储
规模

おすすめ

転載: www.cnblogs.com/X404/p/12013976.html