数据结构第二章线性表学习笔记
1.? ??C++程序設計模板? ?(關于template的解釋)【以下內容摘自百度】
函數聲明格式 template <class(或typename)?any(或任意符合規則的名稱)>(如果還有其他類型名,就用逗號隔開) 返回類型 函數名(形參表); 函數定義和聲明格式基本相同,形參表要加上形參名,分號改為函數體。 聲明的例子: ? ?? 1 template <class type1, class type2> 2 type1 add(type1,type2); 3 template <class type1, class type2> 4 type1 add(type1 a,type2 b) 5 {return a + (type1)b;}?
也可以直接定義函數,不聲明。 說明: template是一個聲明模板的關鍵字,表示聲明一個模板關鍵字class不能省略,如果形參類型多于一個 ,每個形參前都要加class <類型 形參表>可以包含基本數據類型或類類。 1 #include <iostream> 2 using std::cout; 3 using std::endl; 4 //聲明一個函數模版,用來比較輸入的兩個相同數據類型的參數的大小,class也可以被typename代替, 5 //T可以被名稱字代替,只要符合命名規則即可。 6 template <class T> 7 T min(T& x,T& y) 8 { return(x<y)?x:y;} 9 int main( ) 10 { 11 int n1 = 2,n2 = 10; 12 double d1 = 1.5,d2 = 5.6; 13 cout<< "較小整數:"<<min(n1,n2)<<endl; 14 cout<< "較小實數:"<<min(d1,d2)<<endl; 15 system("PAUSE"); 16 return 0; 17 }?
程序運行結果: 程序分析:main()函數中定義了兩個整型變量n1 , n2 兩個雙精度類型變量d1 , d2然后調用min( n1, n2); 即實例化函數模板T min(T x, T y)其中T為int型,求出n1,n2中的最小值.同理調用min(d1,d2)時,求出d1,d2中的最小值.? ?2.模板
? ? ? 一.模板概述
? ? (1)模板時對具有相同特性的函數或類的再抽象,模板是一種參數化的多態性工具。
? ? (2)所謂參數化多態性,是指將程序所處理的對象的類型參數化,使一段程序代碼可以用于處理多種不同類型? ? ? ? ? ? ? ?的對象。
? ?(3)采用模板編程,可以為各種邏輯功能相同而數據類型不同的程序提供一種代碼共享的機制。
?
? ? ? ?模板實例化話:函數通過參數的實例化可以構建具體的函數或類,稱為模板函數和模板類。
? ? ? ??
?
函數模板定義:template<模板形參表> 返回值類型 函數名(參數表) {函數體 }函數模板實例:
template<typename T>//模板定義,T為模板參數。
T abs(T a) //定義函數模板
{
return a<?-a:a;
}
說明:template是模板定義的關鍵字。?<模板形參表>中包含一個或多個用逗號分開的模板形式參數,每一項
關鍵字class或typename引導一個由用戶命名的標識符,此標識符為模板參數(用來進行類型傳遞)
模板參數表示一種數據類型,可以是基本數據類型或類類型。該數據類型在發生實際函數調用時將被實例化,
即調用出的實際數據類型替代它。 類模板:同函數模板一樣,類模板是參數化的類,即用于實現數據類型參數化的類。應用類模板可以使類中的數據成員 成員函數的參數及成員函數的返回值根據模板參數匹配情況取任意數據類型。 類模板定義:template<模板形參表>class 類模板名{成員的聲明;}
實例:
template <typename T> ? ? ? ? //typename或class
class Square
{??
?
T x;?public:
? ? ? ? Square(T xx):x(xx){ ?}
? ? ? ? T fun(){return x*x;}
};?對于成員函數在類外定義的時候,有何變化:
double Rectangle::circumference( )
{ ? //普通類的成員函數在類外定義
return 2*length*width;
}template<class T>
T Rectangle<T>::circumference( )
{ ?//類模板的成員函數在類外的定義
return 2*length*width;
}?n 設計函數模板,實現求解兩個數的最小值:
#include<bits/stdc++.h> using namespace std; template <typename T> T minn(T a,T b) {return a>b?b:a; } int main() {int a,b;double c,d;cin>>a>>b;cin>>c>>d;cout<<minn(a,b)<<endl;cout<<minn(c,d);return 0; } View Coden 設計函數模板,實現對一組數據求和(數據放在一維數組中):
#include<bits/stdc++.h> using namespace std; template <typename T> T add(T a[],int n) {T ans=0;for(int i=0;i<n;i++){ans+=a[i];}return ans; } int main() {int a[5]={0,1,2,3,4};double b[5]={1.1,2.2,3.3,4.4,5.5};cout<<add(a,5)<<endl;cout<<add(b,5)<<endl;return 0; } View Coden 設計一個關于正方形的類模板,類的成員函數包括計算正方形的面積、周長、邊長等函數,并且有帶參的構造函數,類的成員函數需要在類的外部實現:
#include<bits/stdc++.h> using namespace std; template <typename T> class Square{private:T length;public:Square(T x);~Square(){};T area();T Perimeter(); }; template <class T> Square<T>::Square(T x)///此處不應該返回void {length=x; } template <class T> T Square<T>::area() {return length*length; } template <class T> T Square<T>::Perimeter() {return length*4; } int main() {Square<int> intx(5);cout<<intx.area()<<endl;cout<<intx.Perimeter()<<endl;Square<double> doublex(2.5);cout<<doublex.area()<<endl;cout<<doublex.Perimeter()<<endl;return 0; } View Code?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 補充:指針
?在存儲空間里存放的信息可以 通過兩種方式訪問(目前我所知道的):
①通過定義的變量名稱進行訪問。例如:int a=5;那么可以通過變量名稱a進行訪問存儲空間里的信息。
②通過指針變量進行訪問:
#include<iostream> using namespace std; int main() {int a=5;int *p=&a;///此處即為定義一個整型的指針變量, ///然后將變量a的地址通過&取址符賦值給*p,注意p只是一個指針變量也可以改變p的值 cout<<p<<endl;///此處輸出的僅為a的地址結果為 0x69fef8cout<<*p<<endl;///*為指針變量所指向的地址。 5return 0; }指針:一個變量的地址稱為該變量的指針。
指針變量:一個特殊的變量,專門存放另一個變量地址的變量。(指針變量的值是一個地址)
區分指針和指針變量:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(1)一個指針是一個地址,是一個常量。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)一個指針變量卻可以被賦予不同的指針值,是一個變量。
除此之外還有指向結構體變量的指針以及指向結構體數組的指針。
數據結構中涉及到:結構體變量的指針
可以通過:(*指針變量).成員名
也可以直接: 指針變量-->成員名
?
關于指針的內容依然很多,這里就不詳細寫了,只是回顧一下而已。
?線性表的鏈式存儲:
#include<bits/stdc++.h>///單鏈表的實現 using namespace std; template<typename T> struct Node {T date;Node<T> *next;///此處的T可以省略 }; template<typename T> class Linklist { public:Linklist(){first=new Node;first->NULL;}///無參構造函數建立空鏈表Linklist(T a[],int n);///有~Linklist();//int Length;///通過一次遍歷可得 長度T Get(int i);///返回鏈表第i個元素int Find(T x);// int Locate(T x);///返回元素X在鏈表中的位置void Insert(int i,T x);///插入元素T Delete(int i);void PrintList(); private:Node<T> *first;///單鏈表的頭指針 }; /* /* 頭插法 *////每次插入到頭指針的后面 template<typename T> Linklist<T>::Linklist(T a[],int n) {first=new Node;first->next=NULL;/// Node<T>*s; ///定義一個結構體指針for(int i=0;i<n;i++){s=new Node<T>;s->date=a[i];///申請一個新的節點s->next=first->next;first->next=s;} } */ /* 尾插法*////需要借助尾指針的輔助 template<typename T> Linklist<T>::Linklist(T a[],int n) {first=new Node;first->next=NULL;Node<T>*s;Node<T>*r;for(int i=0;i<n;i++){s=new Node<T>;s->date=a[i];r->next=s;r=s;}r->next=NULL; } /*單鏈表的遍歷*/ template<typename T> Linklist<T>::PrintList() {Node<T>*p;p=first->next;while(p){cout<<p->date<<endl;p=p->next;} } /*查找第i個位置的值*/ template<typename T> T Linklist<T>::Get(int i) {Node<T>*p;p=first->next;int count=1;while(p&&count<i){p=p->next;count++:}if(p) return p->date;else throw"位置"; } /*按值查找算法 */ template<typename T> int Linklist<T>::Find(T x) {Node<T>*p;p=first;int j=0;while(p){p=p->next;j++;if(p->data==x){return j;}}return 0; } /*刪除鏈表中第i個元素*/ template<typename T> T Linklist<T>::Delete(int i) {Node<T>*p;p=first;int j=0,x;while (p&&&j<i-1){p=p->next;j++;}if(p==NULL||p->next==NULL) throw"位置";else{Node<T>*q;q=p->next;x=p->date;p->next=p->next->next;delete q;return x;}}/*按位置插入*/ template<typename T> T Linklist<T>::Insert(int i,T x) {Node<T>*p;p=first;int j=0;while(p&&j<i-1){p=p->next;j++;}if(p) throw"位置";else{Node<T>*s;s->date=x;s->next=p->next;p->next=s;} }template<typename T> Linklist<T>::~Linklist() {Node<T>*p;while(first){p=first;first=first->next;delete p;} } int main() {} View Code?
轉載于:https://www.cnblogs.com/dean-SunPeishuai/p/10446608.html
總結
以上是生活随笔為你收集整理的数据结构第二章线性表学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Understanding HBase
- 下一篇: 理解这几张图,你就是js小牛了