簡單記錄《劍指offer》資料結構部分的學習,主要分為陣列、字串、鍊錶、樹、棧和佇列。陣列和字串用連續記憶體存放數字和字元;鍊錶和樹操作需要大量的指標;棧與遞迴緊密相連,佇列與廣度優先遍歷演算法緊密相關。
由於陣列中的記憶體的連續性,可實現o(1)時間內快速查詢;但建立陣列時需先制定陣列容量的大小(導致陣列空間使用效率不好);故存在動態陣列stl中的vector,對vector進行擴容時,新的容量都是前一次的兩倍,會把之前的資料複製到新的陣列中,再把之前的記憶體釋放掉(擴容時會產生大量的額外操作,因此使用vector時儘量減少改變陣列容量大小的次數)
宣告陣列時,陣列的名字本身也是乙個指標,指向陣列的第乙個元素(c++中沒有記錄陣列的大小,用指標訪問陣列元素時,需確保沒有超出陣列的邊界)。陣列作為函式的引數進行傳遞時,會自動退化為同類的指標,陣列禁止拷貝和賦值,使用陣列是通常將其轉化成指標。
#includeusing namespace std;
int getsize(int data)
int main() ;
int size1 = sizeof(data1); // 20
int *data2 = data1;
int size2 = sizeof(data2); // 4
int size3 = getsize(data1); //4
cout<二維陣列傳參
方式一:陣列作為形參(但第二維必須標明)
shuchu(num); // 實參
void shuchu(num[3][4]); //形參, 兩種都可
void shuchu(num[4]);
方式二:一重指標作為形參,即指向陣列的指標–陣列指標(行指標)(第二維必須標明,即陣列長度)-- int (*p)[n]
void display2(int (*parr)[4],const int irows); // 可採用 parr[i][j]; parr[i] 表示第i行
陣列指標
()優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型資料的長度。
int a[3][4];
int (*p)[4]; //該語句是定義乙個陣列指標,指向含4個元素的一維陣列。
p=a; //將該二維陣列的首位址賦給p,也就是a[0]或&a[0][0]
p++; //該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]
指標陣列
定義 int* p[n];
優先順序高,先與p結合成為乙個陣列,再由int*說明這是乙個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1時,則p指向下乙個陣列元素,這樣賦值是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]…p[n-1],而且它們分別是指標變數可以用來存放變數位址。但可以這樣 p=a; 這裡p表示指標陣列第乙個元素的值,a的首位址的值。
如要將二維陣列賦給一指標陣列:
int *p[3];
int a[3][4];
p++; //該語句表示p陣列指向下乙個陣列元素。注:此陣列每乙個元素都是乙個指標
for(i=0;i<3;i++)
p[i]=a[i]
這裡int *p[3] 表示乙個一維陣列內存放著三個指標變數,分別是p[0]、p[1]、p[2]
所以要分別賦值。
方式三:形參為指標的指標
#include void subfun(int n, char **subargs)
} void main()
; a[0] = args[0]; //equals with a[0] = &args[0][0];
a[1] = args[1];
a[2] = args[2];
subfun(3, a); //若此處為subfun(3, args);則會編譯出錯
}
#include void subfun(int n, char **subargs)
} void main()
;//equals with char *args[3] = ;
subfun(3, args);
}
方式四:一重指標
#include #include void test(double *p,const int m,const int n)
int newlength = originallength + numberofblank * 2;
if(newlength > length)
return;
int indexoforiginal = originallength;
int indexofnew = newlength;
while(indexoforiginal >= 0 && indexofnew > indexoforiginal)
else
-- indexoforiginal;
}}
字串cout 或 比較時 僅用他的名稱即指向首位址的指標即可。
兩個有序陣列a1,a2;a1有足夠的空間容納a2;將a2所有的數字插入至a1中,且所有的數字都是有序排列的
void insert1( int* _a1, int* _a2 , int _a1_length, int _a2_length )
if (_a1[indexoforiginal - 1] >= _a2[indexofa2 -1] )
_a1[--indexofnew] = _a1[--indexoforiginal ];
else
}for (int i = 0; i< _a1_length + _a2_length ; i++)
}
注意a1陣列容量足夠(陣列的大小在定義時要事先規定,不能在程式中進行調整,否則記憶體不足時會產生錯誤的資料),且需要考慮特殊情況, a1 全部大於a2時 資料結構 1
線性結構 線性表,棧,佇列,串。線性結構特點 結構中的資料元素之間存在一對一的線性關係。線性表 線性表 最簡單 最基本 最常用的資料結構。操作不受限定。順序表 用順序儲存方式的線性表叫順序表。線性表的順序儲存方式 在記憶體中用一塊位址連續的空間一次存放線性表的資料元素。特點 表中相鄰的資料元素在記憶...
資料結構 1
資料結構是研究非數值計算的程式設計問題中計算機的操作物件以及它們之間的關係和操作的一門課程。具體地說,資料結構指的是資料元素之間的邏輯結構 儲存結構以其資料的抽象運算,即按某種邏輯關係組織起來的一組資料,再按一定的儲存表示方式把它們儲存在計算機的儲存器中,並在這些資料上定義乙個運算的集合.資料結構 ...
資料結構 1
1.基本資料組織和資料處理方法 2.資料結構的邏輯特性和儲存結構設計 演算法設計 基本資料結構 線性表,陣列,棧,樹,佇列,二叉樹,串,圖 3.資料如何表示 選擇合適的資料結構 資料運算如何實現 資料運算如何高效實現 4.資料結構基本概念,基本原理和基本方法 練習 優化 5.資料 所有能夠輸入到計算...