📄 indlist.h
字号:
// indirect list
#ifndef IndirectList_
#define IndirectList_
#include <iostream.h>
#include <stdlib.h>
#include "xcept.h"
template<class T>
class IndirectList {
public:
IndirectList(int MaxListSize = 10); // constructor
~IndirectList(); // destructor
bool IsEmpty() const {return length == 0;}
int Length() const {return length;}
// number of elements in list
bool Find(int k, T& x) const;
// return k'th element in x
int Search(const T& x) const;
// return position of x
IndirectList<T>& Delete(int k, T& x);
// delete k'th and return in x
IndirectList<T>& Insert(int k, const T& x);
// insert x just after k'th element
void Output(ostream& out) const;
private:
T **table; // 1D array of T pointers
int length, MaxSize;
};
template<class T>
IndirectList<T>::IndirectList(int MaxListSize)
{// Constructor.
MaxSize = MaxListSize;
table = new T *[MaxSize];
length = 0;
}
template<class T>
IndirectList<T>::~IndirectList()
{// Delete the list.
for (int i = 0; i < length; i++)
delete table[i];
delete [] table;
}
template<class T>
bool IndirectList<T>::Find(int k, T& x) const
{// Set x to the k'th element in the chain.
// Return false if no k'th; return true otherwise.
if (k < 1 || k > length) return false; // no k'th
x = *table[k - 1];
return true;
}
template<class T>
int IndirectList<T>::Search(const T& x) const
{// Locate x. Return position of x if found.
// Return 0 if x not in the chain.
for (int i = 0; i < length; i++)
if (*table[i] == x) return ++i;
return 0;
}
template<class T>
IndirectList<T>& IndirectList<T>::Delete(int k, T& x)
{// Set x to the k'th element and delete it.
// Throw OutOfBounds exception if no k'th element.
if (Find(k, x)) {// move pointers k+1, ..., down
for (int i = k; i < length; i++)
table[i-1] = table[i];
length--;
return *this;
}
else throw OutOfBounds();
}
template<class T>
IndirectList<T>& IndirectList<T>::Insert(int k, const T& x)
{// Insert x after the k'th element.
// Throw OutOfBounds exception if no k'th element.
// Pass NoMem exception if inadequate space.
if (k < 0 || k > length) throw OutOfBounds();
if (length == MaxSize) throw NoMem();
// move one up
for (int i = length-1; i >= k; i--)
table[i+1] = table[i];
table[k] = new T;
*table[k] = x;
length++;
return *this;
}
template<class T>
void IndirectList<T>::Output(ostream& out) const
{
for (int i=0; i < length; i++)
out << *table[i] << " ";
}
// overload <<
template <class T>
ostream& operator<<(ostream& out, const IndirectList<T>& x)
{x.Output(out); return out;}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -