190 likes | 369 Views
วิชา COSC2202 โครงสร้างข้อมูล (Data Structure). โครงสร้างข้อมูลแบบลิงค์ลิสต์ ( Linked List). โครงสร้างข้อมูลแบบลิงค์ลิสต์ ( Linked List).
E N D
วิชา COSC2202โครงสร้างข้อมูล (Data Structure) โครงสร้างข้อมูลแบบลิงค์ลิสต์ (Linked List)
โครงสร้างข้อมูลแบบลิงค์ลิสต์ (Linked List) • ลิงค์ลิสต์เป็นการจัดเก็บชุดข้อมูลเชื่อมโยงต่อเนื่องกันไปตามลำดับ ซึ่งอาจอยู่ในลักษณะแบบเชิงเส้นตรง (linear) หรือ ไม่เป็นเส้นตรง (nonlinear) ก็ได้ ซึ่งในลิสต์จะประกอบไปด้วยข้อมูลที่เรียกว่าโหนด (node) ในหนึ่งโหนดจะประกอบด้วยส่วนของข้อมูลที่ต้องการจัดเก็บ เรียกว่าส่วน Info และส่วนที่เป็นพอยน์เตอร์ที่ชี้ไปยังโหนดถัดไป (Link) หรือชี้ไปยังโหนดอื่นๆที่อยู่ในลิสต์ หากไม่มีโหนดที่อยู่ถัดไป ส่วนที่เป็นพอยน์เตอร์หรือ Link จะเก็บค่า NULL หรือ NILL ใช้สัญลักษณ์ ^
โครงสร้างข้อมูลแบบลิงค์ลิสต์ (Linked List) • Linked list คล้ายๆ กับขบวนรถไฟ ตรงที่ว่าการที่จะเกิดเป็นขบวนรถไฟได้จะต้องมีการนำโบกี้รถไฟหลายๆ โบกี้มาต่อกัน ขบวนจะสั้นหรือยาวก็ขึ้นอยู่กับโบกี้เหล่านี้ หากผู้โดยสารโบกี้แรกๆ ต้องการที่จะไปยังโบกี้สุดท้ายก็ต้องเดินผ่านโบกี้อื่นๆ ระหว่างทางด้วย
โครงสร้างข้อมูลแบบลิงค์ลิสต์ (Linked List) • โหนด (Node) • โครงสร้างแบบ Linked list แบ่งได้หลายแบบตามวิธีการชี้ไปยังโหนดต่างๆ เช่น Singly Linked list , Doubly Linked list , Multi-Linked list • Singly Linked listSingly Linked list จะประกอบด้วยโหนดที่มีพอยน์เตอร์ชี้ไปในทิศทางเดียว คือชี้ไปยังโหนดถัดไป
โครงสร้างข้อมูลแบบลิงค์ลิสต์ (Linked List) • Doubly Linked list Doubly linked list ประกอบด้วยส่วนของ Info และ พอยน์เตอร์ที่ชี้ไป 2 ทิศทาง คือ ชี้ไปยังโหนดถัดไป และชี้ไปยังโหนดก่อนหน้า ดังนั้นเราจึงสามารถทำการอ่านข้อมูลได้ 2 วิธี คือ การอ่านไปข้างหน้า และอ่านไปทางข้างหลัง
การทำงานของลิสต์ • การสร้างลิสต์ว่าง • การทดสอบว่าลิสต์ว่างหรือไม่ • การเพิ่มสมาชิกใหม่ลงในลิสต์ • การลบสมาชิกออกจากลิสต์ • การท่องไปในลิสต์หรือส่วนของลิสต์ โดยการเข้าถึงสมาชิก และประมวลผลสมาชิกแบบลำดับ
การสร้างรายการว่าง typedef struct listnode{// create list node type int value; struct listnode *next; } LISTNODE; LISTNODE *numlist=NULL; numlist =(LISTNODE *)malloc(sizeof(LISTNODE)); numlist
ทดสอบว่ารายการว่างหรือไม่ทดสอบว่ารายการว่างหรือไม่ // return 1 if list is empty, else return 0. int islempty(LISTNODE *head) { return (head == NULL); } numlist = NULL
การเพิ่มสมาชิกใหม่ลงในรายการการเพิ่มสมาชิกใหม่ลงในรายการ • Insert first element • Insert element on head of list • Insert element between list • Insert element on end of list
Insert first element numlist = getnode(); // head of list numlist->value = 23; numlist->next = NULL; 23 NULL numlist
Insert element on head of list NEW = getnode(); // head of list NEW->value = 20; NEW->next = numlist; numlist = NEW; NEW 20 numlist 23 NULL
Insert element between list NEW = getnode(); NEW->value = 24; NEW->next = numlist->next ; numlist->next = NEW; numlist 23 25 NEW 24 NULL
Insert element on end of list NEW = getnode(); NEW->value = 25; NEW->next = NULL; numlist->next = NEW; numlist 23 NULL 25 NULL NEW
การลบสมาชิกออกจากรายการการลบสมาชิกออกจากรายการ • delete element on head of list • delete element between list • delete element on end of list
delete element on head of list 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 } 23 24 25 backup NULL
delete element 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 } 24 23 25 backup NULL
delete element on end of list 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 24 23 25 NULL
การเข้าถึงสมาชิกของรายการการเข้าถึงสมาชิกของรายการ void printlst(LISTNODE *numlist) { LISTNODE *ptr=numlist; while(ptr!=NULL){ printf("%3d",ptr->value); ptr = ptr->next; // next node } } ptr 24 numlist 23 25 NULL