โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)
Transcript of โครงสร้างข้อมูลแบบลิงค์ลิสต์ (linklist)
โครงสร างขอม ลแบบลงค ลสต (Linked List)
โครงสรางขอมล (Data Structure)
โครงสร างข อมลแบบลงค ล สต (Linked List) ลงคลสตเปนการจดเกบชดขอมลเชอมโยงตอเนองกน
ไปตามลำาดบ ซงอาจอยในลกษณะแบบเชงเสนตรง(linear) หรอ ไมเปนเสนตรง (nonlinear) กได ซง
ในลสตจะประกอบไปดวยขอมลทเรยกวาโหนด(node) ในหนงโหนดจะประกอบดวยสวนของขอมลท
ตองการจดเกบ เรยกวาสวน Info และสวนทเปน พอยนเตอรทชไปยงโหนดถดไป (Link) หรอชไปยง
โหนดอนๆทอยในลสต หากไมมโหนดทอยถดไป สวน ทเปนพอยนเตอรหรอ Link จะเกบคา NULL หรอ
NILL ใชสญลกษณ ^
โครงสร างข อมลแบบลงค ล สต (Linked List) Linke d lis t คลายๆ กบขบวนรถไฟ ตรงทวาการทจะเกด
เปนขบวนรถไฟไดจะตองมการนำาโบกรถไฟหลายๆ โบกมาตอกน ขบวนจะสนหรอยาวกขนอยกบโบกเหลาน หากผโดยสารโบกแรกๆ ตองการทจะไปยงโบกสดทายกตองเดนผานโบกอนๆ ระหวางทางดวย
โครงสร างข อมลแบบลงค ล สต (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 วธ คอ การอานไป
ขางหนา และอานไปทางขางหลง
การทำางานของลสต การสรางลสตวาง การทดสอบวาลสตวางหรอไม การเพมสมาชกใหมลงในลสต การลบสมาชกออกจากลสต การทองไปในลสตหรอสวนของลสต โดยการเขาถง
สมาชก และประมวลผลสมาชกแบบลำาดบ
การสรางรายการวาง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 elementnumlist = getnode(); // head of list
numlist->value = 23;
numlist->next = NULL;
numlist 23 NULL
Insert element on head of listNEW = getnode(); // head of list
NEW->value = 20;
NEW->next = numlist;
NEW 20
numlist 23 NULL
numlist = NEW;
Insert element between listNEW = getnode();
NEW->value = 24;
NEW->next = numlist->next ;
numlist 23
numlist->next = NEW;
25
NULLNEW 24
Insert element on end of listNEW = getnode();
NEW->value = 25;
NEW->next = NULL;
NEW25
numlist 23 NULL
numlist->next = NEW;
NULL
การลบสมาชกออกจากรายการ delete element on head of list delete element between list delete element on end of list
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
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
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
การเข าถ งสมาชกของรายการ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