Presentation is loading. Please wait.

Presentation is loading. Please wait.

第九章 結構. 結構的宣告 結構 它是由許多不同 ( 或相同 ) 資料型態的變數所組成的 集合,通常利用結構標籤稱呼此集合 struct student { char *name; int score; }; struct 為保留字,表示結構的宣告開始 結構項目需定義於大括號「 { } 」內 結尾需加上分號.

Similar presentations


Presentation on theme: "第九章 結構. 結構的宣告 結構 它是由許多不同 ( 或相同 ) 資料型態的變數所組成的 集合,通常利用結構標籤稱呼此集合 struct student { char *name; int score; }; struct 為保留字,表示結構的宣告開始 結構項目需定義於大括號「 { } 」內 結尾需加上分號."— Presentation transcript:

1 第九章 結構

2 結構的宣告 結構 它是由許多不同 ( 或相同 ) 資料型態的變數所組成的 集合,通常利用結構標籤稱呼此集合 struct student { char *name; int score; }; struct 為保留字,表示結構的宣告開始 結構項目需定義於大括號「 { } 」內 結尾需加上分號 student 為結構標籤; name 與 score 為結構之項目 表示結構宣告至此為止,不可不寫

3 定義結構變數 結構變數之定義 結構宣告後,需定義結構變數後才能在程式中使用 宣告結構並沒有配置記憶體,需等到定義結構變數 後才會配置記憶體 您可以在宣告結構時順便定義結構變數 s1 和 s2 ,如 struct student { char *name; int score; } s1, s2;

4 定義結構變數 另一個宣告的方式是省略結構標籤,如下所 示: struct { char *name; int score; } s1, s2; 此方法有個缺點,在結構宣告後,此結構無 法被程式再利用來定義其它的結構變數,因 為沒有結構標籤可供程式識別

5 定義結構變數 較好的結構定義方式 struct student { char *name; int score; }; struct student s1, s2;

6 定義結構變數 定義結構時設定初值 struct student { char *name; int score; }; struct student s1 = { “ Mary ”, 90}; 或 s1.name = “ Mary ” ; s1.score = 90; 其中「. 」表示擷取某結構的資料項目,其語法為: 結構變數. 結構項目 name 90 “Mary” s1 &s1

7 定義結構變數 當變數為指向結構的指標時,如 struct student *p; p=&s1; 則其成員有兩種表示法: (1) printf("%s\n", p->name); printf("%d\n", p->score); (2) printf("%s\n", (*p).name); printf("%d\n", (*p).score); name 90 “Mary” s1 p &s1

8 定義結構變數 /* File name: ex6-1a.c */ #include int main() { struct student { char *name; int score; }; struct student s = {"Mary", 90}; struct student *p = &s; printf("s.name = %s\n", s.name); printf("s.score = %d\n", s.score); printf("p->name = %s\n", p->name); printf("p->score = %d\n", p->score); printf("(*p).name = %s\n", (*p).name); printf("(*p).score = %d\n", (*p).score); }

9 巢狀的結構變數 巢狀結構 若結構中某一項目的資料型態又是一結構時,則稱 此結構為巢狀結構 (nested structure) ,如 struct st_name { char *firstname; char *lastname; }; struct student { struct st_name name; int score; }; 則稱 struct student 為一巢狀結構,因為 name 為 struct st_name 的資料型態

10 巢狀的結構變數 巢狀結構之項目存取 若有一變數 st struct student st = {"Peter", "Wang", 95}; 則必須利用 firstname 和 lastname st.name.firstname st.name.lastname 運作之

11 巢狀的結構變數 /* File name: ex9-1b.c */ #include int main() { struct st_name { char *firstname; char *lastname; }; struct student { struct st_name name; int score; }; struct student s1 = { “ Peter ”, “ Wang ”, 95}; printf( “ %s %s score is %d\n ”, s1.name.firstname, s1.name.lastname, s1.score) } name score s1 firstname lastname &s1 st_name

12 以結構為參數的函數 當呼叫一函數需傳遞結構時,只要將結構的位址傳 過去便可,而不是一個元素一個元素的傳, 此種方式是屬於傳址呼叫 (call by address) ,之後再 利用指標加以處理您欲達到的目的 範例 ex9-2a.c

13 自我參考結構 有一結構名為 node, 其中若有項目指向 node 結構 指標 struct node { char name[20]; int c-score; struct node *next; }; struct node *head = NULL, *tail, *this, *pre, *this; 因為在 struct node 中, next 為指向 struct node 的指 標

14 自我參考結構 自我參考結構之應用 鏈結串列 樹狀結構 以鏈結串列為例 struct node a, b; /* 表示目前有兩個結構變數 a 、 b */ a.name = "John"; a.score = 90; a.next = NULL; b.name = "Mary"; b.score = 85; b.next = NULL; a "John"90 b “Mary"85

15 自我參考結構 動態記憶體配置 當要建立一鏈結串列時,每一節點記憶體的配置以 malloc 函數完成之 malloc 函數之語法如下: malloc(sizeof(struct node)) calloc 函數之語法如下: calloc( 配置數目, bytes 數目 ) 釋放記憶體 free ( 指標名稱 );

16 自我參考結構 以 malloc 函數來配置記憶體 假設有一指向 struct node 的指標 ptr 如下 struct node *ptr; ptr = (struct node *) malloc(sizeof(struct node)); 此時 ptr 指標為指向剛剛被配置出來的結構 範例 ex9-3a.c ptr

17 鏈結串列之建立 鏈結串列之加入 鏈結串列之刪除 鏈結串列之顯示 此處之加入與刪除之動作皆針對前端 ( 當然您也可以 以尾端或特定節點為其對象 ) 範例 ex9-4a.c

18 鏈結串列之建立 加入的動作 new_node = (struct node *) malloc(sizeof(struct node)); if (head == NULL) head = new_node; else { new_node->next = head; head = new_node; }

19 鏈結串列之建立 刪除的動作 if (head == NULL) printf("No more node to delete … \n"); else { del_node = head; head = head->next; free(del_node); }

20 鏈結串列之建立 顯示的動作 if (head == NULL) printf("No data to display … \n"); else { current = head; while (ptr != NULL) { printf("%s\n", current ->name); printf("%d\n\n", current ->score); current = current->next; }


Download ppt "第九章 結構. 結構的宣告 結構 它是由許多不同 ( 或相同 ) 資料型態的變數所組成的 集合,通常利用結構標籤稱呼此集合 struct student { char *name; int score; }; struct 為保留字,表示結構的宣告開始 結構項目需定義於大括號「 { } 」內 結尾需加上分號."

Similar presentations


Ads by Google