【线性表】 LineTable

  1 #include<iostream>
  2 #include<windows.h>
  3 
  4 
  5 using namespace std;
  6 
  7 
  8 #define MAX 3
  9 
 10 
 11 typedef struct _DATA_
 12 {
 13     int iAge;
 14     char szName[20];
 15 
 16 
 17 }Data,*pData;
 18 
 19 
 20 typedef struct _LINETABLE_
 21 {
 22 
 23     pData  pDataTemp;
 24 
 25     int iMax;
 26     int iSize;
 27 }LineTable, *pLineTable;
 28 
 29 
 30 int Compare(LineTable LineTableTemp, Data DataTemp);
 31 
 32 class CLineTable
 33 {
 34 
 35 public:
 36     CLineTable()
 37     {
 38 
 39     }
 40     ~CLineTable()
 41     {
 42 
 43     }
 44 
 45 
 46     bool IsExist(LineTable& LineTableTemp);
 47     void InputData(LineTable& LineTableTemp,Data DataTemp)
 48     {
 49 
 50         LineTableTemp.pDataTemp[LineTableTemp.iSize] = DataTemp;
 51 
 52         LineTableTemp.iSize++;
 53     }
 54     bool InitLineTable(LineTable& LineTableTemp);
 55     void DestroyLineTable(LineTable& LineTableTemp);
 56     bool ClearLineTable(LineTable& LineTableTemp);
 57     bool IsEmpty(LineTable& LineTableTemp);
 58     bool GetLength(LineTable& LineTableTemp, DWORD& dwLength);
 59     bool GetElement(LineTable& LineTableTemp, pData pDataTemp, DWORD dwIndex);
 60     bool LocateElement(LineTable& LineTableTemp, Data DataTemp,
 61         int& iIndex, int Compare(LineTable,Data));
 62     bool PreElement(LineTable& LineTableTemp, Data DataTemp,
 63         Data& DataPre, int Compare(LineTable LineTableTemp, Data DataTemp));
 64 
 65     bool NextElement(LineTable& LineTableTemp, Data DataTemp,
 66         Data& DataNext, int Compare(LineTable, Data));
 67 
 68     bool TravelLineTable(LineTable& LineTableTemp)
 69     {
 70         if(IsExist(LineTableTemp))
 71         {
 72             int i = 0;
 73             for(i=0;i<LineTableTemp.iSize;i++)
 74             {
 75                 cout<<LineTableTemp.pDataTemp[i].szName<<" "
 76                     <<LineTableTemp.pDataTemp[i].iAge<<endl;
 77             }
 78             return true;
 79         }
 80 
 81         return false;
 82     }
 83 
 84     bool InsertData(LineTable& LineTableTemp,
 85         Data DataTemp, Data DataNew);
 86 
 87     bool DeleteData(LineTable& LineTableTemp,
 88         Data DataTemp, Data& DataDel);
 89 };
 90 
 91 
 92 
 93 
 94 bool CLineTable::IsExist(LineTable& LineTableTemp)
 95 {
 96     if(LineTableTemp.pDataTemp != NULL)
 97     {
 98         return true;
 99     }
100 
101     return false;
102 }
103 
104 
105 
106 bool CLineTable::InitLineTable(LineTable& LineTableTemp)
107 {
108 
109     LineTableTemp.iMax = MAX;
110 
111     LineTableTemp.pDataTemp = new Data[LineTableTemp.iMax];
112 
113     if(LineTableTemp.pDataTemp == NULL)
114     {
115         return false;
116     }
117 
118     memset(LineTableTemp.pDataTemp,0,
119         sizeof(Data)*LineTableTemp.iMax);
120 
121     LineTableTemp.iSize = 0;
122 
123 
124     return true;
125 }
126 
127 
128 void CLineTable::DestroyLineTable(LineTable& LineTableTemp)
129 {
130 
131     if(LineTableTemp.pDataTemp != NULL)
132     {
133         delete LineTableTemp.pDataTemp;
134     }
135     LineTableTemp.iMax = 0;
136     LineTableTemp.iSize = 0;
137     LineTableTemp.pDataTemp = NULL;        //这个一定要赋为空
138 }    
139 
140 
141 
142 bool CLineTable::ClearLineTable(LineTable& LineTableTemp)
143 {
144     if(IsExist(LineTableTemp))
145     {
146         memset(LineTableTemp.pDataTemp,0,
147             sizeof(Data)*LineTableTemp.iSize);
148         
149         
150         LineTableTemp.iSize = 0;
151 
152         return true;
153     }
154 
155 
156 
157     return false;
158 }
159 
160 
161 bool CLineTable::IsEmpty(LineTable& LineTableTemp)
162 {
163     if(IsExist(LineTableTemp))
164     {    
165         if(LineTableTemp.iSize == 0)
166         {
167             return true;
168         }
169     }
170 
171     return false;
172 }
173 
174 
175 bool CLineTable::GetLength(LineTable& LineTableTemp, DWORD& dwLength)
176 {
177     if(IsExist(LineTableTemp))
178     {
179         dwLength = LineTableTemp.iSize;
180         
181         return true;
182     }
183 
184     return false;
185 }
186 
187 
188 
189 
190 
191 
192 bool CLineTable::GetElement(LineTable& LineTableTemp, pData pDataTemp, DWORD dwIndex)
193 {
194     if(IsExist(LineTableTemp) && 1<=dwIndex 
195         && dwIndex<=LineTableTemp.iSize)
196     {
197         *pDataTemp = LineTableTemp.pDataTemp[--dwIndex];
198 
199         return true;
200     }
201 
202     return false;
203 }
204 
205 bool CLineTable::LocateElement(LineTable& LineTableTemp, 
206                                Data DataTemp,
207                                int& iIndex, 
208         int Compare(LineTable,Data))
209 {
210 
211     if(IsExist(LineTableTemp))
212     {
213         iIndex = Compare(LineTableTemp, DataTemp);
214 
215         if(iIndex == -1)
216         {
217             return false;
218         }
219 
220         return true;
221     }
222 
223     return false;
224 }
225 
226 
227 bool CLineTable::PreElement(LineTable& LineTableTemp, Data DataTemp,
228         Data& DataPre, int Compare(LineTable, Data))
229 {
230     int iIndex = 0;
231 
232     if(IsExist(LineTableTemp))
233     {
234         if(LocateElement(LineTableTemp,DataTemp,iIndex,Compare))
235         {
236             iIndex--;
237             if(iIndex>0)
238             {
239                 DataPre = LineTableTemp.pDataTemp[iIndex-1];
240             
241                 return true;
242             }
243         }
244 
245         cout<<"No Precursor."<<endl;
246         return false;
247     }
248     return false;
249 }
250 
251 
252 bool CLineTable::NextElement(LineTable& LineTableTemp, Data DataTemp,
253         Data& DataNext, int Compare(LineTable, Data))
254 {
255     int iIndex = 0;
256 
257     if(IsExist(LineTableTemp))
258     {
259         if(LocateElement(LineTableTemp,DataTemp,iIndex,Compare))
260         {
261             iIndex--;
262             if(iIndex<LineTableTemp.iSize-1)
263             {
264                 DataNext = LineTableTemp.pDataTemp[iIndex+1];
265             
266                 return true;
267             }
268         }
269 
270         cout<<"No Successor."<<endl;
271         return false;
272     }
273     return false;
274 
275 
276 }
277 
278 
279 bool CLineTable::InsertData(LineTable& LineTableTemp,
280         Data DataTemp, Data DataNew)
281 {
282     int i = 0;
283     int iIndex = 0;
284 
285     if(LineTableTemp.iSize>=LineTableTemp.iMax)
286     {
287         LineTableTemp.pDataTemp = 
288             (pData)realloc(LineTableTemp.pDataTemp,
289             sizeof(Data)*(LineTableTemp.iMax+MAX));
290 
291 
292         cout<<endl<<"Allocate"<<endl;
293 
294         if(LineTableTemp.pDataTemp == NULL)
295         {
296             return false;
297         }
298         else
299         {
300             LineTableTemp.iMax+=MAX;
301         }
302 
303     }
304 
305     if(LocateElement(LineTableTemp, DataTemp, iIndex, Compare))
306     {
307         iIndex--;
308         for(i=LineTableTemp.iSize-1;i>=iIndex;i--)
309         {
310             LineTableTemp.pDataTemp[i+1] = 
311                 LineTableTemp.pDataTemp[i];
312         }
313 
314 
315         LineTableTemp.pDataTemp[iIndex] = DataNew;
316     
317         LineTableTemp.iSize++;
318     
319         return true;
320     }
321 }
322 
323 
324 
325 bool CLineTable::DeleteData(LineTable& LineTableTemp,
326         Data DataTemp, Data& DataDel)
327 {
328     int i = 0;
329     int iIndex = 0;
330     if(LocateElement(LineTableTemp, DataTemp, iIndex, Compare))
331     {
332         iIndex--;
333         DataDel = LineTableTemp.pDataTemp[iIndex];
334 
335         for(i=iIndex;i<LineTableTemp.iSize;i++)
336         {
337             LineTableTemp.pDataTemp[i] = 
338                 LineTableTemp.pDataTemp[i+1];
339         }
340 
341         LineTableTemp.iSize--;
342         
343         return true;
344     }
345 }
346 
347 
348 int main()
349 {
350     
351     CLineTable CLineTableObject;
352 
353     LineTable LineTableTemp = {0};
354 
355     DWORD dwLength = 0;
356 
357     CLineTableObject.InitLineTable(LineTableTemp);
358 
359 
360     Data DataTemp = {0};
361 
362     int iIndex = 0;
363     Data DataNew = {0};
364     Data DataDel = {0};
365     int i = 0;
366     for(i=0;i<3;i++)
367     {
368         cout<<"Input Name and Age:"<<endl;
369 
370         cin>>DataTemp.szName;
371         cin>>DataTemp.iAge;
372 
373         CLineTableObject.InputData(LineTableTemp,DataTemp);        
374     }
375     if (!CLineTableObject.IsEmpty(LineTableTemp))
376     {
377         cout<<endl<<"LineTable have Data."<<endl;
378     }
379 
380 
381 
382     if (CLineTableObject.GetLength(LineTableTemp,dwLength))
383     {
384         cout<<"LineTable's Size: "<<dwLength<<endl<<endl;
385     }
386 
387 
388     cout<<"Input Index:"<<endl;
389 
390 
391     cin>>iIndex;
392 
393 
394     if(CLineTableObject.GetElement(LineTableTemp,&DataNew,
395         iIndex))
396     {
397 
398         cout<<DataNew.szName<<"  "<<DataNew.iAge<<endl;
399     }
400     else
401     {
402         cout<<"Position Error."<<endl;
403     }
404 
405 
406     cout<<endl<<"Input Data To Find:"<<endl;
407 
408     cin>>DataTemp.szName;
409     cin>>DataTemp.iAge;
410 
411     if (CLineTableObject.LocateElement(LineTableTemp,DataTemp,
412         iIndex ,Compare))
413     {
414 
415         if (iIndex==-1)
416         {
417             cout<<"No Person"<<endl;
418         }
419         cout<<"Index:"<<iIndex<<endl;
420     }
421     else
422     {
423         cout<<"No Data."<<endl;
424     }
425 
426     cout<<endl<<"Input Data To Get Pre:"<<endl;
427     
428     cin>>DataTemp.szName;
429     cin>>DataTemp.iAge;
430 
431 
432     if (CLineTableObject.PreElement(LineTableTemp,
433         DataTemp,DataNew,Compare))
434     {
435 
436         cout<<DataNew.szName<<"  "<<DataNew.iAge<<endl;
437 
438     }
439 
440 
441     cout<<endl<<"Input Data To Get Next:"<<endl;
442     
443     cin>>DataTemp.szName;
444     cin>>DataTemp.iAge;
445     
446     
447     if (CLineTableObject.NextElement(LineTableTemp,
448         DataTemp,DataNew,Compare))
449     {
450         
451         cout<<DataNew.szName<<"  "<<DataNew.iAge<<endl;
452         
453     }
454 
455     cout<<"Input Person Position to Insert:"<<endl;
456 
457     cin>>DataTemp.szName;
458     cin>>DataTemp.iAge;
459 
460     cout<<"Input New Data"<<endl;
461 
462     cin>>DataNew.szName;
463     cin>>DataNew.iAge;
464 
465     if(CLineTableObject.InsertData(LineTableTemp, 
466         DataTemp, DataNew))
467     {
468         CLineTableObject.TravelLineTable(LineTableTemp);
469 
470     }
471 
472     cout<<"Input Person Position to Delete:"<<endl;
473 
474     cin>>DataTemp.szName;
475     cin>>DataTemp.iAge;
476 
477     if(CLineTableObject.DeleteData(LineTableTemp,
478         DataTemp, DataDel))
479     {
480         cout<<endl<<DataDel.szName
481             <<" "<<DataDel.iAge<<" is Deleted."<<endl<<endl;
482 
483         CLineTableObject.TravelLineTable(LineTableTemp);
484 
485         
486     }
487     return 0;
488 }
489 
490 
491 
492 
493 int Compare(LineTable LineTableTemp, Data DataTemp)
494 {
495     int i = 0;
496     for(i=0;i<LineTableTemp.iSize;i++)
497     {
498         if(strcmp(LineTableTemp.pDataTemp[i].szName,DataTemp.szName) == 0
499             && LineTableTemp.pDataTemp[i].iAge == DataTemp.iAge)
500         {
501 
502             return i+1;
503         }
504             
505     }
506 
507     return -1;
508 }
原文地址:https://www.cnblogs.com/Lee-geeker/p/3335798.html