# Linked list-Struct 細節探討與學習(下) ###### tags: `資料結構` Copyright 2021, [月下麒麟](https://hackmd.io/@YMont/note-catalog) --- ## Outline 關於linked-list結構應用,可以先參考上部 [Linked list-Struct 細節探討與學習(上)](https://hackmd.io/@YMont/B18SDqFXt) ## 結構建立, 輸出, 釋放 >linked list 實作 ```c= #include <stdio.h> #include <stdlib.h> struct t_node{ int data; struct t_node *next; }; typedef struct t_node Node; //declare Node *createList(int*, int); void printList(Node *); void freeList(Node *); int main(void) { Node *first; int arr[5] = {17, 19, 21, 23, 25}; first = createList(arr, 5); printList(first); freeList(first); return 0; } // create function Node *createList(int *arr, int len){ Node *first, *current, *previous; for(int i=0; i<len; i++){ current = (Node *)malloc(sizeof(Node)); current->data = arr[i]; if(i==0){ first = current; } else { previous->next = current; } current->next = NULL; previous = current; } return first; } //print function void printList(Node *first){ Node *node = first; if(first == NULL){ printf("List is empty\n"); } else{ while(node!=NULL){ printf("%3d",node->data); node = node->next; } printf("\n"); } } //free function void freeList(Node *first){ Node *current, *temp; current = first; while(current!=NULL){ temp = current; current = current->next; free(temp); } } /* Output ./main 17 19 21 23 25 */ ``` --- ## 補充比較 **比較1** 一個靜態連結的練習 (重複練習是很重要的) ```c= #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct s_node Node; struct s_node{ Node *next; char name[12] ; int grade ; }; int main(void) { Node *head = (Node*)malloc(sizeof(Node)); head->grade = 77; strncpy(head->name,"john",12); head->next = NULL; Node *node2 = (Node*)malloc(sizeof(Node)); node2->grade = 89; strncpy(node2->name,"edgar",12); head->next = node2; node2->next = NULL; Node *node3 = (Node*)malloc(sizeof(Node)); node3->grade = 63; strncpy(node3->name,"mary",12); node2->next = node3; node3->next = NULL; while(head!=NULL){ printf("data:%s\t",head->name); printf("grade:%d\t",head->grade); printf("addr:%p\n",head); head = head->next; } return 0; } ``` --- >比較1用不同指標(node)名稱去malloc;比較2用相同指標名稱同樣實作 讀者可以試著將上面的程式碼看完後,與下方比較, 會發現若3個node都用同樣的指標變數(ptr)去承接, 理解上需要稍微留意, 但熟悉了就沒這個問題。 **比較2** ```c= #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct t_node Node; struct t_node{ Node *next; int data; char name[12]; }; // static Node *head = NULL; int main(void) { Node *head = NULL; Node *now = NULL; Node *ptr = NULL; // 第一個物件 ptr = (Node *)malloc(sizeof(Node)); ptr->data = 121; strncpy(ptr->name, "john", 12); head = ptr; // 因為head==null 故讓head會指向第一個物件 ptr now = ptr; // 第二個物件 ptr = (Node *)malloc(sizeof(Node)); ptr->data = 144; strncpy(ptr->name, "edgar", 12); // 此時的 now 是第一個物件 now->next = ptr; // 第一個物件 now->next 指向新的第二個物件 ptr now = ptr; // now 指向第二個物件 ptr // 第三個物件 ptr = (Node *)malloc(sizeof(Node)); ptr->data = 169; strncpy(ptr->name, "mary", 12); // 這邊同上 now->next = ptr; now = ptr; for(ptr = head; ptr != NULL; ptr = ptr->next){ printf("name:%s\t",ptr->name); printf("data:%d\t",ptr->data); printf("addr:%p\n",ptr); } printf("\n"); printf("sizeof(*ptr):%ld\n", sizeof(*ptr)); printf("sizeof(ptr):%ld\n", sizeof(ptr)); printf("sizeof(Node):%ld\n", sizeof(Node)); return 0; } ``` 傑克,這真的是太神奇了! reference:[資料結構-鏈結串列教學-1-新增與印出](https://medium.com/@racktar7743/%E8%B3%87%E6%96%99%E7%B5%90%E6%A7%8B-%E9%8F%88%E7%B5%90%E4%B8%B2%E5%88%97%E6%95%99%E5%AD%B8-1-%E6%96%B0%E5%A2%9E%E8%88%87%E5%8D%B0%E5%87%BA-bb881da97796) 覺得這位作者寫的也不錯,可以參考看看他的觀點。 (未完待續...)