由於線性表的數據元素類型不確定,所以採用C++的模板機制。
在寫模板時,由於長時間未寫過C++了,對其模板機制的概念非常模糊,如以下代碼存在基礎語法錯誤或者醜陋的代碼,請指出來,我將虛心改錯,感謝。
順序表——線性表的順序存儲結構
一、順序表的定義
順序表是用一段地址連續的存儲單元依次存儲線性表的數據元素。
二、順序表的存儲
通常用一維數組來實現順序表,使用時要注意區分數組的下標與線性表中元素的位置。
const int maxSize = 100;
template <class T>
class SeqList
{
public:
SeqList()
{
length = 0; //建立一個空的順序表
}
SeqList(T a[], int n); //建立一個長度爲n的順序表
~SeqList() {}
int Length()
{
return length;
}
T Get(int i); //按位查找
int Locate(int x); //按值查找
void Insert(int i, T x); //插入操作
T Delete(int i); //刪除線性表中的第i個元素
void PrintList(); //遍歷操作
private:
T data[maxSize]; //存放數組元素的值
int length; //線性表的長度
};
1.構造函數
①無參構造函數(將順序表的長度length初始化爲0)
SeqList()
{
length = 0; //建立一個空的順序表
}
②有參構造函數
template<class T>
SeqList<T>::SeqList(T a[], int n)
{
if( n > maxSize)
throw "參數非法";
for(int i = 0; i < n; i++)
data[i] = a[i];
length = n;
}
2.按位查找算法 Get
template<class T>
T SeqList<T>::Get(int i)
{
if(1 > i || length < i)
throw "查找位置非法";
return data[i - 1];
}
3.按值查找算法 Locate
template<class T>
int SeqList<T>::Locate(int x)
{
for(int i = 0; i < length; i++)
{
if(data[i] == x)
return i + 1;
}
return 0;
}
4.插入算法
template<class T>
void SeqList<T>::Insert(int i, T x)
{
if(length >= maxSize)
throw "上溢";
if(i < 1 || i > length + 1)
throw "位置異常";
for(int j = length; j >= i; j--)
{
data[j] = data[j - 1]; //注意第j個元素存在數組下標爲j-1處
}
data[i - 1] = x;
length++; //表長加一
}
5.刪除算法
template<class T>
T SeqList<T>::Delete(int i)
{
if(length == 0)
throw "下溢";
if(i < 1 || i > length)
throw "位置異常";
T x = data[i - 1]; //取出位置i的元素
for(int j = i; j < length; j++)
{
data[j - 1] = data[j]; //將下標爲i,i+1,... 處的元素分別移動到下標i-1,i,...處
}
length--;
return x;
}
6.遍歷
template<class T>
void SeqList<T>::PrintList()
{
for(int i = 0; i < length; i++)
cout << data[i] << " ";
cout << endl;
}
7.主函數
int main()
{
int a[maxSize], i, SearchPos, NewPos, NewItem, DelPos ;
int n = 0;
//創建順序表
cout << "請輸入順序表長度:" ;
cin >> n ; //輸入樣本數目(表長)
cout << "請輸入表中所有元素:";
for (i = 0 ; i < n; i++)
{
cin >> a[i] ;
}
SeqList<int> seqList(a, n);
cout << "該順序表爲:";
seqList.PrintList(); //顯示順序表
cout << "請輸入所查找的元素的位置:" ;
cin >> SearchPos ; //輸入查找位置
cout << "該位置的元素爲:" << seqList.Get(SearchPos) << endl ; //輸出查找的數據元素值
cout << "請輸入所插入元素的值:" ;
cin >> NewPos ; //插入位置輸入
cout << "請輸入所插入的元素的位置:" ;
cin >> NewItem ; //插入元素輸入
seqList.Insert(NewItem, NewPos) ; //新數據插入順序表中
cout << "插入後的順序表爲:" ;
seqList.PrintList(); //插入數據後,輸出新的順序表
cout << "請輸入所刪除元素的位置:" ;
cin >> DelPos ; //輸入刪除元素位置
seqList.Delete(DelPos) ; //按位置刪除數據
cout << "刪除後的順序表爲:" ;
seqList.PrintList();
return 0 ;
}