รายการที่เชื่อมโยงเป็นโครงสร้างข้อมูลเชิงเส้นซึ่งองค์ประกอบต่างๆ ถูกเชื่อมโยงผ่านพอยน์เตอร์ แต่ละองค์ประกอบหรือโหนดของรายการที่เชื่อมโยงมีส่วนข้อมูลและลิงก์ หรือเราสามารถบอกตัวชี้ไปยังองค์ประกอบถัดไปตามลำดับ องค์ประกอบสามารถใช้ตำแหน่งที่ไม่ต่อเนื่องกันในหน่วยความจำ
เราได้รับรายการที่เชื่อมโยงโดยลำพังซึ่งมีส่วนข้อมูลและลิงก์ไปยังองค์ประกอบถัดไป อินพุตอื่นคือตัวเลข K ภารกิจคือการหาองค์ประกอบสูงสุดและต่ำสุดของรายการที่เชื่อมโยงซึ่งหารด้วยหมายเลข K ได้ รายการเชื่อมโยงเชิงเส้นสามารถข้ามได้ในทิศทางเดียวเท่านั้น ในแต่ละโหนด เราจะตรวจสอบการแบ่งส่วนของข้อมูลด้วย K หากพบจำนวนดังกล่าวสูงสุดหรือต่ำสุด เราจะอัปเดตค่าของ MaxD และ MinD
ป้อนข้อมูล
SList : 5-->2-->10-->12-->3-->20-->7, K=5
ผลผลิต
Maximum element which is divisible by K : 20 Maximum element which is divisible by K : 5
คำอธิบาย − ข้ามจากโหนด Head ให้หารส่วนข้อมูลด้วย K และตรวจสอบว่าหารลงตัวหรือไม่ นั่นคือเศษเหลือ 0
มีเพียง 5, 10 และ 20 เท่านั้นที่หารด้วย 5 โดยที่ 5 คือค่าต่ำสุดและ 20 คือค่าสูงสุด
ป้อนข้อมูล
SList : 12-->2-->5-->18-->3-->144-->7, K=4
ผลผลิต
Maximum element which is divisible by K : 144 Maximum element which is divisible by K : 12
คำอธิบาย − ข้ามจากโหนด Head ให้หารส่วนข้อมูลด้วย K และตรวจสอบว่าหารลงตัวหรือไม่ นั่นคือเศษเหลือ 0
มีเพียง 12 และ 144 เท่านั้นที่หารด้วย 4 ลงตัว โดยที่ 12 คือค่าต่ำสุด และ 144 คือค่าสูงสุด
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
-
สร้างโหนดรายการที่เชื่อมโยง ที่นี่ เราได้สร้างคลาส SLLnode ซึ่งมีส่วนข้อมูลและตัวชี้ถัดไป
-
สร้างรายการที่เชื่อมโยง ที่นี่เราได้สร้างคลาส SLList ด้วยวัตถุ SLLnode ในฐานะที่เป็นสมาชิก ดังนั้น SLList จึงประกอบด้วย SLLnodes
-
ฟังก์ชัน addtohead(int) กำลังเพิ่มโหนดในรายการนี้
-
ในการเพิ่มองค์ประกอบใน SLList เราเรียก addtohead(int) โดยใช้วัตถุ SLList ชื่อ LIST
-
เมื่อสร้าง SLList แล้ว เราจะเรียกใช้ฟังก์ชัน Divisible(SLLnode,int) ซึ่งรับพารามิเตอร์อินพุตสองตัวของรายการและจำนวนเต็ม K
-
ตอนนี้อยู่ใน Divisible เราใช้ตัวแปร maxD และ minD สองตัวเพื่อเก็บองค์ประกอบสูงสุดและต่ำสุดของรายการที่เชื่อมโยงซึ่งหารด้วยตัวเลขที่กำหนด K.
-
maxD เริ่มต้นด้วย -1 และ minD เริ่มต้น 9999 ซึ่งควรจะเป็นช่วงที่อินพุตอยู่
-
ข้างในสำหรับวนรอบเราสำรวจรายการที่เชื่อมโยงโดยเริ่มจากส่วนหัว สำหรับตัวแปรนี้จุดเริ่มต้นจะชี้ไปที่ส่วนหัว
-
เปรียบเทียบส่วนข้อมูลของแต่ละโหนดด้วย maxD และ minD และการหารด้วย K หากข้อมูลของโหนดปัจจุบันแบ่งได้และน้อยกว่า minD ให้อัปเดต minD ด้วยส่วนข้อมูลปัจจุบัน
-
หากข้อมูลของโหนดปัจจุบันหารด้วย K และมากกว่า maxD ให้อัปเดต maxD ด้วยส่วนข้อมูลปัจจุบัน
-
พิมพ์ผลลัพธ์ที่ได้เป็น minD และ maxD
ตัวอย่าง
#include<iostream.h> #include<process.h> #include<conio.h> class SLLnode{ public: int info; SLLnode *next; SLLnode(int e1,SLLnode *ptr=0){ info=e1; next=ptr; } }; class SLList{ public: SLLnode *head; SLList() { head=0; } void addtohead(int); }; void SLList::addtohead(int el) { head=new SLLnode(el,head); } void Divisible(SLLnode* head, int K){ int minD=9999; int maxD=-1; SLLnode* start=head; for(start;start->next!=NULL;start=start->next){ if ((start->info < minD) && (start->info % K == 0)) minD = start->info; if ((start->info > maxD) && (start->info % K == 0)) maxD = start->info; } cout << "Max Element divisible by K: " << maxD << endl; cout << "Min Element divisible by K: " << minD; } // Driver Code int main(){ clrscr(); // Start with empty list SLList LIST; LIST.addtohead(50); LIST.addtohead(21); LIST.addtohead(32); LIST.addtohead(45); LIST.addtohead(11); LIST.addtohead(23); LIST.addtohead(90); LIST.addtohead(56); int K = 5; Divisible(LIST.head, K); getch(); return 0; }
ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น มันจะสร้างผลลัพธ์ต่อไปนี้ -
Max Element divisible by K: 90 Min Element divisible by K: 45