リニアテーブルは似ているのですか?
組立ラインの作業寿命が同じであるように、このような本として、使用することができます。
リニアテーブルは、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),
就阶数而言,己达到最低
顺序表的优点:
无需为表示结点间的逻辑关系而增加额外存储空间
可以方便地随机存取表中的任一结点
顺序表的缺点:
• 插入和删除运算不方便,必须移动大量的结点
• 顺序表要求占用连续的空间,存储分配只能预先进
行,因此当表长变化较大时,难以确定合适的存储
规模