1. 程式人生 > >2018-2019-1 20189221 《從問題到程序》第 8 周學習總結

2018-2019-1 20189221 《從問題到程序》第 8 周學習總結

打印 定義 結構數組 cit 類型 列存儲 分享圖片 center 指針

2018-2019-1 20189221 《從問題到程序》第 8 周學習總結

第九章 結構和其他數據機制

結構(struct)、聯合(union)、枚舉(enum)等數據機制的概念、意義和用途,使用方法。

9.1結構(struct)

C語言的結構(structure)用於把多個類型可能不同的數據對象集合起來。C結構是由若幹結構的成分或成員(可不同類型的數據項對象)組合而成的復合數據。一個(或一類)結構中的每個成員都給定了一個名字,通過成員名實現對結構成員的訪問。

9.1.1結構聲明與變量定義

結構描述用關鍵字struct引導,結構說明的 基本形式是:

    struct { 成員說明序列 }; 

定義結構變量:

struct {
     int n;
     double x, y; 
} st1, st2; 

定義結構類型

typedef struct {     
    double x, y; 
} POINT; 

typedef struct { 
    POINT center;     
    double radius; 
} CIRCLE; 

typedef struct { 
    POINT lu;     
    POINT rd; 
} RECTANGLE; 

9.1.2結構變量的初始化和使用

結構變量也可以在定義時直接初始化。為結構提供初始值的形式與數組一樣。
對結構變量的操作主要是整體賦值和結構成員訪問。
訪問結構成員的操作用圓點運算符(.)描述

pt2.y = pt1.y + 2.4; 
circ1.center.x = 2.07; 
circ1.center.y = pt1.y; 

9.1.3結構、數組與指針

結構裏可以包含數組成員,也可以定義以結構作為元素的數組。
兩種實現方式:
用一個兩維字符數組和一個計數器數組,用一個字符指針數組和一個計數器數組
可能更合理的方式——采用一種結構來表示與一個關鍵字有關的所有信息。

typedef struct {     
    char * key;     
    int count; 
} KEYC; 

9.1.4 字段

字段:使人在需要時能把幾個結構成員壓縮到一個基本數據類型成員裏存放,這可以看作是一種數據壓縮表示方式。

struct pack {     
    unsigned a:2;     
    unsigned b:8;     
    unsigned c:6; 
} pk1, pk2; 

采用字段壓縮方式,通常會使訪問結構成員的操作效率下降很多。

9.2結構與函數

函數處理存儲在結構中的數據:

    1. 個別地將結構成員的值傳遞給函數處理。
    1. 將整個結構作為參數值傳遞給函數,一般將這種參數稱作結構參數。
    1. 將結構的地址傳給函數,也就是說傳遞指向結構的指針值。這稱為結構指針參數。

9.2.1處理結構的函數

采用動態建立與管理:

  • 建立的結構的存在期不受建立操作所在位置的約束
  • 通過指針傳遞也不必做整個結構的復制。

9.2.2程序實例

int main() {     
    int n, inum = 0;     
    ACCITEM accbook[NACCOUNT]; 

    initialization(); 
    while ((n = getcommand()) >= 0) {         
    switch (n) { 
    case 0: /* 由用戶得到賬目文件名並讀入 */ 
        inum = readfile(NACCOUNT, accbook);              
        break;         
    case 1: /* 計算 終余額 */             
        balance(inum, accbook);             
        break;         
    case 2: /* 統計所有收入 */             
        receipts(inum, accbook);             
        break;         
    case 3: /* 統計所有支出 */             
        expenditures(inum, accbook);             
        break; 
    case 4: /* 打印大額支出,向用戶要求額度限 */             
        printsome(inum, accbook);             
        break; 
    default: /* 錯誤命令。輸出錯誤信息 */             
        errmessage();             
        break; 
    } 
} 
    finalization();     
    return 0; 
} 


9.3聯合(union)

一個聯合是幾個類型不同(也可以相同)的成員的組合,其中每個成員各有一個名字。從這些方面看,聯合與結構很相似。聯合與結構的差異在於它們的表示方式不同。在一個結構(變量)裏,結構的各成員順序排列存儲,每個成員都有自己獨立的存儲位置。聯合的情況不是這樣,一個聯合變量的所有成員共享從同一片存儲區。因此一個聯合變量在每個時刻裏只能保存它的某一個成員的值。

union {     
    int n;     
    double x;     
    char c; 
} u1, u2; 

9.4枚舉(enum)

枚舉說明的基本形式是:

    enum 枚舉標誌 {枚舉常量名, ...}; 

9.6鏈接結構(自引用結構)

簡單的鏈接結構是通過線性鏈接形成的表,或稱鏈接表。
技術分享圖片

二叉樹結構:
技術分享圖片

兩種方式定義自引用結構:

    char word[20]; 
    int count; 
typedef struct node {     
    char word[20];     
    int count;     
    struct node *next; 
} NODE, *LINK; 

9.7字段

2018-2019-1 20189221 《從問題到程序》第 8 周學習總結