數據結構和C程序設計知識點

001:數的結點總數和度的關係

任一棵樹中,結點總數=度數*該度數對應的結點數+1

002:解決哈希表的衝突的開放地址法

H i ( key ) = ( H ( key )+ d i ) mod m ( i = 1,2,…… , k ( k ≤ m – 1))

  • H ( key ) 爲關鍵字 key 的直接哈希地址,
  • m 爲哈希表的長度,
  • di 爲每次再探測時的地址增量。

增量 d 可以有不同的取法,並根據其取法有不同的稱呼:

  • ( 1 ) 線性探測再散列:d i = 1 , 2 , 3 , … ,m-1;
  • ( 2 ) 二次探測再散列:d i = 12 ,22 , 32 ,… ,[m/2]2
  • ( 3 ) 僞隨機再散列:d i = 僞隨機序列;

003:二叉樹計算公式總結:

  1. n 個節點的二叉樹一共有 ( (2n)! ) / ( n! * ( n+1 ) ! ) 種;

  2. n 層二叉樹的第n層最多爲 2 (n-1) 個,n 層二叉樹做多有 2n - 1個;

  3. 對任何一棵二叉樹T,如果其終端節點數爲 n0,度爲2的節點數爲 n2,則 n0 = n2 + 1

  4. 二叉樹節點計算公式 N = n0 + n1 + n2,度爲0的葉子節點比度爲2的節點數多一個。 N= 1 * n1 + 2 * n2 + 1

  5. 具有n個節點的完全二叉樹的深度爲 log2n + 1

004:完全二叉樹699個節點,則葉子節點有多少個

  • 解答:
    n = n0 + n1 +n2,
    n0 = n2 + 1,
    則有:n = 2 * n0 + n1 - 1,
    因爲是完全二叉樹,所以 n1 只能等於0或1,
    所以 n = 2 * n0 - 1 或 n = 2 * n0,699是奇數,
    則 n0 = (n + 1) / 2,即350。

005:C語言指針

P 是普通的整型變量;

int p;

P 是指向整型數據的指針變量(從 p 開始, 先與 * 結合,說明 p 是一個指針,然後再與 int 結合);

int *p; 

P 是整型數據組成的數組(從 p 處開始,先與 [ ] 結合,然後與int 結合);

int p[3]; 

P 是指向整型數據的指針變量所組成的數組(從 p 處開始,先與[ ]結合,因爲其優先級比*高,所以P 是一個數組,然後再與*結合,說明數組裏的元素是指針類型);

int *p[3]; 

P 是指向由整型數據組成的數組的指針(從P 處開始,先與 * 結合,說明 p 是一個指針然後再與[ ]結合,說明指針所指向的內容是一個數組,然後再與int 結合);

int (*p)[3]; 

P 是指向整型指針變量的指針變量(先與*結合,說是P 是一個指針變量,然後再與*結合,指針所指向的元素是指針變量,然後再與int 結合);

int **p; 

P 是參數爲一個int類型返回值爲一個int類型的函數;

int p(int); 

P 是一個指向有一個整型參數且返回類型爲整型的函數的指針 (從P 處開始,先與指針結合,說明P 是一個指針,然後與()結合,說明指針指向的是一個函數,然後再與()裏的int 結合,說明函數有一個int 型的參數,再與最外層的int 結合,說明函數的返回類型是整型);

int (*p)(int);

可以先跳過,不看這個類型,過於複雜從P 開始,先與()結合,說明P 是一個函數,然後進入()裏面,與int 結合,說明函數有一個整型變量參數,然後再與外面的*結合,說明函數返回的是一個指針,然後到最外面一層,先與[]結合,說明返回的指針指向的是一個數組,然後再與*結合,說明數組裏的元素是指針,然後再與int 結合,說明指針指向的內容是整型數據.所以P 是一個參數爲一個整數據且返回一個指向由整型指針變量組成的數組的指針變量的函數;

int *(*p(int))[3]; 

006:C語言中的字符數組和字符串之間的關係

char cArr[] = {'I','L','O','V','E','C'};
char str[]="ILOVEC";//sizeof長度爲7個,因爲末尾會自動加‘\0’,即null來做字符串的結尾
char sArr[10]="ILOVEC";

/*用sizeof()求長度*/
printf("cArr 的 sizeof:%lu\n", sizeof(cArr));//6
printf("str 的 sizeof:%lu\n", sizeof(str));//7
printf("sArr 的 sizeof:%lu\n", sizeof(sArr));//10
/*用strlen()求長度*/
printf("cArr 的 strlen:%lu\n", strlen(cArr));
printf("str 的 strlen:%lu\n", strlen(str));//6
printf("sArr 的 strlen:%lu\n", strlen(sArr));//6
```c

C語言有兩種表示字符串的方法,
一種是字符數組,如:
```c
char str[] = "I Love C";//

另一種是字符串常量,如:

char *str = "I Love C";

它們在內存中的存儲位置不同:
字符數組存儲在全局數據區或棧區,第二種形式的字符串存儲在常量區,使得字符數組可以讀取和修改,
而字符串常量只能讀取不能修改。

char *str = "Hello World!";
str = "I love C!";  //正確
str[3] = 'P';  //錯誤 會出現段錯誤(Segment Fault)或者寫入位置錯誤

如果只涉及到對字符串的讀取,那麼字符數組和字符串常量都能夠滿足要求;如果有寫入(修改)操作,那麼只能使用字符數組,不能使用字符串常量

007:sizeof操作符

單目操作符,以字節形式給出了其操作數的存儲大小。

sizeof操作符不能用於函數類型,不完全類型或位字段。不完全類型指具有未知存儲大小的數據類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void類型等。sizeof(void)都不是正確形式。

union操作數的sizeof是其最大字節成員的字節數。struct操作數的sizeof是這種類型對象的總字節數,包括任何填充在內。

struct {char b; double x;} a;

在某些機器上sizeof(a)=16,而一般sizeof(char)+ sizeof(double)=9。
這是因爲編譯器在考慮對齊問題時,在結構中插入空位以控制各成員對象的地址對齊。如double類型的結構成員x要放在被8整除的地址。
如下:

struct
{
    char a;
    double b;
    int c;
    char d;
} s1;

struct s2
{
    char a;
    char b;
    int c;
    double d;
} s2 ;

printf("s1 的 sizeof:%lu\n", sizeof(s1)); //24
printf("s2 的 sizeof:%lu\n", sizeof(s2)); //16

詳細參見 https://blog.csdn.net/u013728021/article/details/100920141

007:sizeof操作符

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章