Lecture 0 --基本说明
Abstract:本章所記錄的知識是后面章節需要的前導知識,請務必仔細讀本章,理解涉及的知識點,方便后面章節的學習。本次數據結構筆記主要參考殷人昆的《數據結構(C語言描述)》這本書,需要的語言基于C,但是在C++的環境中進行編譯,就是建立C++的項目在里面跑C語言的程序。
?
1.C語言指針
http://www.cnblogs.com/HurryXin/p/6547831.html
?
2.typedef
自己感覺主要功能時重命名形式,看一下幾個例子:
(1)
typedef int DataType; 這里是將int重命名為DataType類型。可以這么理解,DataType a這里的a是int型的,與int a是等價的。
那為什么會使用typedef呢?
設想在一個程序中定義了a這個int型變量,寫了一大堆代碼,結果最后發現我要用float或者其他的數據類型,那就慢慢一個一個換吧,凡是相關的全部換掉。但是使用typedef就容易多了,只需要將typedef int DataType;的int轉換成float即可。
(2)
1 typedef struct {
2 DataType a;
3 int n;
4 }SeqList; 定義的結構體名字叫SeqList,以后可以使用SeqList定義新的變量。
?
3.typedef與指針的特殊情況
這里主要解釋兩種用法,具體的代碼先不體現以后會有的:
(1)
typedef struct node{}LinkNode,*LinkList; 看到這種定義不知道是否很困惑,這里的typedef為什么后面跟著兩個參數,這里簡單理解為將struct node重命名為兩個,但是兩者又不一樣。
LinkNode可以理解為一個數組其中的一個節點,而*LinkList則是該數組節點的地址,看著很難理解,畫個圖吧!
LinkNode與LinkList其實內容相同,但是又不完全相同。
(2)
LinkNode * Search(…);
這里被調函數為什么返回值是LinkNode*呢?主要是本函數是返回一個指針,所以使用LinkNode*。那用LinkList的時候該怎么辦?這里僅需要把LinkNode*改成LinkList即可,注意不是LinkList*。但是建議使用LinkNode*,以后涉及的操作主要是刪除等,所以最好返回節點而不是節點的地址。
?
4.C++部分知識介紹
(1)首先對比C語言與C++動態存儲分配與釋放命令
| ? | C語言 | C++ |
| 動態分配 | (DataType*)malloc(sizeof(DataType)); //簡單變量 (DataType*)malloc(sizeof(DataType)*Size); //數組 | new DataType; //簡單變量 new DataType[Size]; //數組 |
| 動態釋放 | free(p); | delete p; //簡單變量 delete [] p; //數組 |
(2)報錯函數
1 #include <stdlib.h>
2 #include <iostream.h>
3
4 void Error(char *message){
5 cerr<<”Error:”<<message<<endl;
6 exit(1);
7 } (3)C++引用
這里的引用僅需要理解為重命名,但是只要發生在被調函數中,舉個栗子:
void initList(SeqList &L){}; 這里的&L可以理解為重命名,其中把傳入的參數不管是什么如何用L統一表示。注意C中是沒有這種用法的,所以說基于C語言但是用C++的環境跑代碼。
?
5.時間復雜度度量
1 void example(float x[][m],int m){
2 float sum[m];
3 int i;
4 int j;
5 for(i=0;i<m;i++){
6 sum[i]=0.0;
7 for(j=0;j<m;j++)
8 sum[i]=sum[i]+x[i][j];
9 }
10 for(i=0;i<m;i++)
11 count<<"Line"<<i<<":"<<sum[i]<<endl;
12 } 這里可以看出,float sum[m];???? int i;????? int j;與其他操作不同,該表自己詳細研究一下,可以得出結論。
一般情況用大O表示時間復雜度。
基本做法就是T(n)<=O(f(n))也可以根據循環大體推算出最后結果。
1 void example(float a[],int& n){
2 int i;
3 int j;
4 int k=0;
5 for(i=0;i<n;i++)
6 for(j=i+1;j<n;j++)
7 if(a[i]==a[j])
8 a[j]=delTag;
9 for(i=0;i<n;i++)
10 if(a[i]!=delTag){
11 if(i!=k)
12 a[k]=a[i];
13 k++;
14 }
15 } 這里的O(n2)當出現兩個的O(n)時取最大值T(n)=O(max{f(n),g(n)})=O(n2)
算法時間復雜度排序:
c<log2n<n<nlog2n<n2<n3<2n<3n<n!
其中c,log2n,n,nlog2n都不錯,n2,n3還可接受,2n,3n,n!就不能算是好的算法了。
?
?轉載請注明出處,O(∩_∩)O謝謝!
轉載于:https://www.cnblogs.com/HurryXin/p/6802829.html
總結
以上是生活随笔為你收集整理的Lecture 0 --基本说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “曲江春意多”上一句是什么
- 下一篇: jQuery.fly插件实现添加购物车抛