Ch 4 1 c include stdio h include

  • Slides: 89
Download presentation

/* 程式範例: Ch 4 -1. c */ #include <stdio. h> #include <stdlib. h> /*

/* 程式範例: Ch 4 -1. c */ #include <stdio. h> #include <stdlib. h> /* 主程式 */ int main() { struct test { /* 宣告結構 */ int math; }; /* 結構陣列指標變數宣告 */ struct test *score, *ptr; float *ave; int i, num, sum, temp; printf("請輸入學生人數 ==> "); /* 讀取學生人數 */ scanf("%d", &num); 2020/11/23 /* 配置成績陣列的記憶體 */ score=(struct test *)malloc(num*sizeof(struct test)); if ( score != NULL ) { /* 檢查指標 */ sum = 0; /* 讀取成績 */ for ( i = 0; i < num; i++ ) { ptr = &score[i]; /* 指向結構的指標 */ printf("請輸入第%d位的成績. ==> ", i+1); scanf("%d", &temp); ptr->math = temp; /* 指定數學成績 */ sum += temp; } /* 配置浮點數的記憶體 */ ave = (float *) malloc(sizeof(float)); *ave = (float) sum / (float) num; /* 計算平均 */ printf("成績總分: %6 dn", sum); printf("平均成績: %6. 2 fn", *ave); free(ave); /* 釋回記憶體空間 */ free(score); } else printf("成績結構陣列的記憶體配置失敗!n"); system("PAUSE"); return 0; } CH 04 -鏈結串列 8

4 -3 單向鏈結串列-標頭檔 01: /* 程式範例: Ch 4 -3. h */ 02: struct Node

4 -3 單向鏈結串列-標頭檔 01: /* 程式範例: Ch 4 -3. h */ 02: struct Node { /* Node節點結構 */ 03: int data; /* 結構變數宣告 */ 04: struct Node *next; /* 指向下一個節點 */ 05: }; 06: typedef struct Node LNode; /* 串列節點的新型態 */ 07: typedef LNode *List; /* 串列的新型態List */ 08: List first = NULL; /* 串列的開頭指標first */ 09: /* 抽象資料型態的操作函數宣告 */ 10: extern void creat. List(int len, int *array); 11: extern int is. List. Empty(); 12: extern void print. List(); 13: extern List search. Node(int d); 14: extern int delete. Node(List ptr); 15: extern void insert. Node(List ptr, int d); 2020/11/23 CH 04 -鏈結串列 21

/* 程式範例: create. List. c */ /* 函數: 建立串列 */ void create. List(int len,

/* 程式範例: create. List. c */ /* 函數: 建立串列 */ void create. List(int len, int *array) { int i; List newnode; for ( i = 0; i < len; i++ ) { /* 配置節點記憶體 */ newnode = (List) malloc(sizeof(LNode)); newnode->data = array[i]; /* 建立節點內容 */ newnode->next = first; first = newnode; } } /* 函數: 檢查串列是否是空的 */ int is. List. Empty() { if ( first == NULL ) return 1; else return 0; } 2020/11/23 /* 函數: 顯示串列資料 */ void print. List() { List current = first; /* 目前的串列指標 */ while ( current != NULL ) { /* 顯示主迴圈 */ printf("[%d]", current->data); current = current->next; /* 下一個節點 */ } printf("n"); } /* 函數: 搜尋節點資料 */ List search. Node(int d) { List current = first; /* 目前的串列指標 */ while ( current != NULL ) { /* 搜尋主迴圈 */ if ( current->data == d ) /* 是否找到資料 */ return current; /* 找到 */ current = current->next; /* 下一個節點 */ } return NULL; /* 沒有找到 */ } CH 04 -鏈結串列 28

while ( temp != -1 ) { /* 程式範例: Ch 4 -3 -1. c

while ( temp != -1 ) { /* 程式範例: Ch 4 -3 -1. c */ printf("請輸入搜尋的郵寄編號(-1結束) ==> "); #include <stdio. h> scanf("%d", &temp); /* 讀取節點值 */ if ( temp != -1 ) /* 搜尋節點資料 */ #include <stdlib. h> if ( search. Node(temp) != NULL ) #include "Ch 4 -3. h" printf("串列包含節點[%d]n", temp); #include "create. List. c" else /* 主程式 */ printf("串列不含節點[%d]n", temp); int main() { } system("PAUSE"); int temp; /* 宣告變數 */ int data[6]={ 1, 2, 3, 4, 5, 6 }; /* 建立串列的陣 return 0; } 列 */ List ptr; /* 4 -3 -1: 建立, 走訪與搜尋串列 */ create. List(6, data); /* 建立串列 */ printf("原來的串列: "); print. List(); /* 顯示串列 */ printf("串列是否空的: %dn", is. List. Empty()); temp = 0; • 2020/11/23 CH 04 -鏈結串列 29

4 -3 -2 刪除單向鏈結串列的節點情況3(2) • 在執行刪除節點 3操作後的串列圖形,如下所示: • while (current->next!=ptr) current = current->next; current->next

4 -3 -2 刪除單向鏈結串列的節點情況3(2) • 在執行刪除節點 3操作後的串列圖形,如下所示: • while (current->next!=ptr) current = current->next; current->next = ptr ->next; CH 04 -鏈結串列 2020/11/23 33

 • • • • /* 程式範例: Ch 4 -3 -2. c */ #include

• • • • /* 程式範例: Ch 4 -3 -2. c */ #include <stdio. h> #include <stdlib. h> #include "Ch 4 -3. h" #include "create. List. c" #include "delete. Node. c" /* 主程式 */ int main() { int temp; /* 宣告變數 */ int data[6]={ 1, 2, 3, 4, 5, 6 }; /* 建立串列的陣列 */ List ptr; create. List(6, data); /* 建立串列 */ printf("原來的串列: "); print. List(); /* 顯示串列 */ 2020/11/23 CH 04 -鏈結串列 36

 • • • • • * 程式範例: Ch 4 -3 -3. c */

• • • • • * 程式範例: Ch 4 -3 -3. c */ #include <stdio. h> #include <stdlib. h> #include "Ch 4 -3. h" #include "create. List. c" #include "insert. Node. c" /* 主程式 */ int main() { int temp; /* 宣告變數 */ int data[6]={ 1, 2, 3, 4, 5, 6 }; /* 建立串列的陣列 */ List ptr; create. List(6, data); /* 建立串列 */ printf("原來的串列: "); print. List(); /* 顯示串列 */ /* 4 -3 -3: 節點插入 */ temp = 0; insert. Node(NULL, 50); /* 插入第一個節點 */ printf("插入後串列: "); print. List(); /* 顯示插入後串列 */ 2020/11/23 CH 04 -鏈結串列 44

4 -5 雙向鏈結串列-標頭檔 01: /* 程式範例: Ch 4 -5. h */ 02: struct Node

4 -5 雙向鏈結串列-標頭檔 01: /* 程式範例: Ch 4 -5. h */ 02: struct Node { /* Node節點結構 */ 03: int data; /* 結構變數宣告 */ 04: struct Node *next; /* 指向下一個節點 */ 05: struct Node *previous; /* 指向前一個節點 */ 06: }; 07: typedef struct Node DNode; /* 雙向串列節點的新型態 */ 08: typedef DNode *DList; /* 雙向串列的新型態 */ 09: DList first = NULL; /* 雙向串列的開頭指標 */ 10: DList now = NULL; /* 雙向串列目前節點指標 */ 11: /* 抽象資料型態的操作函數宣告 */ 12: extern void creat. DList(int len, int *array); 13: extern void print. DList(); 14: extern void next. Node(); 15: extern void previous. Node(); 16: extern void reset. Node(); 17: extern DList read. Node(); 18: extern void insert. DNode(DList ptr, int d); 19: extern void delete. DNode(DList ptr. CH 04 -鏈結串列 ); 2020/11/23 60

4 -5 -1 雙向鏈結串列的建立與走 訪-建立(圖例) for ( i = 1; i < len; i++

4 -5 -1 雙向鏈結串列的建立與走 訪-建立(圖例) for ( i = 1; i < len; i++ ) { newnode = (DList) malloc(sizeof(DNode)); newnode->data = array[i]; newnode->next = NULL; //Step 1 newnode->previous=before; //Step 2 before->next=newnode; //Step 3 before = newnode; //Step 4 } CH 04 -鏈結串列 2020/11/23 63

4 -5 -2 雙向鏈結串列內節點的插 入-情況1(圖例) • • • Step 1: newnode->next = first; Step

4 -5 -2 雙向鏈結串列內節點的插 入-情況1(圖例) • • • Step 1: newnode->next = first; Step 2: first->previous = newnode; Step 3: first = newnode; 2020/11/23 CH 04 -鏈結串列 66

4 -5 -2 雙向鏈結串列內節點的插 入-情況3(圖例) – Step 1:將ptr節點next指向下一個節點的previous指標指向新節點。 ptr->next->previous = newnode; – Step 2:新節點的next指標指向ptr節點next指標的下一個節點。

4 -5 -2 雙向鏈結串列內節點的插 入-情況3(圖例) – Step 1:將ptr節點next指向下一個節點的previous指標指向新節點。 ptr->next->previous = newnode; – Step 2:新節點的next指標指向ptr節點next指標的下一個節點。 newnode->next = ptr->next; – Step 3:新節點的previous指標指向ptr節點。 newnode->previous = ptr; – Step 4:將ptr節點的next指標指向新節點。 CH 04 -鏈結串列 2020/11/23 ptr->next = newnode; 70

4 -6 鏈結串列的應用 - 多項式表 示法(標頭檔) 01: /* 程式範例: Ch 4 -6. h */

4 -6 鏈結串列的應用 - 多項式表 示法(標頭檔) 01: /* 程式範例: Ch 4 -6. h */ 02: struct Node { /* Node節點結構 */ 03: float coef; int exp; /* 結構變數宣告 */ 04: struct Node *next; /* 指向下一個節點 */ 05: }; 06: typedef struct Node PNode; 07: typedef PNode *PList; /* 多項式串列的新型態 */ 08: /* 抽象資料型態的操作函數宣告 */ 09: extern PList create. Poly(int len, float *array); 10: extern void print. Poly(PList first); 2020/11/23 CH 04 -鏈結串列 76

 • /* 程式範例: create. Poly. c */ • /* 函數: 建立多項式的串列 */ •

• /* 程式範例: create. Poly. c */ • /* 函數: 建立多項式的串列 */ • PList create. Poly(int len, float *array) { • int i; • PList first, ptr, newnode; /* 建立開頭節點 */ • first = (PList) malloc(sizeof(PNode)); • first->coef = 0. 0; /* 建立開頭節點的內容 */ • first->exp = -1; • ptr = first; /* 前一個節點指標 */ • for ( i = len-1; i >= 0; i-- ) { • if ( array[i] != 0. 0 ) { /* 配置節點記憶體 */ • newnode = (PList) malloc(sizeof(PNode)); • newnode->coef = array[i]; /* 建立節點的內容 */ • newnode->exp = i; • ptr->next = newnode; /* 連結新節點 */ • ptr = newnode; /* 成為前一個節點 */ • } • ptr->next = first; /* 連結第 1個節點, 建立環狀串列 */ • return first; • } CH 04 -鏈結串列 2020/11/23 80

 • • • • • /* 程式範例: Ch 4 -6. c */ #include

• • • • • /* 程式範例: Ch 4 -6. c */ #include <stdio. h> #include <stdlib. h> #include "Ch 4 -6. h" #include "create. Poly. c" /* 主程式 */ int main() { PList a = NULL; /* 多項式串列 1的開頭指標 */ PList b = NULL; /* 多項式串列 2的開頭指標 */ /* 建立多項式物件所需的陣列 */ float list 1[6] = { 4, 0, 3, 0, 7, 0 }; float list 2[6] = { 9, 7, 1, 0, 5, 6 }; a = create. Poly(6, list 1); /* 建立多項式串列 1 */ b = create. Poly(6, list 2); /* 建立多項式串列 2 */ print. Poly(a); /* 顯示多項式 1 */ print. Poly(b); /* 顯示多項式 2 */ system("PAUSE"); return 0; } 2020/11/23 CH 04 -鏈結串列 82

/* 程式範例: Ch 4 -3 -1. c */ #include <stdio. h> #include <stdlib. h>

/* 程式範例: Ch 4 -3 -1. c */ #include <stdio. h> #include <stdlib. h> #include "Ch 4 -3. h" void create(int len, int *array) { int i; List newnode; for ( i = 0; i < len; i++ ) { /* 配置節點記憶體*/ newnode = (List) malloc(sizeof(LNode)); newnode->data = array[i]; /* 建立節點內容*/ newnode->next = first; first = newnode; } } /* 函數: 檢查串列是否是空的*/ int is. List. Empty() { if ( first == NULL ) return 1; else return 0; } /* 函數: 顯示串列資料*/ void print. List() { List current = first; /* 目前的串列指標*/ while ( current != NULL ) { /* 顯示主迴圈*/ printf("[%d]", current->data); current = current->next; /* 下一個節點*/ } printf("n"); } 2020/11/23 /* 函數: 搜尋節點資料*/ Ex: //#include "Ch. 4 -3. cpp" /* 主程式*/ int main() { int temp; /* 宣告變數*/ int data[6]={ 1, 2, 3, 4, 5, 6 }; /* 建立串列的陣列*/ List ptr; /* 4 -3 -1: 建立, 走訪與搜尋串列*/ create(6, data); /* 建立串列*/ printf("原來的串列: "); print. List(); /* 顯示串列*/ printf("串列是否空的: %dn", is. List. Empty()); temp = 0; while ( temp != -1 ) { printf("請輸入搜尋的郵寄編號(-1結束) ==> "); scanf("%d", &temp); /* 讀取節點值*/ if ( temp != -1 ) /* 搜尋節點資料*/ if ( search. Node(temp) != NULL ) printf("串列包含節點[%d]n", temp); else printf("串列不含節點[%d]n", temp); } system("PAUSE"); return 0; } CH 04 -鏈結串列 84

Ex: Ch 4 -3. h • /* 程式範例: Ch 4 -3. h */ •

Ex: Ch 4 -3. h • /* 程式範例: Ch 4 -3. h */ • • • struct Node { /* Node節點結構*/ int data; /* 結構變數宣告*/ struct Node *next; /* 指向下一個節點*/ }; typedef struct Node LNode; /* 串列節點的新型態*/ typedef LNode *List; /* 串列的新型態List */ List first = NULL; /* 串列的開頭指標first */ /* 抽象資料型態的操作函數宣告*/ void create(int len, int *array); int is. List. Empty(); void print. List(); List search. Node(int d); • • // extern int delete. Node(List ptr); //extern void insert. Node(List ptr, int d); 2020/11/23 CH 04 -鏈結串列 85

2020/11/23 CH 04 -鏈結串列 86

2020/11/23 CH 04 -鏈結串列 86

程式範例: Ch 4 -6. c • • • • • /* 程式範例: Ch 4

程式範例: Ch 4 -6. c • • • • • /* 程式範例: Ch 4 -6. c */ #include <stdio. h> #include <stdlib. h> #include "Ch 4 -6. h" //#include "create. Poly. c" /* 主程式*/ int main() { PList a = NULL; /* 多項式串列的開頭指標*/ PList b = NULL; /* 多項式串列的開頭指標*/ /* 建立多項式物件所需的陣列*/ float list 1[6] = { 4, 0, 3, 0, 7, 0 }; float list 2[6] = { 9, 7, 1, 0, 5, 6 }; a = create. Poly(6, list 1); /* 建立多項式串列*/ b = create. Poly(6, list 2); /* 建立多項式串列*/ print. Poly(a); /* 顯示多項式*/ print. Poly(b); /* 顯示多項式*/ system("PAUSE"); return 0; } 2020/11/23 CH 04 -鏈結串列 87

/* 程式範例: create. Poly. c */ • • /* 程式範例: create. Poly. c */

/* 程式範例: create. Poly. c */ • • /* 程式範例: create. Poly. c */ /* 函數: 建立多項式的串列*/ #include <stdio. h> #include <stdlib. h> #include "Ch 4 -6. h" //#include "create. Poly. c" PList create. Poly(int len, float *array) { • int i; • PList first, ptr, newnode; /* 建 立開頭節點*/ • first = (PList) malloc(sizeof(PNode)); • first->coef = 0. 0; /* 建立開頭 節點的內容*/ • first->exp = -1; • ptr = first; /* 前一個節點 指標*/ • for ( i = len-1; i >= 0; i-- ) { • if ( array[i] != 0. 0 ) { /* 配置 節點記憶體*/ • newnode = (PList) malloc(sizeof(PNode)); • newnode->coef = array[i]; /* 建立節點的內容*/ • newnode->exp = i; • ptr->next = newnode; /* 2020/11/23 連結新節點*/ /* 函數: 顯示多項式*/ void print. Poly(PList first) { PList ptr = first->next; /* 串列真正的開 頭*/ float c; int e; while ( ptr != first ) { /* 顯示主迴圈*/ c = ptr->coef; //印係數 e = ptr->exp; //印指數 printf("%3. 1 f. X^%d", c, e); ptr = ptr->next; /* 下一個節點*/ if ( ptr != first ) printf("+"); } printf("n"); } CH 04 -鏈結串列 88

/* 程式範例: Ch 4 -6. h */ • • • /* 程式範例: Ch 4

/* 程式範例: Ch 4 -6. h */ • • • /* 程式範例: Ch 4 -6. h */ struct Node { /* Node節點結構*/ float coef; int exp; /* 結構變數宣告*/ struct Node *next; /* 指向下一個節點*/ }; typedef struct Node PNode; typedef PNode *PList; /* 多項式串列的新型態*/ /* 抽象資料型態的操作函數宣告*/ extern PList create. Poly(int len, float *array); extern void print. Poly(PList first); 2020/11/23 CH 04 -鏈結串列 89