題目爲:
線性表操作
描述
線性表是n個元素的有序集合(n³0),n是線性表中元素的個數,稱爲線性表的長度。可以用一組地址連續的存儲單元依次存儲線性表中元素,採用這種存儲方式的線性表稱爲順序表。
請在順序表上實現運算,實現順序表的逆置,刪除表中所有元素值等於x的元素。
輸入
三組數據,順序表元素類型分別爲整型、字符型和實型。
每一組第一行給出元素數目n(0<n≤1000),第二行給出元素數值,第三行給出待刪除的元素。
輸出
三組數據,每一組第一行爲逆置後的順序表元素,第二行是在此基礎上刪除指定元素後的順序表元素
樣例輸入
8
1 2 3 7 5 6 7 8
7
3
a c m
h
4
1.2 3.4 5.6 7.8
1.2
樣例輸出
8 7 6 5 7 3 2 1
8 6 5 3 2 1
m c a
m c a
7.8 5.6 3.4 1.2
7.8 5.6 3.4
提示
該題屬於南京郵電大學《數據結構A》實驗一中的內容,驗證的是課本代碼,請慎重解答。
題目來源
CHENZ
很明顯,輸入的三組數據的數據類型都不同,我們不可能爲此而開三個數組,因爲除了數據類型不同外,對於數據的轉置和移除數據的大量代碼是一樣的,大量重複的代碼會導致程序顯得非常糟糕。
這就需要用到C++中的模板,通過定義模板來處理數據類型不同的問題。
模板在需要用的類或者方法之前表明template<class T,int num>。這樣程序就可以根據傳入的數據的類型來進行不同的處理,而代碼只需一份即可。
代碼非常簡單:
- #include<iostream>
- #define MAXNUM 1001
- using namespace std;
- int n,i,j;
- template<class T,int num>
- class myclass{
- public:
- T arr[num];
- void traverse(T arr[])
- {
- for(int i=n-1;i>=0;i--)
- {
- cout<<arr[i]<<" ";
- }
- cout<<endl;
- }
- void remove(T arr[],T a)
- {
- for(int i=n-1;i>=0;i--)
- {
- if(arr[i]!=a)
- {
- cout<<arr[i]<<" ";
- }
- }
- cout<<endl;
- }
- };
- template<class T>
- void f(myclass<T,MAXNUM> myClass)
- {
- for(j=0;j<n;j++)
- {
- cin>>myClass.arr[j];
- }
- T removenum;
- cin>>removenum;
- myClass.traverse(myClass.arr);
- myClass.remove(myClass.arr,removenum);
- }
- int main(){
- for(i=0;i<3;i++)
- {
- cin>>n;
- if(i==0)
- {
- myclass<int,MAXNUM> myClass;
- f(myClass);
- }
- else if(i==1)
- {
- myclass<char,MAXNUM> myClass;
- f(myClass);
- }
- else if(i==2)
- {
- myclass<float,MAXNUM> myClass;
- f(myClass);
- }
- }
- system("pause");
- return 0;
- }