// ( r19.C ) // 線形リストの定石−その2 // #include // < 単方向リスト、格納要素は整数1個 > struct Node { int Item ; Node* Next ; } ; class List { Node *SNode,*ENode ; public: 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 ; } 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 ; } // 指定した要素が見つからなかった if ( DelNode == SNode ) { // 最初の要素を消去する場合 SNode = DelNode->Next ; delete DelNode ; 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" ; // 2 4 と表示されてOK }