amdb

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SparseVector.hh

 1 class SparseVector
 2 {
 3 private:
 4     //结构体不一定会用到,不用初始化
 5     struct node
 6     {
 7         int index;
 8         int value;
 9         node *next;
10         
11         node(int index, int value, node *next = 0) : index(index), value(value), next(next) {}
12     };
13     //这些才是真正的数据成员,要初始化的
14     int size;
15     node *start;    
16 
17     void clear();
18     void copyList(const SparseVector &sv);
19     void setNonzeroElem(int index, int value);
20     void removeElem(int index);
21     void checkListOrder();
22 public:
23     SparseVector(int size);
24     const int getSize()const;
25 
26     ~SparseVector();
27     SparseVector(const SparseVector &sv);
28     SparseVector & operator= (const SparseVector &sv);
29     int getElem(int idx);
30     void setElem(int index, int value);
31 
32 };
View Code

SparseVector.cc

  1 #include "SparseVector.hh"
  2 #include <cassert>
  3 #include <iostream>
  4 using namespace std;
  5 //单参数构造函数
  6 SparseVector::SparseVector(int size):size(size)
  7 {
  8     start = 0;
  9 }
 10 
 11 const int SparseVector::getSize()const
 12 {
 13     return size;
 14 }
 15 //成员函数都默认带有this指针,所以默认对调用这个函数的对象进行操作,所以不用再传本对象的地址了。
 16 void SparseVector::clear()
 17 {
 18     node *next;
 19     node *current;    
 20     current = start;
 21     while(current != 0)
 22     {
 23         next = current->next;
 24         delete current;
 25         current = next;
 26     }
 27     start = 0;
 28 }
 29 //对本对象进行操作,调用成员行数也是默认对本对象进行操作,不用传本对象地址。
 30 SparseVector::~SparseVector()
 31 {
 32     clear();
 33 }
 34 
 35 void SparseVector::copyList(const SparseVector &sv)
 36 {
 37     size = sv.getSize();
 38     node *current;
 39     node *otherCurrent =sv.start;
 40     node *prev = 0;
 41 
 42     while(otherCurrent != 0)
 43     {
 44         current = new node(otherCurrent->index, otherCurrent->value);
 45         if(prev == 0)
 46         {
 47             start = current;
 48             prev = current;
 49         }
 50         prev->next = current;
 51         prev = current;
 52         otherCurrent = otherCurrent->next;
 53     }
 54 }
 55 
 56 SparseVector::SparseVector(const SparseVector &sv)
 57 {
 58     copyList(sv);
 59 }
 60 //注意自赋值,并且直接调用私有帮助函数。
 61 SparseVector & SparseVector:: operator= (const SparseVector &sv)
 62 {
 63     if (this == &sv)
 64     {
 65         return *this;
 66     }
 67     clear();
 68     copyList(sv);
 69     return *this;
 70 }
 71 //难点
 72 int SparseVector::getElem(int idx)
 73 {
 74     node *current = start;
 75     while(current != 0 && current->index < idx)//过滤,两个条件
 76     {
 77         current = current->next;
 78     }
 79     if(current == 0)//注意判断条件先后次序,先排除current为0情况
 80     {
 81         return 0;
 82     }
 83     else if(current->index == idx)//如果先执行这个,则current为0时,会直接产生段错误
 84     {
 85         return current->value;
 86     }    
 87     else 
 88     {
 89         return 0;
 90     }
 91 }
 92 //难点,分种情况讨论:1,初始为空。2,插到最后面。3,插到最前面。4,插到中间。
 93 void SparseVector::setNonzeroElem(int index, int value)
 94 {
 95     assert(value != 0);
 96     node *current = start;
 97     node *prev = 0;
 98     
 99     if(start == 0)//容易遗漏,链表初始为空的情况。(1)
100     {
101         start = new node(index, value);
102     }    
103     else//除此情况外(2,3,4)
104     {
105         while(current != 0 && current->index < index)//过滤,两个条件,保证current指向应该指的结点,或其之后的结点。prev指向值小于应该的结点。
106         {
107             prev = current;
108             current = current->next;//别忘了自增
109         }
110     /*2选1
111      *     if(current == start)//插到最前面,current所指结点大于等于它
112         {
113             if(current->index == index)//等于
114             {    
115                 current->value = value;
116             }
117             else//大于
118             {
119                 node *other = new node(index, value, start);
120                 start = other;
121             }
122         }    
123         else if(current == 0)//插到最后面,current所指结点小于它
124         {
125             node *other = new node(index, value, 0);
126             prev->next = other;
127         }
128         else//插到中间,current所指结点大于等于它
129         {
130             if(current->index == index)//current所指结点等于它
131             {
132                 current->value = value;
133             }
134             else//current所指结点结点大于它
135             {
136                 node *other = new node(index, value, current);
137                 prev->next = other;
138             }
139         }
140 */
141         if(current == 0)//插到最后边
142         {
143             node *other = new node(index, value);
144             prev->next = other;
145         }
146         else if(current -> index == index)//current所指结点等于它的值
147         {
148             current->value =value;
149         }
150         else if(current == start)//在最开始的地方
151         {
152             node *other = new node(index, value, start);
153             start = other;
154         }
155         else //在中间
156         {
157             node *other = new node(index, value, current);
158             prev->next = other;        
159         }
160     }
161 }
162 
163 void SparseVector::removeElem(int index)
164 {
165     node *current = start;
166     node *prev = 0;
167     while(current != 0 && current->index < index)//过滤
168     {
169         prev = current;
170         current = current->next;
171     }
172     if(current->index == index)//如果是这个结点
173     {
174         if(current == start)//是开始结点
175         {
176             prev = current;
177             current = current->next;
178             delete prev;
179             start = current;
180             return; 
181         }
182         else//是中间结点或者是后边的节点(相同的)
183         {
184             prev->next = current->next;
185             delete current;
186             return;
187         }
188     }
189     else 
190     {
191         return;
192     }
193 }
194 
195 void SparseVector::setElem(int index, int value)
196 {
197     if(value != 0)
198     {
199         setNonzeroElem(index, value);
200     }
201     else
202     {
203         removeElem(index);
204     }
205 }
206 
207 void SparseVector::checkListOrder()
208 {
209     node *current = start;
210     while(current != 0)
211     {
212         cout<<"("<<current->index<<"  |  "<<current->value<<")"<<endl;
213         current = current->next;
214     }
215     return;
216 }
View Code

 

posted on 2015-04-30 10:22  amdb  阅读(271)  评论(0编辑  收藏  举报