双链表并使用反向搜索

时间:2013-09-17 20:21:28

标签: c++ list

好的,我从来没有使用过列表,但是我会尽力解释我想要做的事情。


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 }

1 个答案:

答案 0 :(得分:0)

我不会给出完整的答案。但基本上使用if-else来分割你的两个案例。在第一种情况下,像上面一样搜索前进。在第二种情况下反向搜索。但是为了做到这一点,你应该扩充你的节点类以拥有一个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;
 }