รายการโยง (linked lists) หอยทอด 30 ข้าวผัด 30 ไก่ย่าง 50 เนื้อทอด 30 ข้าวผัด 30 ก๋วยเตี๋ยว 25 ไก่ย่าง 50 ตับย่าง 30 หอยทอด 30 เนื้อทอด 30
list A B C D E โหนดแรก โหนดสุดท้าย โหนด ตัวชี้ ข้อมูล
โหนดสุดท้าย nil nil สำหรับภาษา pascal NULL NULL สำหรับภาษา C
การสร้างโหนดในภาษา c ใช้ตัวแปรโครงสร้าง(structure) ในการกำหนดลักษณะโหนด struct <ชื่อโหนด> { <data type> <variable> ; <data type> <variable> ; ... struct <ชื่อโหนด> *<ตัวแปร> ; } ตัวอย่าง struct node { int info; struct node *link ; } 2 ไบต์ 4 ไบต์ info link ข้อมูล ตัวชี้
ฟังก์ชันขอพื้นที่โหนด ตัวแปรตัวชี้ = malloc(sizeof(จำนวนไบต์)) ขอพื้นที่หน่วยความจำเท่ากับจำนวนไบต์ที่กำหนด โดยมี ตัวแปรตัวชี้ เก็บค่าเลขที่อยู่ของพื้นที่นั้น เช่น struct node *p , *q q = malloc(sizeof(struct node)); p = malloc(sizeof(6)); p q info link info link
การอ้างอิงเพื่อบันทึกข้อมูลในโหนด จะอ้างอิงตัวแปรที่เก็บเลขที่อยู่ของโหนด(ตัวแปรที่ชี้ไปที่โหนด)และชื่อเขตข้อมูล โดยใช้สัญลักษณ์ -> เป็นตัวเชื่อม ตัวแปร->ชื่อเขตข้อมูล q q->link q->info p P->info P->link
P P->info = 51; 51 P P P->link = NULL ; 51 NULL หรือ 51 NULL q q->info = 25; 25 q P 25 51 NULL q->link = p;
การเข้าถึงข้อมูลในโหนดที่โยงกัน list 51 25 89 43 NULL list->info คือ 51 list->link->info คือ 25 list->link->link->info คือ 89 list->link->link->link->info คือ 43
ฟังก์ชันสร้างรายการโยง struct node *insert_node(struct node *list,int x) {struct node *newnode , *p; newnode = malloc(sizeof(struct node)); newnode->info = x; newnode->link = NULL; if(list == NULL) list = newnode; else { p = list ; while(p->link != NULL) p = p->link; p->link = newnode; } return list;
ฟังก์ชันเข้าถึงรายการโยง access_list(struct node *list) { struct node *p; { p = list; while(p != NULL) { printf(“%d \n” ,p->info); p = p->link; } return 0;
ฟังก์ชันตัดโหนดแรกออกจากรายการโยง struct node *delete_node(struct node *list, int *x) { if(list != NULL) { *x = list ->info; if(list->link == NULL)list = NULL; else list = list->link; } return list;
ฟังก์ชันใช้รายการโยงเป็นกองซ้อน struct node *push(struct node *top,int x) { struct node *newnode; newnode = malloc(sizeof(struct node)); newnode->info = x; newnode->link = top; top = newnode; return top; }
รายการโยงเป็นวง(circular link list) NULL A B C D list A B C D list->link
ฟังก์ชันสร้างรายการโยงเป็นวง struct node *insert_clist(struct node *list,int x) {struct node *newnode ; newnode = malloc(sizeof(struct node)); newnode->info = x; if(list == NULL)newnode->link = newnode; else {newnode->link = list->link; list->link = newnode; } list = newnode; return list;
ฟังก์ชันตัดโหนดแรกออกจากรายการโยงเป็นวง struct node *delete_clist(struct node *list, int *x) { if(list != NULL) { *x = list->link->info; if(list == list->link)list = NULL; else list->link = list->link->link; } return list;
การแทรกโหนดต่อจากโหนดใดๆ newnode p … … A B C D p newnode … … A B C D newnode->link = p->link newnode p … … A B C D p->link = newnode
การตัดโหนดที่ต่อจากโหนดใดๆ p … … A B C D p … … A B C D p->link = p->link->link
แบบฝึกหัด list NULL 45 12 38 57 94 list 45 12 38 57 94 1.จงเขียนฟังก์ชันเพื่อนับจำนวนโหนดในรายการโยง 2.จงเขียนฟังก์ชันเพื่อตัดโหนดสุดท้ายออกจากรายการโยง 3.จงเขียนฟังก์ชันเพื่อตัดโหนดในลำดับที่ k ใดๆ(ถ้ามี) ออกจากรายการโยง 4.จงเขียนฟังก์ชันเพื่อนับจำนวนโหนดในรายการโยงเป็นวง 5.จงเขียนฟังก์ชันเพื่อตัดโหนดสุดท้ายออกจากรายการโยงเป็นวง 6.จงเขียนฟังก์ชันเพื่อเปลี่ยนรายการโยงให้เป็นรายการโยงเป็นวงที่มีตัวชี้รายการชี้ที่โหนดสุดท้าย 7.จงเขียนฟังก์ชันเพื่อเปลี่ยนรายการโยงเป็นวงให้เป็นรายการปกติ 8.จงเขียนฟังก์ชันเพื่อกลับทิศทางรายการโยง ตัวอย่าง list NULL 45 12 38 57 94 เมื่อจบฟังก์ชัน list 45 12 38 57 94 NULL