テンプレート< クラス T> void SeqList <T> :: reSize(int newsize) { if(newSize!= maxSize) { T * newarray = new T [newSize]; / * サイズnewSizeのメモリ空間を開く データ型はT * / if(newarray == NULL) { cerr << " ストレージの割り当てに失敗しました!" << endl; exit(1 ); } } int n = last + 1 ; T * scrptr =データ; T * destptr = newarray; while(n--)* destptr ++ = * srcptr ++ ; []データを削除; data = newarray; maxSize = newSize; } テンプレート < クラス T> int SeqList <T> :: search(T&x)const { for(int i = 0 ; i <= last; i ++ ) { if(data [i] == x)return i + 1 ; } } / * 在第i位置挿入入x 挿入入前:a1、....、ai-1、ai、...、an 挿入入后:a1、...、ai-1、x、ai、...、an ai ai-1とaiの間のロジックが変更されました テーブルがいっぱいです:last> = MaxSize-1 last is last the element element array添字 1 <= l <=最後+ 2 が移動すると、より少ない、より高い挿入素子の効率 可動要素とテーブルの長さの数の挿入および位置に関連しているだけでなく、 最良の場合(I = N + 1)基礎文がゼロに実行されます、時間の複雑さO(1) * / / * 前方移動の シーケンステーブルの実現は、 最初の位置を上書きして削除位置が正当かどうかを判断することと同等 1 <= i <= last + 1 * / テンプレート < class T> bool SeqList <T> :: Remove(int i、T&x) { if(last ==- 1 || i < 1 || i> last + 1)return false ; x = data [i- 1 ];// i番目の要素配列のインデックスはi-1 for(int j = i; j <= last; j ++ ) { data [j - 1 ] = data [j]; // バックカバーフロント } last- ; // テーブル長-1 } // シーケンステーブルの入力アルゴリズム テンプレート< クラス T> void SeqList <T> :: input() { cout << " 入力要素の数" ; while(1 ) { cin >> last; if(last <= maxSize- 1)break ; cout << " 数値が正しくありません" ; } for(int i = 0 ; i <= last; i ++ ) { cin > data [i]; cout << i + 1 << endl; } } // シーケンステーブル出力アルゴリズム テンプレート< クラス T> void SeqList <T> :: output() { cout << " 現在の要素の最後の位置は" << last << endl; for(int i = 0; i <= last; i ++ ) { cout << " #" << i + 1 << " :" << data [i] << endl; } } // 顺序表的应用 // 并运算 空隙連合(SeqList < INT >&A、SeqList < INT >&B) { int型 N = A.length()、X。 int m = B.length(); for(int i = 1 ; i <= m; i ++ ) { B.getData(i、x); int k = A.Search(x); // Aで検索 if(k == 0) // Aに最後に挿入されたものが見つからない場合は、マージの結果をAに入れます(スペースを再度開くと無駄になります) {A.Insert(n、x); n ++ ;} } } // 交差演算 void Intersection(SeqList < int >&A、SeqList < int >&B) { int n = A.Length(); int m = B.長さ(); int i = 1 、x; while(i <= n) { A.getData(i、x); int k = B.search(x); if(k == 0)A.Remove(i、x)、n-- ; else i ++ ; } } // シーケンステーブルの利点: / * テーブル内の要素間の論理関係を表現するために追加のストレージスペースを追加する必要はありません。 ランダムアクセスは高速です。 テーブル内の任意の位置にある要素にアクセスするには。シーケンステーブルの欠点: (1)挿入および削除操作では多数の要素を移動する必要があります。 (2)テーブルの容量を決定するのは難しく、テーブルの容量を拡張するのは困難です。 (3)ストレージスペースの断片化 されたリンクリストは非常に大きいです。頻繁な挿入または削除に適しており、格納領域の要件は大きく異なります * / / * 単一リンクリストは、線形リンクリストとも呼ばれる最も単純なリンクリストです。これは、ポインターを使用してノード間の論理関係を表します。 ノードは、データフィールドとポインターフィールドの 線形構造を持っています。ヘッドへの最初のポインタ のノードは連続連続99.99%不連続な記憶保存することができない 論理的な順序をノードの順序は、異なる物理的とすることができる テーブルを容易に展開 * / / * シーケンステーブルが固定容量である 単鎖未定着 * / / * クラスの数コンセプト(単鎖)の発現 リストノード(ListNode)クラスの リスト(一覧)クラス * / // 1.複合クラス1 クラスリスト; // リンクリストクラス定義(複合モード) クラスLinkNode { friend クラスリスト; // リンクリストクラスはそのフレンドクラス private : int data; LinkNode * link; }; クラスリスト { private : LinNode * first; }; // Friendクラスには対称性がない?? // 複合クラス2:linkNodeクラス struct LinkNode を構造体 { int data: LinkNode * link; };で定義します。 class List { private : LinkNode * first; public : }; / * 構造によってListのカプセル化が失わ れますが、LIstオブジェクトに属するすべてのLinkNodeノードには、firstでのみアクセスできます。 * / // 2.ネストされたクラス クラスリスト { } // 3.継承 クラスLinkNode { protected : int data; LinkNode * link; }; クラスリスト { } // 書き終えていない場合は、PPTに移動してください。