วิชา COSC2202 โครงสร้างข้อมูล (Data Structure) โครงสร้างข้อมูลแบบลิงค์ลิสต์ (Linked List)
โครงสร้างข้อมูลแบบลิงค์ลิสต์ (Linked List) ลิงค์ลิสต์เป็นการจัดเก็บชุดข้อมูลเชื่อมโยงต่อเนื่องกันไปตามลำดับ ซึ่งอาจอยู่ ในลักษณะแบบเชิงเส้นตรง (linear) หรือ ไม่เป็นเส้นตรง (nonlinear) ก็ได้ ซึ่ง ในลิสต์จะประกอบไปด้วยข้อมูลที่เรียกว่าโหนด (node) ในหนึ่งโหนดจะ ประกอบด้วยส่วนของข้อมูลที่ต้องการจัดเก็บ เรียกว่าส่วน Info และส่วนที่เป็น พอยน์เตอร์ที่ชี้ไปยังโหนดถัดไป (Link) หรือชี้ไปยังโหนดอื่นๆที่อยู่ในลิสต์ หากไม่มีโหนดที่อยู่ถัดไป ส่วนที่เป็นพอยน์เตอร์หรือ Link จะเก็บค่า NULL หรือ NILL ใช้สัญลักษณ์ ^
โครงสร้างข้อมูลแบบลิงค์ลิสต์ (Linked List)
โครงสร้างข้อมูลแบบลิงค์ลิสต์ (Linked List) โหนด (Node) โครงสร้างแบบ Linked list แบ่งได้หลายแบบตามวิธีการชี้ไปยังโหนดต่างๆ เช่น Singly Linked list , Doubly Linked list , Multi-Linked list Singly Linked list Singly Linked list จะประกอบด้วยโหนดที่มีพอยน์เตอร์ชี้ไปในทิศทางเดียว คือชี้ไปยัง โหนดถัดไป
โครงสร้างข้อมูลแบบลิงค์ลิสต์ (Linked List) Doubly Linked list Doubly linked list ประกอบด้วยส่วนของ Info และ พอยน์เตอร์ที่ชี้ไป 2 ทิศทาง คือ ชี้ไปยังโหนดถัดไป และชี้ไปยังโหนดก่อนหน้า ดังนั้นเราจึง สามารถทำการอ่านข้อมูลได้ 2 วิธี คือ การอ่านไปข้างหน้า และอ่านไปทาง ข้างหลัง
การทำงานของลิสต์ การสร้างลิสต์ว่าง การทดสอบว่าลิสต์ว่างหรือไม่ การเพิ่มสมาชิกใหม่ลงในลิสต์ การลบสมาชิกออกจากลิสต์ การท่องไปในลิสต์หรือส่วนของลิสต์ โดยการเข้าถึงสมาชิก และประมวลผล สมาชิกแบบลำดับ
การสร้างรายการว่าง numlist 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; numlist 23 NULL
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 } 23 24 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 23 24 25 NULL
การเข้าถึงสมาชิกของรายการ 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