0

わかりました私はリストをまったく使用したことがありませんが、私が何をしようとしているのかを説明するために最善を尽くします.


struct node {
 node(int value=0) { data=value; next=prev=this; }
 int data;
 node *next;
 node *prev;
};

class list {
 public:
 list(int N=0, int value=0);
 ˜list();
 bool empty() const { return N == 0; }
 bool full() const { return false; }
 int size() const { return N; }
 void resize(int);
 void clear();
 void insert(int, const int &);
 void remove(int);
 void push_back(const int &din) { insert(N, din); }
 void pop_back() { remove(N-1); }
 const int & back();
 int & operator[](int);
 private:
 int N;
 node *head;
 node *findnode(int);
}

_________________________________________
inline
node *list::findnode(int i) {
 if (i == -1)
 return head;
 node *p = head->next; 
 while (i--)
 p = p->next;
 return p;
}

findnode()の場合は前方検索をi<(N/2)行い、 の場合は逆検索を行うように関数を書き直すことになっていi>(N/2)ます。試してみましたが、セグメンテーション エラーが発生し続けます。何が起こっているのか正確にはわからないと思います。リスト クラスにリストされている他のすべての関数は、正しく記述されています。

Node 構造体を修正しました。これらのオブジェクトポインターと実際に何が起こっているのかについては、前もって申し訳ありません。これが私が試したものです。

 97 inline
 98 node *list::findnode(int i) {
 99         if (i == -1)
100                 return head;
101 
102         if (i < N/2){
103                 node *p = head->next;
104                 while (i--)
105                         p = p->next;
106 
107                 return p;
108         }
109 
110 
111         if (i > N/2){
112                 node *p = head->prev;
113 
114                 i =( i - N/2 );
115                 while (i--)
116                         p = p->prev;
117 
118                 return p;
119         }
120 }
4

1 に答える 1

0

完全な答えはしません。ただし、基本的には if-else を使用して 2 つのケースを分割します。最初のケースでは、上記のように前方を検索します。2 番目のケースでは、逆方向に検索します。しかし、これを行うには、ノード クラスを拡張して prev メンバーを持たせ、実際に双方向リンク リストにする必要があります。リストにリストの末尾を格納します。これを行うには、ほとんどのリスト関数を変更する必要があります。

inline
node *list::findnode(int i) {
 if(i < size()/2) {
   //search from beginning of list
 }
 else {
   //search from end of list by starting at tail
   node *p = tail;
   i = i-size/2;
   while(i--) {
     p = p->prev;
   }
   return p;
 }
于 2013-09-17T20:29:20.093 に答える