一双索引容器的实现
实现一个双索引容器
基于双索引实现一个具有插入、查找、删除的容器,一个索引是 int 类型的,一个索引是自定义结构体类型的。
这个问题来自于网宿笔试的一个题目。
这里的功能已基本实现,支持双索引,自定义结构体类型是有两个 int 型元素的结构体。
支持迭代器,但是不支持模板。
实现如下:
1
#include
<
iostream
>
2 using namespace std;
3
4 class StructKey
5 {
6 private :
7 int key1;
8 int key2;
9 public :
10 StructKey( int k1 = 0 , int k2 = 0 ) : key1(k1), key2(k2) {}
11 bool operator == ( const StructKey & rhs)
12 {
13 return key1 == rhs.key1 && key2 == rhs.key2;
14 }
15 bool operator < ( const StructKey & rhs)
16 {
17 return key1 < rhs.key1 || key1 == rhs.key1 && key2 < rhs.key2;
18 }
19 ostream & print(ostream & out ) const
20 {
21 out << " ( " << key1 << " , " << key2 << " ) " ;
22 return out ;
23 }
24 };
25
26 ostream & operator << (ostream & out , const StructKey & sk)
27 {
28 return sk.print( out );
29 }
30
31 struct Node
32 {
33 int intkey;
34 StructKey skey;
35 Node * next;
36 Node( int i = 0 , int j = 0 , int k = 0 , Node * p = 0 ) : intkey(i), skey(j, k), next(p) {}
37 };
38
39 class DoulContainer
40 {
41 private :
42 Node * head;
43 Node * tail;
44 int size_;
45 public :
46 struct iterator
47 {
48 Node * p;
49 iterator() : p( 0 ) {}
50 iterator(Node * q) : p(q) {}
51 ~ iterator() {}
52 iterator & operator ++ ()
53 {
54 p = p -> next;
55 return * this ;
56 }
57 const iterator operator ++ ( int )
58 {
59 iterator t( * this );
60 ++ ( * this );
61 return t;
62 }
63 Node * operator -> ()
64 {
65 return p;
66 }
67 Node & operator * ()
68 {
69 return * p;
70 }
71 bool operator == ( const iterator & rhs)
72 {
73 return p == rhs.p;
74 }
75 bool operator != ( const iterator & rhs)
76 {
77 return ! (p == rhs.p);
78 }
79 };
80 public :
81 DoulContainer() : head( 0 ), tail( 0 ), size_( 0 ) {}
82 ~ DoulContainer()
83 {
84 clear();
85 }
86 DoulContainer( const DoulContainer & dc) : head( 0 ), tail( 0 ), size_( 0 )
87 {
88 Node * p = dc.head;
89 while (p != 0 )
90 {
91 insert( * p);
92 p = p -> next;
93 }
94 }
95 DoulContainer & operator = ( const DoulContainer & dc)
96 {
97 DoulContainer temp(dc);
98 myswap(head, temp.head);
99 myswap(tail, temp.tail);
100 myswap(size_, temp.size_);
101 return * this ;
102 }
103 void myswap(Node *& p, Node *& q)
104 {
105 Node * t = p;
106 p = q;
107 q = t;
108 }
109 void myswap( int & i, int & j)
110 {
111 int t = i;
112 i = j;
113 j = t;
114 }
115 void clear()
116 {
117 Node * p = head, * q;
118 while (p != 0 )
119 {
120 q = p -> next;
121 delete p;
122 p = q;
123 }
124 head = tail = 0 ;
125 size_ = 0 ;
126 }
127 iterator begin()
128 {
129 return head;
130 }
131 iterator end()
132 {
133 if (head == 0 )
134 {
135 return 0 ;
136 }
137 else
138 {
139 return tail -> next;
140 }
141 }
142 iterator find( int ik)
143 {
144 Node * p = head;
145 while (p != 0 )
146 {
147 if (p -> intkey == ik)
148 {
149 return p;
150 }
151 p = p -> next;
152 }
153 return end();
154 }
155 iterator find( const StructKey & sk)
156 {
157 Node * p = head;
158 while (p != 0 )
159 {
160 if (p -> skey == sk)
161 {
162 return p;
163 }
164 p = p -> next;
165 }
166 return end();
167 }
168 int size()
169 {
170 return size_;
171 }
172 int size() const
173 {
174 return size_;
175 }
176 void insert( const Node & dc)
177 {
178 iterator it = find(dc.intkey);
179 if (it != end())
180 {
181 return ;
182 }
183 Node * p = new Node(dc);
184 if (p == 0 )
185 {
186 exit( 1 );
187 }
188 p -> next = 0 ;
189 if (head == 0 )
190 {
191 head = tail = p;
192 }
193 else
194 {
195 tail -> next = p;
196 tail = p;
197 }
198 ++ size_;
199 }
200
201 StructKey & operator []( int ik)
202 {
203 iterator it = find(ik);
204 if (it != end())
205 {
206 return it -> skey;
207 }
208 Node * p = new Node;
209 if (p == 0 )
210 {
211 exit( 1 );
212 }
213 p -> intkey = ik;
214 p -> next = 0 ;
215 if (head == 0 )
216 {
217 head = tail = p;
218 }
219 else
220 {
221 tail -> next = p;
222 tail = p;
223 }
224 ++ size_;
225 return p -> skey;
226 }
227 int & operator []( const StructKey & sk)
228 {
229 iterator it = find(sk);
230 if (it != end())
231 {
232 return it -> intkey;
233 }
234 Node * p = new Node;
235 if (p == 0 )
236 {
237 exit( 1 );
238 }
239 p -> skey = sk;
240 p -> next = 0 ;
241 if (head == 0 )
242 {
243 head = tail = 0 ;
244 }
245 else
246 {
247 tail -> next = p;
248 tail = p;
249 }
250 ++ size_;
251 return p -> intkey;
252 }
253 void del( int ik)
254 {
255 Node * p, * q;
256 q = head;
257 if (q != 0 )
258 {
259 while (q != 0 && q -> intkey == ik)
260 {
261 head = head -> next;
262 delete q;
263 q = head;
264 -- size_;
265 }
266 if (q == 0 )
267 {
268 return ;
269 }
270 p = q -> next;
271 while (p != 0 )
272 {
273 if (p -> intkey == ik)
274 {
275 q -> next = p -> next;
276 delete p;
277 p = q -> next;
278 -- size_;
279 }
280 else
281 {
282 q = p;
283 p = p -> next;
284 }
285 }
286 }
287 }
288 void del( const StructKey & sk)
289 {
290 Node * p, * q;
291 q = head;
292 if (q != 0 )
293 {
294 while (q != 0 && q -> skey == sk)
295 {
296 head = head -> next;
297 delete q;
298 q = head;
299 -- size_;
300 }
301 if (q == 0 )
302 {
303 return ;
304 }
305 p = q -> next;
306 while (p != 0 )
307 {
308 if (p -> skey == sk)
309 {
310 q -> next = p -> next;
311 delete p;
312 p = q -> next;
313 -- size_;
314 }
315 else
316 {
317 q = p;
318 p = p -> next;
319 }
320 }
321 }
322 }
323 };
324
325 int main()
326 {
327 DoulContainer dc;
328 cout << dc.size() << endl;
329 for ( int i = 0 ; i < 10 ; ++ i)
330 {
331 dc.insert(Node(i, i, i));
332 }
333 cout << dc.size() << endl;
334 for (DoulContainer::iterator it = dc.begin(); it != dc.end(); ++ it)
335 {
336 cout << it -> intkey << it -> skey << endl;
337 }
338 DoulContainer dc2(dc), dc3;
339 cout << dc.size() << endl;
340 dc.clear();
341 cout << dc.size() << endl;
342 cout << endl;
343 cout << dc2.size() << endl;
344 for ( int i = 0 ; i < 10 ; ++ i)
345 {
346 dc2[i] = StructKey(i + 100 , i + 100 );
347 }
348 dc2.del( 5 );
349 for (DoulContainer::iterator it = dc2.begin(); it != dc.end(); ++ it)
350 {
351 cout << it -> intkey << it -> skey << endl;
352 }
353 dc3 = dc2;
354 cout << dc2.size() << endl;
355 dc2.clear();
356 cout << dc2.size() << endl;
357 cout << endl;
358 cout << dc3.size() << endl;
359 for ( int i = 0 ; i < 10 ; ++ i)
360 {
361 dc3[StructKey(i + 100 , i + 100 )] = i + 10000 ;
362 }
363 dc3.del(StructKey( 105 , 105 ));
364 dc3.del(StructKey( 107 , 107 ));
365 for (DoulContainer::iterator it = dc3.begin(); it != dc.end(); ++ it)
366 {
367 cout << it -> intkey << it -> skey << endl;
368 }
369 cout << dc3.size() << endl;
370 dc3.clear();
371 cout << dc3.size() << endl;
372 return 0 ;
373 }
2 using namespace std;
3
4 class StructKey
5 {
6 private :
7 int key1;
8 int key2;
9 public :
10 StructKey( int k1 = 0 , int k2 = 0 ) : key1(k1), key2(k2) {}
11 bool operator == ( const StructKey & rhs)
12 {
13 return key1 == rhs.key1 && key2 == rhs.key2;
14 }
15 bool operator < ( const StructKey & rhs)
16 {
17 return key1 < rhs.key1 || key1 == rhs.key1 && key2 < rhs.key2;
18 }
19 ostream & print(ostream & out ) const
20 {
21 out << " ( " << key1 << " , " << key2 << " ) " ;
22 return out ;
23 }
24 };
25
26 ostream & operator << (ostream & out , const StructKey & sk)
27 {
28 return sk.print( out );
29 }
30
31 struct Node
32 {
33 int intkey;
34 StructKey skey;
35 Node * next;
36 Node( int i = 0 , int j = 0 , int k = 0 , Node * p = 0 ) : intkey(i), skey(j, k), next(p) {}
37 };
38
39 class DoulContainer
40 {
41 private :
42 Node * head;
43 Node * tail;
44 int size_;
45 public :
46 struct iterator
47 {
48 Node * p;
49 iterator() : p( 0 ) {}
50 iterator(Node * q) : p(q) {}
51 ~ iterator() {}
52 iterator & operator ++ ()
53 {
54 p = p -> next;
55 return * this ;
56 }
57 const iterator operator ++ ( int )
58 {
59 iterator t( * this );
60 ++ ( * this );
61 return t;
62 }
63 Node * operator -> ()
64 {
65 return p;
66 }
67 Node & operator * ()
68 {
69 return * p;
70 }
71 bool operator == ( const iterator & rhs)
72 {
73 return p == rhs.p;
74 }
75 bool operator != ( const iterator & rhs)
76 {
77 return ! (p == rhs.p);
78 }
79 };
80 public :
81 DoulContainer() : head( 0 ), tail( 0 ), size_( 0 ) {}
82 ~ DoulContainer()
83 {
84 clear();
85 }
86 DoulContainer( const DoulContainer & dc) : head( 0 ), tail( 0 ), size_( 0 )
87 {
88 Node * p = dc.head;
89 while (p != 0 )
90 {
91 insert( * p);
92 p = p -> next;
93 }
94 }
95 DoulContainer & operator = ( const DoulContainer & dc)
96 {
97 DoulContainer temp(dc);
98 myswap(head, temp.head);
99 myswap(tail, temp.tail);
100 myswap(size_, temp.size_);
101 return * this ;
102 }
103 void myswap(Node *& p, Node *& q)
104 {
105 Node * t = p;
106 p = q;
107 q = t;
108 }
109 void myswap( int & i, int & j)
110 {
111 int t = i;
112 i = j;
113 j = t;
114 }
115 void clear()
116 {
117 Node * p = head, * q;
118 while (p != 0 )
119 {
120 q = p -> next;
121 delete p;
122 p = q;
123 }
124 head = tail = 0 ;
125 size_ = 0 ;
126 }
127 iterator begin()
128 {
129 return head;
130 }
131 iterator end()
132 {
133 if (head == 0 )
134 {
135 return 0 ;
136 }
137 else
138 {
139 return tail -> next;
140 }
141 }
142 iterator find( int ik)
143 {
144 Node * p = head;
145 while (p != 0 )
146 {
147 if (p -> intkey == ik)
148 {
149 return p;
150 }
151 p = p -> next;
152 }
153 return end();
154 }
155 iterator find( const StructKey & sk)
156 {
157 Node * p = head;
158 while (p != 0 )
159 {
160 if (p -> skey == sk)
161 {
162 return p;
163 }
164 p = p -> next;
165 }
166 return end();
167 }
168 int size()
169 {
170 return size_;
171 }
172 int size() const
173 {
174 return size_;
175 }
176 void insert( const Node & dc)
177 {
178 iterator it = find(dc.intkey);
179 if (it != end())
180 {
181 return ;
182 }
183 Node * p = new Node(dc);
184 if (p == 0 )
185 {
186 exit( 1 );
187 }
188 p -> next = 0 ;
189 if (head == 0 )
190 {
191 head = tail = p;
192 }
193 else
194 {
195 tail -> next = p;
196 tail = p;
197 }
198 ++ size_;
199 }
200
201 StructKey & operator []( int ik)
202 {
203 iterator it = find(ik);
204 if (it != end())
205 {
206 return it -> skey;
207 }
208 Node * p = new Node;
209 if (p == 0 )
210 {
211 exit( 1 );
212 }
213 p -> intkey = ik;
214 p -> next = 0 ;
215 if (head == 0 )
216 {
217 head = tail = p;
218 }
219 else
220 {
221 tail -> next = p;
222 tail = p;
223 }
224 ++ size_;
225 return p -> skey;
226 }
227 int & operator []( const StructKey & sk)
228 {
229 iterator it = find(sk);
230 if (it != end())
231 {
232 return it -> intkey;
233 }
234 Node * p = new Node;
235 if (p == 0 )
236 {
237 exit( 1 );
238 }
239 p -> skey = sk;
240 p -> next = 0 ;
241 if (head == 0 )
242 {
243 head = tail = 0 ;
244 }
245 else
246 {
247 tail -> next = p;
248 tail = p;
249 }
250 ++ size_;
251 return p -> intkey;
252 }
253 void del( int ik)
254 {
255 Node * p, * q;
256 q = head;
257 if (q != 0 )
258 {
259 while (q != 0 && q -> intkey == ik)
260 {
261 head = head -> next;
262 delete q;
263 q = head;
264 -- size_;
265 }
266 if (q == 0 )
267 {
268 return ;
269 }
270 p = q -> next;
271 while (p != 0 )
272 {
273 if (p -> intkey == ik)
274 {
275 q -> next = p -> next;
276 delete p;
277 p = q -> next;
278 -- size_;
279 }
280 else
281 {
282 q = p;
283 p = p -> next;
284 }
285 }
286 }
287 }
288 void del( const StructKey & sk)
289 {
290 Node * p, * q;
291 q = head;
292 if (q != 0 )
293 {
294 while (q != 0 && q -> skey == sk)
295 {
296 head = head -> next;
297 delete q;
298 q = head;
299 -- size_;
300 }
301 if (q == 0 )
302 {
303 return ;
304 }
305 p = q -> next;
306 while (p != 0 )
307 {
308 if (p -> skey == sk)
309 {
310 q -> next = p -> next;
311 delete p;
312 p = q -> next;
313 -- size_;
314 }
315 else
316 {
317 q = p;
318 p = p -> next;
319 }
320 }
321 }
322 }
323 };
324
325 int main()
326 {
327 DoulContainer dc;
328 cout << dc.size() << endl;
329 for ( int i = 0 ; i < 10 ; ++ i)
330 {
331 dc.insert(Node(i, i, i));
332 }
333 cout << dc.size() << endl;
334 for (DoulContainer::iterator it = dc.begin(); it != dc.end(); ++ it)
335 {
336 cout << it -> intkey << it -> skey << endl;
337 }
338 DoulContainer dc2(dc), dc3;
339 cout << dc.size() << endl;
340 dc.clear();
341 cout << dc.size() << endl;
342 cout << endl;
343 cout << dc2.size() << endl;
344 for ( int i = 0 ; i < 10 ; ++ i)
345 {
346 dc2[i] = StructKey(i + 100 , i + 100 );
347 }
348 dc2.del( 5 );
349 for (DoulContainer::iterator it = dc2.begin(); it != dc.end(); ++ it)
350 {
351 cout << it -> intkey << it -> skey << endl;
352 }
353 dc3 = dc2;
354 cout << dc2.size() << endl;
355 dc2.clear();
356 cout << dc2.size() << endl;
357 cout << endl;
358 cout << dc3.size() << endl;
359 for ( int i = 0 ; i < 10 ; ++ i)
360 {
361 dc3[StructKey(i + 100 , i + 100 )] = i + 10000 ;
362 }
363 dc3.del(StructKey( 105 , 105 ));
364 dc3.del(StructKey( 107 , 107 ));
365 for (DoulContainer::iterator it = dc3.begin(); it != dc.end(); ++ it)
366 {
367 cout << it -> intkey << it -> skey << endl;
368 }
369 cout << dc3.size() << endl;
370 dc3.clear();
371 cout << dc3.size() << endl;
372 return 0 ;
373 }