โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

18
โครงสร้างข้อมูลแบบลิงค์ลิสต์ (Linked List) โครงสร้างข้อมูล (Data Structure)

Transcript of โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

Page 1: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

โครงสร างขอม ลแบบลงค ลสต (Linked List)

โครงสรางขอมล (Data Structure)

Page 2: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

โครงสร างข อมลแบบลงค ล สต (Linked List) ลงคลสตเปนการจดเกบชดขอมลเชอมโยงตอเนองกน

ไปตามลำาดบ ซงอาจอยในลกษณะแบบเชงเสนตรง(linear) หรอ ไมเปนเสนตรง (nonlinear) กได ซง

ในลสตจะประกอบไปดวยขอมลทเรยกวาโหนด(node) ในหนงโหนดจะประกอบดวยสวนของขอมลท

ตองการจดเกบ เรยกวาสวน Info และสวนทเปน พอยนเตอรทชไปยงโหนดถดไป (Link) หรอชไปยง

โหนดอนๆทอยในลสต หากไมมโหนดทอยถดไป สวน ทเปนพอยนเตอรหรอ Link จะเกบคา NULL หรอ

NILL ใชสญลกษณ ^

Page 3: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

โครงสร างข อมลแบบลงค ล สต (Linked List) Linke d lis t คลายๆ กบขบวนรถไฟ ตรงทวาการทจะเกด

เปนขบวนรถไฟไดจะตองมการนำาโบกรถไฟหลายๆ โบกมาตอกน ขบวนจะสนหรอยาวกขนอยกบโบกเหลาน หากผโดยสารโบกแรกๆ ตองการทจะไปยงโบกสดทายกตองเดนผานโบกอนๆ ระหวางทางดวย

Page 4: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

โครงสร างข อมลแบบลงค ล สต (Linked List) โหนด (Node)

โครงสรางแบบ Linked list แบงไดหลายแบบตามวธการช ไปยงโหนดตางๆ เชน Singly Linked list , Doubly

Linked list , Multi-Linked list Singly Linked list

Singly Linked list จะประกอบดวยโหนดทมพอยนเตอรช ไปในทศทางเดยว คอชไปยงโหนดถดไป

Page 5: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

โครงสร างข อมลแบบลงค ล สต (Linked List) Doubly Linked list

Doubly linked list ประกอบดวยสวนของ Info และ พอยนเตอรทชไป 2 ทศทาง คอ ชไปยงโหนด

ถดไป และชไปยงโหนดกอนหนา ดงนนเราจง สามารถทำาการอานขอมลได 2 วธ คอ การอานไป

ขางหนา และอานไปทางขางหลง

Page 6: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

การทำางานของลสต การสรางลสตวาง การทดสอบวาลสตวางหรอไม การเพมสมาชกใหมลงในลสต การลบสมาชกออกจากลสต การทองไปในลสตหรอสวนของลสต โดยการเขาถง

สมาชก และประมวลผลสมาชกแบบลำาดบ

Page 7: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

การสรางรายการวางtypedef struct listnode{ // create list node type int value; struct listnode *next;} LISTNODE;

LISTNODE *numlist=NULL;numlist =(LISTNODE *)malloc(sizeof(LISTNODE));

numlist

Page 8: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

ทดสอบวารายการวางหรอไม// return 1 if list is empty, else return 0.int islempty(LISTNODE *head){ return (head == NULL);}

numlist=

NULL

Page 9: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

การเพมสมาชกใหมลงในรายการ Insert first element Insert element on head of list Insert element between list Insert element on end of list

Page 10: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

Insert first elementnumlist = getnode(); // head of list

numlist->value = 23;

numlist->next = NULL;

numlist 23 NULL

Page 11: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

Insert element on head of listNEW = getnode(); // head of list

NEW->value = 20;

NEW->next = numlist;

NEW 20

numlist 23 NULL

numlist = NEW;

Page 12: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

Insert element between listNEW = getnode();

NEW->value = 24;

NEW->next = numlist->next ;

numlist 23

numlist->next = NEW;

25

NULLNEW 24

Page 13: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

Insert element on end of listNEW = getnode();

NEW->value = 25;

NEW->next = NULL;

NEW25

numlist 23 NULL

numlist->next = NEW;

NULL

Page 14: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

การลบสมาชกออกจากรายการ delete element on head of list delete element between list delete element on end of list

Page 15: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

delete element on head of listif( numlist->value == 23 ){ // test value of head node

backup = numlist; // backup head node

numlist = numlist->next; // move head to next node

23

free(backup); // free backup node}

25

NULL

24backup

Page 16: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

delete element between listptr = ptr->next; // move ptr to next nodeif( (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

23

free(backup); // free backup node}

25

NULL

24

backup

Page 17: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

delete element on end of listwhile(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

23

free(backup); // free backup node break; }} 25

NULL

24

ptr backup

Page 18: โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)

การเข าถ งสมาชกของรายการvoid printlst(LISTNODE *numlist){ LISTNODE *ptr=numlist; while(ptr!=NULL){ printf("%3d",ptr->value); ptr = ptr->next; // next node }}

23 25

NULL

24

ptr

numlist