Linked-List (รายการโยง) อ.ธรรมศักดิ์ เธียรนิเวศน์
204311 File Management & Data Structure Agenda Static List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) deleteList(การลบสมชิกออกจากรายการ) Traverse(การเข้าถึงสมาชิกของรายการ) Dynamic List (Linked-List) 204311 File Management & Data Structure
204311 File Management & Data Structure Objective นักศึกษาสามารถ อธิบายโครงสร้างข้อมูลแบบ Linked List ได้ถูกต้อง เขียนอัลกอริธึม และโปรแกรมด้วยภาษา C ในการดำเนินการต่าง ๆ ตามโครงสร้างข้อมูลแบบ Linked List ได้ถูกต้องอย่างมีประสิทธิภาพ 204311 File Management & Data Structure
Static List
204311 File Management & Data Structure Static List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) deleteList(การลบสมชิกออกจากรายการ) Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
204311 File Management & Data Structure CreateList (static) typedef struct listType{ int size; int value[5]; } LIST; LIST numlist; numlist Size = 0 numlist[0] numlist[1] numlist[2] numlist[3] numlist[4] 204311 File Management & Data Structure
204311 File Management & Data Structure Static List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) deleteList(การลบสมชิกออกจากรายการ) Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
204311 File Management & Data Structure isEmpty (static) // return 1 if list is empty, else return 0. int islempty(LIST dummy) { return (dummy.size == 0); } 204311 File Management & Data Structure
204311 File Management & Data Structure Static List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) deleteList(การลบสมชิกออกจากรายการ) Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
204311 File Management & Data Structure insertList (static) numlist[0] numlist[1] numlist[2] numlist[3] numlist[4] 23 25 34 48 Size = 4 numlist 23 24 25 34 48 Size = 5 pos for(i=lst.size;i>pos;i--) // re order from last element to pos lst.value[i] = lst.value[i-1]; numlist.value[pos] = 24; // insert dummy numlist.size++; // increase list size 204311 File Management & Data Structure
204311 File Management & Data Structure Static List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) deleteList(การลบสมชิกออกจากรายการ) Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
204311 File Management & Data Structure deleteList (static) numlist[0] numlist[1] numlist[2] numlist[3] numlist[4] 23 24 25 34 48 Size = 5 pos numlist 23 25 34 48 Size = 4 for(i=pos;i< numlist.size-1;i++) // re order from pos to last // element. numlist.value[i] = numlist.value[i+1]; numlist.size--; // decrease list size 204311 File Management & Data Structure
204311 File Management & Data Structure Static List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) deleteList(การลบสมชิกออกจากรายการ) Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
204311 File Management & Data Structure Traverse (static) numlist 23 25 34 48 Size = 4 i void printlst(LIST dummy) { int i; for(i=0;i<dummy.size;i++) printf("%3d",dummy.value[i]); } 204311 File Management & Data Structure
Dynamic List (Linked-List) value มูลค่า ตัวชี้บอกที่อยู่ของโหนดถัดไป
Advantages of Linked-List Size is unlimited (depends on memory space) More efficient when insert or delete element of the list. 204311 File Management & Data Structure
204311 File Management & Data Structure Dynamic List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) deleteList(การลบสมชิกออกจากรายการ) Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
204311 File Management & Data Structure CreateList (dynamic) typedef struct listnode{ // create list node type int value; struct listnode *next; } LISTNODE; LISTNODE *numlist=NULL; numlist =(LISTNODE *)malloc(sizeof(LISTNODE)); numlist 204311 File Management & Data Structure
204311 File Management & Data Structure Dynamic List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) deleteList(การลบสมชิกออกจากรายการ) Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
204311 File Management & Data Structure isEmpty (dynamic) // return 1 if list is empty, else return 0. int islempty(LISTNODE *head) { return (head == NULL); } numlist = NULL 204311 File Management & Data Structure
204311 File Management & Data Structure Dynamic List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) Insert first element Insert element on head of list Insert element between list Insert element on end of list deleteList(การลบสมชิกออกจากรายการ) Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
insertList (first element) numlist = getnode(); // head of list numlist->value = 23; numlist->next = NULL; numlist 23 NULL 204311 File Management & Data Structure
204311 File Management & Data Structure Dynamic List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) Insert first element Insert element on head of list Insert element between list Insert element on end of list deleteList(การลบสมชิกออกจากรายการ) Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
204311 File Management & Data Structure insertList (on head) NEW = getnode(); // head of list NEW->value = 20; NEW->next = numlist; numlist = NEW; NEW 20 numlist 23 NULL 204311 File Management & Data Structure
204311 File Management & Data Structure Dynamic List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) Insert first element Insert element on head of list Insert element between list Insert element on end of list deleteList(การลบสมชิกออกจากรายการ) Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
insertList (between list) NEW = getnode(); NEW->value = 24; NEW->next = numlist->next ; numlist->next = NEW; numlist 23 25 NULL NEW 24 204311 File Management & Data Structure
204311 File Management & Data Structure Dynamic List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) Insert first element Insert element on head of list Insert element between list Insert element on end of list deleteList(การลบสมชิกออกจากรายการ) Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
204311 File Management & Data Structure insertList (on last) NEW = getnode(); NEW->value = 25; NEW->next = NULL; numlist->next = NEW; numlist 23 NULL 25 NULL NEW 204311 File Management & Data Structure
204311 File Management & Data Structure Dynamic List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) deleteList(การลบสมชิกออกจากรายการ) delete element on head of list delete element between list delete element on end of list Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
204311 File Management & Data Structure deleteList (on head) if( numlist->value == 23 ){ // test value of head node backup = numlist; // backup head node numlist = numlist->next; // move head to next node free(backup); // free backup node } numlist 23 backup 24 25 NULL 204311 File Management & Data Structure
204311 File Management & Data Structure Dynamic List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) deleteList(การลบสมชิกออกจากรายการ) delete element on head of list delete element between list delete element on end of list Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
deleteList (between list) ptr = ptr->next; // move ptr to next node if( (ptr->next)->value == 24 ){ // test value of next node backup = ptr->next; // backup next node ptr->next = (ptr->next)->next; // point next node to skip 1 node free(backup); // free backup node } ptr 23 24 25 backup NULL 204311 File Management & Data Structure
204311 File Management & Data Structure Dynamic List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) deleteList(การลบสมชิกออกจากรายการ) delete element on head of list delete element between list delete element on end of list Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
204311 File Management & Data Structure deleteList (on last) while(ptr->next!=NULL){ ptr = ptr->next; // move ptr to next node if( (ptr->next)->value == 25 ){ // test value of next node backup = ptr->next; // backup next node ptr->next = (ptr->next)->next; // point next node to skip 1 node free(backup); // free backup node break; } ptr backup 23 24 25 NULL 204311 File Management & Data Structure
204311 File Management & Data Structure Dynamic List CreateList(การสร้างรายการว่าง) isEmpty(ทดสอบว่ารายการว่างหรือไม่) insertList(การเพิ่มสมาชิกใหม่ลงในรายการ) deleteList(การลบสมชิกออกจากรายการ) Traverse(การเข้าถึงสมาชิกของรายการ) 204311 File Management & Data Structure
204311 File Management & Data Structure Traverse (dynamic) void printlst(LISTNODE *numlist) { LISTNODE *ptr=numlist; while(ptr!=NULL){ printf("%3d",ptr->value); ptr = ptr->next; // next node } ptr numlist 23 24 25 NULL 204311 File Management & Data Structure
204311 File Management & Data Structure Dynamic List Advantages Size is unlimited (depends on memory space) More efficient when insert or delete element of the list. O(1) Disadvantages Cannot retrieve previous element. Function to counting size of list needs to traversing all over the list. O(N) 204311 File Management & Data Structure
204311 File Management & Data Structure Other Linked List Circular Linked List Doubly Linked List Linked List Stack Linked List Queue Linked List Priority Queue 204311 File Management & Data Structure
Question???