// ( r18.C ) // 線形リストの定石−その1 // // < 単方向リスト、格納要素は整数1個 > #include struct Node { int Item ; Node* Next ; } ; class List { // 線形リストヘのデ−タの追加と消去を行う。但し Node *SNode,*ENode ; // 消去操作が不完全である。修正版をその2で示す public: List() ; ~List() ; void Add( int i ) ; void Del( int i ) ; void Show() ; } ; List::List() // コンストラクタ { Node* N = new Node ; N->Item = 0 ; N->Next = NULL ; SNode = N ; ENode = N ; // 最初 SNode も ENode も同じ所を差している } List::~List() { // メンバ関数の { を詰めて書きました Node* Cnt = SNode ; while ( Cnt != NULL ) { Cnt = Cnt->Next ; delete Cnt ; } } void List::Show() { Node* Cnt = SNode ; while ( Cnt->Next != NULL ) { cout << Cnt->Item << "\n" ; Cnt = Cnt->Next ;}; } void List::Add( int i ) { // 要素追加メンバ関数 Node* N = ENode ; N->Item = i ; N->Next = new Node ; N = N->Next ; N->Next = NULL ; ENode = N ; } void List::Del( int i ) { // 要素消去メンバ関数 Node* Cnt = SNode ; Node* DelNode = NULL ; while ( Cnt->Next != NULL ) { if ( Cnt->Item == i ) { DelNode = Cnt ; break ; } Cnt = Cnt->Next ; } if ( DelNode == NULL ) { return ; } // 指定した要素が見つからなかった Cnt = SNode ; while ( Cnt->Next != NULL ) { if ( Cnt->Next == DelNode ) { Cnt->Next = DelNode->Next ; delete DelNode ; return ; } Cnt = Cnt->Next ; } ; } main() { List AList ; AList.Add( 1 ) ; AList.Add( 2 ) ; AList.Add( 3 ) ; AList.Del( 1 ) ; AList.Del( 3 ) ; AList.Add( 4 ) ; AList.Show() ; cout << "\n" ; // 1 2 4 と表示される。最初の要素である } // 1 が消されない。