วันอังคารที่ 8 มีนาคม พ.ศ. 2559

บทที่5โครงสร้างข้อมูลคิว(Queue)

บทที่5โครงสร้างข้อมูลคิว(Queue) 



              คิว (Queue) เป็นโครงสร้างข้อมูลที่รู้จักและนำมาใช้งานมากเช่นเดียวกับ Stack มีลักษณะเป็นรายการในแนวเชิงเส้น (Linear List) แต่ลักษณะการทำงานจะตรงกันข้ามกับ Stack คือ การเพิ่มข้อมูลจะเพิ่มไปตอนท้ายของรายการได้เพียงด้านเดียว เรียกว่า ส่วนหลัง (Rear) และตอนนำค่าออกมาใช้งานหรือลบค่าออกจาก Queue จะลบออกทางตอนต้น เรียกว่า ส่วนหน้า (Front) ซึ่งถ้า Q แทนโครงสร้างของ Queue จะกำหนดให้
                Front(Q) เป็น ส่วนหน้าของ Q
                Rear(Q) เป็น ส่วนท้ายของ Q 
         โดยมีรูปแบบ ดังนี้ 
                Q = { Q1 , Q2 , Q3 , …, QT};
         Front(Q) คือ Q1 และ Rear(Q) คือ QT (กรณีที่มีจ านวนสมาชิกเท่ากับ T)

               ค่าที่เข้ามาก่อนจะถูกน าไปใช้งานก่อนเสมอ ลักษณะของคิวจะถูกน าไปประยุกต์เพื่อแก้ไขปัญหาต่าง ๆ เช่น จ าลอง (Simulation) การท างานของระบบงานจริงที่มีลักษณะเข้าก่อนออกก่อน เช่น การเข้าแถวซื้อของหรือช าระเงิน, ส ารวจปริมาณรถ ติดเพื่อควบคุมไฟจราจร, การส่งข่าวสารในเครือข่าย, การสั่งพิมพ์ข้อมูลทางเครื่องพิมพ์ หรือแม้กระทั่งการสับตู้รถไฟบนราง   

                หลักการนี้เรียกว่า “เข้าก่อนออกก่อน” หรือ First-In First-Out : FIFO หรือ
       Last-InLast-Out : LILO หรือ First-Come First-Served : FCFS

             การปฏิบัติการของคิว มีชุดปฏิบัติการ ดังนี้
        1. CreateQueue() ใช้สำหรับสร้างคิวขึ้นมาใหม่
        2. Insert(,<ชื่อตัวแปรของโครงสร้างข้อมูลคิว>) ใช้สำหรับนำค่าเข้าไปเก็บใน                  โครงสร้างข้อมูลคิว
        3. Remove(<ชื่อตัวแปรของโครงสร้างข้อมูลคิว>) ใช้สำหรับดึงค่าที่อยู่ในโครงสร้าง         ข้อมูลคิวมาใช้งาน
        4. isEmpty(<ชื่อตัวแปรของโครงสร้างข้อมูลคิว>) ใช้สำหรับตรวจสอบว่าโครงสร้าง        ข้อมูลคิวมีที่ว่างหรือไม่
                กรณีที่มีที่ว่างก็สามารถเพิ่มข้อมูลเข้าไปในโครงสร้างข้อมูลคิวได้ แต่ถ้าไม่ว่างก็หมายความว่าคิวเต็มไม่สามารถเพิ่ม ข้อมูลเข้าไปได้ 

         ส่วนกรณีที่ต้องการทราบว่ามีข้อมูลให้ดึงออกไปใช้งานอีกหรือไม่จะใช้วิธีตรวจสอบกับ Front และ Rear ถ้าเป็น ตัวอย่างด้านล่างก็ตรวจสอบว่า Front มากกว่า Rear หรือไม่ ถ้าใช่ก็หมายความว่าในคิวไม่มีข้อมูลอยู่เลย จะไม่ สามารถดึงข้อมูลไปใช้งานได้

        การประยุกต์ใช้งานตอนที่สร้างโครงสร้างของคิวว่าง ๆ มาใช้งานจะก าหนดให้ตัวแปร Front และ Rear มีค่าเป็นดังนี้
               Front = 0
               Rear = -1 


          Front 
    
            ส่วน Rear ยังไม่ชี้ในโครงสร้างข้อมูลคิว
      If(Front > Rear) หรือ if(Rear == -1) // ใช่ คือ Queue ว่าง ถ้าไม่ใช่ คือ มีข้อมูล 
    
            นำค่าไปเก็บใน Queue 
      1. น าค่า “A” มาเก็บใน Queue
          ขยับ Rear ไปยังต าแหน่งถัดไป ดังนี้
           Rear = Rear + 1;     // Rear = 0 แล้วน าค่า “A” ไปใส่ในตำแหน่งดังกล่าว
     
      2. น าค่า “B” มาเก็บใน Queue 
          ขยับ Rear ไปยังต าแหน่งถัดไป ดังนี้ 
          Rear = Rear + 1; // Rear = 1 แล้วน าค่า “B”      ไปใส่ในต าแหน่งดังกล่าว

      3. น าค่า “X” มาเก็บใน Queue 
          ขยับ Rear ไปยังต าแหน่งถัดไป ดังนี้ 
          Rear = Rear + 1; // Rear = 2 แล้วน าค่า “X”      ไปใส่ในต าแหน่งดังกล่าว

      4. น าค่า “Y” มาเก็บใน Queue 
          ขยับ Rear ไปยังต าแหน่งถัดไป ดังนี้
          Rear = Rear + 1; // Rear = 3 แล้วน าค่า “Y” ไปใส่ในต าแหน่งดังกล่าว

    
            เรียกใช้ค่าใน Queue 
       1. เรียกใช้ค่าครั้งที่ 1 
           ดึงค่าในตำแหน่งที่ Front ชี้อยู่ ซึ่งในขณะนี้ก็คือ “A” ออกมาใช้งาน แล้วขยับ          Front ไปยังตำแหน่งถัดไป ดังนี้ 
           Front = Front + 1; // Front = 1 
       2. เรียกใช้ค่าครั้งที่ 2
           ดึงค่าในตำแหน่งที่ Front ชี้อยู่ ซึ่งในขณะนี้ก็คือ “B” ออกมาใช้งาน แล้วขยับ          Front ไปยังตำแหน่งถัดไป ดังนี้ 
           Front = Front + 1; // Front = 2
       3. เรียกใช้ค่าครั้งที่ 3
           ดึงค่าในตำแหน่งที่ Front ชี้อยู่ ซึ่งในขณะนี้ก็คือ “X” ออกมาใช้งาน แล้วขยับ          Front ไปยังตำแหน่งถัดไป ดังนี้
           Front = Front + 1; // Front = 3 
       4. เรียกใช้ค่าครั้งที่ 4 
           ดึงค่าในตำแหน่งที่ Front ชี้อยู่ ซึ่งในขณะนี้ก็คือ “Y” ออกมาใช้งาน แล้วขยับ          Front ไปยังตำแหน่งถัดไป ดังนี้ 
           Front = Front + 1; // Front = 4 
            นำค่าไปเก็บใน Queue 
       1. น าค่า “F” มาเก็บใน Queue 
           ขยับ Rear ไปยังตำแหน่งถัดไป ดังนี้ 
           Rear = Rear + 1; // Rear = 4 แล้วน าค่า “F” ไปใส่ในตำแหน่งดังกล่าว 
       2. น าค่า “G” มาเก็บใน Queue
           ขยับ Rear ไปยังตำแหน่งถัดไป ดังนี้
           Rear = Rear + 1; // Rear = 5 แล้วน าค่า “G” ไปใส่ในตำแหน่งดังกล่าว

       3. นำค่า “H” มาเก็บใน Queue // if(Rear == Size – 1) // ใช่ คือ Queue เต็ม 
           ขยับ Rear    ไปยังตำแหน่งถัดไป ดังนี้ // ส่วนนี้จะไม่ถูกทำงาน เพราะว่า คิวเต็ม            Rear = Rear + 1; // ส่วนนี้จะไม่ถูกทำงาน เพราะว่า คิวเต็ม 
           ในข้อ 3. นี้ก็จะไม่สามารถนำค่า H ใส่เข้าไปในโครงสร้างข้อมูลคิวได้เรียกว่า การ      ล้นของคิว (Queue Overflow)

         
             สร้าง Circular Queue จำนวน 7 ค่า และกำหนดให้ Front = 0 และ Rear = -1 กรณี  ให้ตัวแปร Pointer อาจจะก าหนดให้ Rear = null ก็ได้
                    
             นำค่าไปเก็บใน Queue 
      1. นำค่า ‘A’ มาเก็บใน Queue เนื่องจากคิวว่างอยู่ สามารถเพิ่มค่าได้ทันที // Front = 0 // Rear = 0 (Rear + 1) % maxSize = (-1 + 1) % 7 = 0 

                  
       2. นำค่า ‘B’ มาเก็บใน Queue ตรวจสอบว่าเต็มหรือไม่ (0 + 1) % 7 = 1 // Rear = 1 // Front = 0 
                       
       3. นำค่า ‘X’ มาเก็บใน Queue ตรวจสอบว่าเต็มหรือไม่ (1 + 1) % 7 = 2 // Front = 0
                        
      4. นำค่า ‘Y’ มาเก็บใน Queue ตรวจสอบว่าเต็มหรือไม่ (2 + 1) % 7 = 3 // Front = 0   
                      
      5. นำค่า ‘Z’ มาเก็บใน Queue ตรวจสอบว่าเต็มหรือไม่ (3 + 1) % 7 = 4 // Front = 0 
               
       6. นำค่า ‘F’ มาเก็บใน Queue ตรวจสอบว่าเต็มหรือไม่ (4 + 1) % 7 = 5 // Front = 0
                 
      7. นำค่า ‘G’ มาเก็บใน Queue ตรวจสอบว่าเต็มหรือไม่ (5 + 1) % 7 = 6 // Front = 0        Rear = Rear + 1;   // Rear = 6 
                 
       8. นำค่า ‘H’ มาเก็บใน Queue
          (Rear + 1) % maxSize = Front หรือไม่ (เท่า = คิวเต็ม) (6 + 1) % 7 = 0 // Front = 0 
           
            แต่วิธีการนี้ก็นำมาใช้งานไม่ได้ เพราะ หากว่าในระหว่างที่มีการนำข้อมูลเข้า แล้วมีการดึงข้อมูลออกด้วย Front ก็จะไม่ชี้ใน ตำแหน่งที่ 0 ซึ่งทำให้ตำแหน่งที่ 0 เกิดว่างขึ้นมา
                   สูตรที่ใช้ในการตรวจสอบว่าคิวเต็มหรือไม่ คือ 
                              (Rear + 1) % maxSize = Front 
                   แทนค่า (6 + 1) % 7 = 0       // Front = 0 

บทที่ 4 โครงสรางขอมูลแบบเชิงเสน (สแตก-Stack)

บทที่ 4 โครงสรางขอมูลแบบเชิงเสน (สแตก-Stack) 
    
             ความหมายของ Stack
             สแตกเปนโครงสรางขอมูลแบบหนึ่ง มีลักษณะคือขอมูลที่เก็บใน Stack จะเก็บใน ลักษณะวางทับกัน ขอมูลตัวแรกจะเป็นข้อมูลที่อยูลางสุดของ Stack และขอมูลตัวสุดทายจะเปน ขอมูลที่อยูบนสุดดังนั้นขอมูลที่นําเขาไปเก็บกอนจะออกมาทีหลังสวนขอมูลที่นําเขาไปเก็บทีหลัง จะออกมากอน จากคุณสมบัตินี้ทําใหสแตกไดชื่อวา เปนโครงสรางแบบ LIFO ( ไลโฟ ) Last - in First - out หรือ พูชดาวนลิสต 
       ( Pushdown List ) คือสมาชิกที่เขาลิสตหลังสุดจะออกจากลิสตกอน

             การจัดการ Stack
             ก็มีการใชรูปแบบพอยเตอรเมื่อ ทําการนําขอมูลเขา หรือนําขอมูลออกจะกระทําที่ปลาย ขางเดียวกันของสแตก ปลายขางนั้นเรียกว่า ท็อปของสแตก ( Top of Stack ) ซึ่งท็อปของสแตกนี้ จะเปนตัวชี้สมาชิกตัวสุดทายของสแตก
    
            โครงสรางของ Stack 
             ประกอบด้วยส่วนสําคัญ 2 สวนคือ ตัวชี้สแตก ( Stack Pointer ) และสวนสมาชิกของ สแตก ( Stack element ) ซึ่งสมาชิกของสแตกนี้จะเป็นข้อมูลชนิดเดียวกันทั้งหมดเชน ขอมูลที่ เปน เลขจํานวนเต็มเปนตน ตัวชี้สแตกจะเปนตัวควบคุมการนําสมาชิกเขาหรือออกจากสแตกและเปน ตัวบงบอกวา สแตกเต็มแล้วหรือยัง

              ซึ่งมีท็อป ( Top ) ชี้สมาชิกตัวบนสุดเมื่อ มีการนําขอมูลเขาสแตก ( Push ) สแตกท็อปจะเลื่อน ขึ้นหนึ่งตําแหนงเมื่อมีการนำขอมูลออกจากสแตก ( Pop ) สแตกท็อปจะเลื่อนลงหนึ่งตําแหนง 
                  จากรูป ( 1 ) เมื่อเพิ่มขอมูล E เขาสแตกและเมื่อดึงขอมลออกจากสแตก 


             รูปรางของสแตกไมจําเป็นต้องหันท็อปขึ้นเสมอไป แตไมวาจะอยูทิศทางใด ท็อปของ สแตกจะทําหนาที่ชี้สมาชิกตัวสุดทายของสแตก 

           Operation ของ Stack
1.    Push Stack เปนการเพิ่มขอม ูลเขาสแตกเรียกวา “พูชชงิ่ ” (Pushing)
2.    Pop Stack เปนการนําขอมูลออกจากสแตก เรียกวา “พ็อปปง” (Popping)
   
          ลําดับการเริ่มตนการคานวณ 
            อันดับ 1. เครื่องหมาย ( ) วงเล็บ 
            อันดับ 2. เครื่องหมาย ^ ยกกําลัง 
            อันดับ 3. เครื่องหมาย / หารและเครื่องหมาย * คูณ 


            อันดับ 4. เครื่องหมาย - ลบ และเครื่องหมาย + บวก

บทที่3 โครงสร้างข้อมูลแบบลิงค์ลิสต์ Linked List

บทที่3 โครงสร้างข้อมูลแบบลิงค์ลิสต์

Linked List

     โครงสร้างข้อมูลลิงค์ลิสต์ (Linked List)
           จากการทำงานของโครงสร้างข้อมูลอาร์เรย์ (Array Structure) , โครงสร้างข้อมูลสแตก (Stack Structure) และโครงสร้างข้อมูลคิว (Queue Structure) มีลักษณะการจัดเก็บข้อมูลและการเข้าถึงข้อมูลในโครงสร้างแบบลำดับเป็นพื้นที่ต่อเนื่องกัน  การใช้งานของโครงสร้างถูกจำกัดไว้ไม่สามารถทำการปรับเปลี่ยนหรือแก้ไขขนาดของโครงสร้างได้ หรือหากต้องการปรับเปลี่ยนโครงสร้างใหม่ จะทำให้เสียเวลาในการประมวลผล ซึ่งในการใช้งานโปรแกรมพื้นที่หน่วยความจำ (Memory) เป็นสิ่งจำเป็นมาก การแก้ไขปัญหาดังกล่าว โดยใช้โครงสร้างข้อมูลแบบอื่น ๆ เป็นสิ่งจำเป็นที่ต้องพิจารณาและยากมาก เป็นการจัดเก็บชุดข้อมูลเชื่อมโยงต่อเนื่องกันไปตามลำดับ โครงสร้างข้อมูลแบบลิงค์ลิสต์จะประกอบไปด้วยส่วนที่เรียกว่า สมาชิก 
      ( Nodeส่วน เก็บข้อมูล (Dataและตำแหน่งของสมาชิกตัวถัดไป (Link)


        ลักษณะของลิงค์ลิสต์
1.เป็นโครงสร้างข้อมูลชนิดไม่เป็นเชิงเส้น (Non Linear Structure) คือ จัดเก็บข้อมูลในหน่วยความจำแบบไม่ต่อเนื่องกัน การเขียนโปรแกรมจะใช้พอยเตอร์ (Pointer)
2.ไม่จำเป็นต้องระบุจำนวนของข้อมูลที่จัดเก็บ เนื่องจากสามารถขอหน่วยความจำใหม่ได้ เมื่อต้องการจัดเก็บข้อมูลเพิ่ม จำทำให้ไม่ต้องระบุจำนวนข้อมูลที่จะจัดเก็บไว้ตั้งแต่ตอนกำหนดตัวแปร
3.ขนาดของหน่วยความจำที่ใช้เท่ากับข้อมูลที่จัดเก็บ คือ หน่วยความจำที่ใช้งานจะพอดีกับข้อมูลเพราะไม่ได้ระบุขนาดไว้ก่อนจำทำให้ไม่มีหน่วยความจำที่จองไว้เหลือเหมือนการใช้อารืเรย์

4.ต้องมีพอยเตอร์ชี้โหนดแรก หากไม่มีพอยเอตร์ทีจำตำแหน่งที่อยู่ของโหนดแรกแล้วก็จะไม่สามารถเข้าถึงข้อมูลที่จัดเก็บในโหนดต่างๆ ได้

ข้อดีของลิงค์ลิสต์
•เป็นโครงสร้างที่ง่ายต่อการเพิ่มหรือลบข้อมูล
•ไม่จำเป็นต้องขยับอิลิเมนต์ของลิสต์ไปข้างหน้าเพื่อให้เกิดพื้นที่ว่าง ในกรณี        ที่มีการลบอิลิเมนต์ตรงส่วนหน้าหรือส่วนกลางของลิสต์เช่นเดียวกับอาร์เรย์
•ใช้พื้นที่หน่วยความจำได้เต็มประสิทธิภาพ เนื่องจากหากข้อมูลภายในลิสต์มี        น้อยก็ใช้น้อย ซึ่งผิดกับอาร์เรย์ที่ต้องสูญเสียพื้นที่ไปในทันที ถึงแม้จะไม่มีข้อมูลภายในลิสต์ก็ตาม

การแทนโครงสร้างข้อมูลลิงค์ลิสต์
  โครงสร้างข้อมูลลิงค์ลิสต์ (Linked List) ประกอบด้วยส่วนสำคัญ 2 ส่วนรวมเป็นโครงสร้างเรียกว่า โหนด (Node) คือ
        1.Data Link ทำหน้าที่เก็บข้อมูล
  2. Link Field ทำหน้าที่เก็บตำแหน่งที่อยู่ของโครงสร้างสมาชิกตัวถัดไป
ลักษณะของการเก็บข้อมูลและเชื่อมโยงโหนดอื่น ๆ
           ลักษณะของการเก็บข้อมูลและเชื่อมโยงโหนดอื่น ๆ ของลิงค์ลิสต์ เริ่มจากจุดเริ่มต้นของโครงสร้าง (Start Pointer) ซึ่งเป็นตัวแปรที่ทำหน้าที่เก็บตำแหน่งของข้อมูลที่อยู่โหนดแรกในโครงสร้างชี้ไปยังโครงสร้างข้อมูลชุดถัดไป และในโครงสร้างชุดดังกล่าวนี้ก็มี Pointer ชี้ไปยังโครงสร้างข้อมูลอื่น ๆ ต่อไปในลักษณะเดียว ส่วน Pointer ในโหนดสุดท้ายจะเก็บค่า NULL (ค่าว่าง) บางครั้งแทนตำแหน่งสุดท้ายในโครงสร้างด้วยสัญลักษณ์ทางไฟฟ้า เรียกว่า ground symbol เป็นการแสดงตำแหน่งสุดท้ายในโครงสร้าง หรือ


               การเข้าถึงข้อมูลภายในโครงสร้างลิงค์ลิสต์
                   การเข้าถึงข้อมูลภายในโครงสร้างลิงค์ลิสต์ จะต้องอาศัยพอยน์เตอร์ 
           เป็นตัวเข้าไปในโครงสร้าง สมมติให้พอยน์เตอร์ดังกล่าว คือ PTR  และทำหน้า
           ที่ชี้ตำแหน่งแอดเดรสของโหนดในโครงสร้าง เมื่อต้องการไปยังโหนดถัดไปก็ให้
           ทำการเลื่อนตำแหน่งของพอยน์เตอร์  โดยตำแหน่งของโหนดถัดไปได้จากส่วน
           ของ  LINK  ในโหนดปัจจุบัน


   
           ขั้นตอนการเข้าถึงข้อมูลในโครงสร้าง 
    
         การเข้าถึงในโครงสร้างเรียกว่า การทำ Traversing มีขั้นตอนดังต่อไปนี้
             กำหนดให้ DATA เป็นโครงสร้างข้อมูลลิงค์ลิสต์   และพอยน์เตอร์  PTR 
         ทำหน้าที่ชี้โหนดที่กำลังดำเนินการ  Process  อยู่ในขณะนั้น  (Current Node)
           1. กำหนดค่าเริ่มต้นให้กับพอยน์เตอร์  PTR.
           2. การวนรอบดำเนินการ   Process  ข้อมูล
           3. Apply Process to DATA [PTR]
           4. เปลี่ยนค่าพอยน์เตอร์  PTR ให้ชี้โหนดถัดไป
           5. เสร็จสิ้นขั้นตอน

              Storage Pool
    
              Storage Pool หรือ Free List  หมายถึง  เนื้อที่ว่างในหน่วยความจำ มีลักษณะเป็นโหนดเก็บอยู่ในโครงสร้างข้อมูลลิงค์ลิสต์  หรืออาจเรียกได้ว่าเป็น Free  Stack  ลักษณะการดำเนินการเหมือนกับโครงสร้างข้อมูลสแต็ก    เมื่อมีการเพิ่มสมาชิกใหม่ในโครงสร้างข้อมูลลิงค์ลิสต์จะนำโหนดว่าง 1 โหนดออกมาจาก Free List (เป็นโหนดแรกใน Free List) จากนั้นใส่ข้อมูลลงไปในส่วนของ Data Field หลังจากนั้น นำโหนดดังกล่าวเชื่อมโยงเข้าไปไว้ในโครงสร้างข้อมูลที่ต้องการ และหากมีการลบสมาชิกตัวใดตัวหนึ่งออกจากโครงสร้างจะต้องนำโหนดที่ถูกลบนี้ใส่คืนใน Free List ไว้เป็นโหนดแรกใน  Free  List  เสมอ



               การเพิ่มข้อมูลในโครงสร้าง

            เมื่อกำหนดโครงสร้างข้อมูลเรียบร้อยแล้ว ก็สามารถทำการเพิ่มข้อมูลในโครงสร้างได้   โดยการขอโหนดว่างจาก   free  list  และนำมาเชื่อมโยงกับรายการข้อมูลที่มีอยู่เดิมในโครงสร้างตรงตำแหน่งที่ต้องการ
         การเพิ่มข้อมูลในโครงสร้างข้อมูลลิงค์ลิสต์ อาจเกิดในลักษณะที่ต่างกัน ซึ่งสรุปได้เป็น 3 ลักษณะ  คือ
      1. การเพิ่มข้อมูลที่จุดเริ่มต้นของโครงสร้าง
      2. การเพิ่มข้อมูลต่อจากโหนดที่กำหนด
      3. การเพิ่มข้อมูลที่จุดสุดท้ายของโครงสร้าง

           การเพิ่มข้อมูลที่จุดเริ่มต้นของโครงสร้าง

            เป็นการเพิ่มโหนดของข้อมูลไปยังตำแหน่งแรกของโครงสร้างลิงค์ลิสต์ โดยการเปลี่ยนค่าเริ่มต้นให้ชี้ไปยังตำแหน่งของโหนดใหม่ (NEW Node) ที่สร้างขึ้น และให้ Pointer ของโหนดใหม่ชี้ไปยังตำแหน่งเริ่มต้นเดิมแทน
   
            ขั้นตอนการเพิ่มข้อมูลที่ตำแหน่งเริ่มต้นของโครงสร้าง
        1. ตรวจสอบ OVERFLOW  ถ้าโหนดใหม่มีค่าเป็น NULL แสดงว่า OVERFLOW
        2. กำหนด PTR ให้ชี้ไปที่โหนดของ FREE  LIST
        3.ใส่ข้อมูลใหม่ลงไปในโหนดใหม่
        4.ให้โหนดใหม่ชี้ไปยังโหนดเริ่มต้นเดิมและเปลี่ยนตำแหน่งเริ่มต้นให้ชี้ไปยังโหนดใหม่

           การเพิ่มข้อมูลต่อจากโหนดที่กำหนด
              เป็นการแทรกโหนดข้อมูลใหม่เข้าไประหว่างโหนดข้อมูล 2 โหนด โดยการเปลี่ยน Pionter ที่ชี้โหนดเก่าให้ชี้ไปยังตำแหน่งของโหนดใหม่ และ ให้ Poinnter ของโหนดใหม่ขี้ไปยังตำแหน่งเดิมแทน
     
            ขั้นตอนการเพิ่มข้อมูลที่ตำแหน่งโหนดที่กำหนดของโครงสร้าง
           1. ตรวจสอบ OVERFLOW  ถ้าโหนดใหม่มีค่าเป็น NULL แสดงว่า OVERFLOW
           2. กำหนด PTR ให้ชี้ไปที่โหนดของ FREE  LIST
           3. ใส่ข้อมูลใหม่ลงไปในโหนดใหม่
           4. กำหนดค่าให้โหนดแรก ถ้า PTR = NULL ให้กำหนดโหนดใหม่เป็นจุดเริ่มต้น ถ้า PTR <> NULL      ให้นำโหนดใหม่มาต่อ (PTR ชี้ไปที่โหนดใหม่)
    
             การเพิ่มข้อมูลเป็นโหนดสุดท้ายของโครงสร้าง
                 เป็นการนำโหนดข้อมูลใหม่มาต่อยังตำแหน่งท้ายสุดของโครงสร้าง (Pointer ของโหนดสุดท้าย   มีค่าเป็น  NULL)  โดยการกำหนดให้ Pointer ของโหนดข้อมูลสุดท้าย ชี้ไปยังโหนดใหม่ และให้         Pointer ของ โหนดใหม่มีค่าเป็น NULL แทน
    
          การลบข้อมูลจากโครงสร้าง
                 การลบข้อมูลจากโครงสร้าง หมายถึง การดึงเอาโหนดที่ต้องการลบออกจากลิงค์ลิสต์ชุดเดิม   ดังนั้น การเปลี่ยนแปลงที่เกิดขึ้นคือ  การเปลี่ยนค่าพอยน์เตอร์และเมื่อทำการลบข้อมูลออกจากโครงสร้างแล้วจะต้องคืนโหนดที่ถูกลบให้กับ Storage Pool เพื่อที่จะได้สามารถนำหน่วยความจำส่วนนั้นไปใช้งานต่อไป
                การลบข้อมูลออกจากโครงสร้างลิงค์ลิสต์ เกิดขึ้นได้หลายลักษณะสรุปได้ดังนี้
            1. การลบโหนดแรก
            2. การลบโหนดที่อยู่หลังโหนดที่กำหนด
            3. การลบโหนดสุดท้าย

                ขั้นตอนการลบโหนดมีดังนี้
                1. เก็บค่าตำแหน่งและค่าของ Pointer ของโหนดที่ต้องการลบ
                2. กำหนดค่าของ Pointer ของโหนดที่ต้องการลบ ไปยังโหนดก่อนหน้านั้น
                3. กำหนดตำแหน่งของโหนดที่ต้องการลบคืนกลับไปยัง Storage Pool
    
               โครงสร้างข้อมูลลิงค์ลิสต์เดี่ยว (SLL)
                    แบ่งออกเป็น 2  ประเภท
            1. โครงสร้างข้อมูลลิงค์ลิสต์แบบ Ordinary Singly Linked List  คือ โครงสร้างข้อมูลลิงค์ลิสต์ที่มี         ลักษณะเหมือนกับโครงสร้างข้อมูลลิงค์ลิสต์ที่กล่าวมาแล้วตั้งแต่ต้น
            2. โครงสร้างข้อมูลลิงค์ลิสต์แบบ Circular Singly Linked List (CLL)  มีลักษณะคล้ายกับแบบ             SLL  ทั่วไป เพียงแต่พอยน์เตอร์สามารถชี้กลับมายังตำแหน่งเริ่มต้นของโครงสร้างได้ โดยใช้พอยน์       เตอร์ของโหนดสุดท้ายในโครงสร้างชี้ไปยังโหนดแรก ทำให้โครงสร้างข้อมูลมีลักษณะเป็นวงกลม

     
       โครงสร้างข้อมูลลิงค์ลิสต์คู่  (Doubly Linked List)
            โครงสร้างข้อมูลลิงค์ลิสต์คู่  (Doubly Linked List) เป็นโครงสร้างที่แต่ละโหนดข้อมูลสามารถชี้ตำแหน่งโหนดข้อมูลถัดไปได้ 2 ทิศทาง (มีพอยน์เตอร์ชี้ตำแหน่งอยู่สองทิศทาง) โดยมีพอยน์เตอร์อยู่ 2 ตัว คือ  พอยน์เตอร์ LLINK  ทำหน้าที่ชี้ไปยังโหนดด้านซ้ายของโหนดข้อมูลนั้น ๆ และ พอยน์เตอร์ RLINK ทำหน้าที่ชี้ไปยังโหนดด้านขวาของโหนดข้อมูลนั้น ๆ


          การใช้งานของโหนดข้อมูลแบบลิงค์ลิสต์คู่ คือ พอยน์เตอร์ LLINK  จะชี้ไปยังโหนดด้านซ้ายของโหนดข้อมูลนั้น ๆ โดยพอย์เตอร์ที่โหนดข้อมูลสุดท้ายทางด้านซ้าย (LLINK ตัวสุดท้าย) จะมีค่าเป็น NULL และ พอยน์เตอร์ RLINK ทำหน้าที่ชี้ไปยังโหนดด้านขวาของโหนดข้อมูลนั้น ๆ โดยพอย์เตอร์ที่โหนดข้อมูลสุดท้ายทางด้านขวา (RLINK ตัวสุดท้าย) จะมีค่าเป็น NULL เช่นกัน

บทที่2 Algorithm

บทที่2 Algorithm


Data Type : ชนิดของข้อมู 

1. ข้อมูลชนิดตัวอักษร (Character) คือ ข้อมูลที่เป็นรหัสแทนตัวอักษรหรือค่าจำนวนเต็ม ได้แก่ ตัวอักษร ตัวเลขและกลุ่มตัวอักขระพิเศษใช้พื้นที่ในการเก็บข้อมูล 1 ไบต์
2. ข้อมูลชนิดจำนวนเต็ม (Integer) คือ ข้อมูลที่เป็นเลขจำนวนเต็ม ได้แก่ จำนวนเต็มบวก จ านวนเต็มลบ และ ศูนย์ ข้อมูลชนิดจำนวนเต็มใช้พื้นที่ในการเก็บข้อมูล ขนาด 2 ไบต์
3. ข้อมูลชนิดจำนวนเต็มที่มีขนาด 2 เท่ำ(Long Integer) คือ ข้อมูลที่เป็นเลขจำนวนเต็ม ใช้พื้นที่ในการเก็บ เป็น 2 เท่าของInteger คือมีขนาด 4 ไบต ์์
4. ข้อมูลชนิดเลขทศนิยม (Float) คือ ข้อมูลที่เป็นเลขทศนิยม ขนาด 4 ไบต์
5. ข้อมูลชนิดเลขทศนิยมอย่ำงละเอียด (Double) คือ ข้อมูลที่เป็นเลขทศนิยม ใช้พื้นที่ในการเก็บข้อมูลเป็น 2 เท่าของ float คือมีขนาด 8 ไบต์

        Data Type : ชนิดของข้อมูล 



             
     ผังงาน (Flowchart)

          แผนภาพที่มีการใช้สัญลักษณ์รูปภาพและลูกศรที่แสดงถึงขั้นตอนการทำงานของ
     โปรแกรม หรือระบบทีละขั้นตอนรวมไปถึงทิศทางการไหลของข้อมูลตั้งแต่แรกจนได
     ผลลัพธ์ตามที่ต้องการมีวัตถุประสงค์เพื่อให้บุคคลอื่นสามารถทำความเข้าใจถึงลำดับขั้น
     ตอนการทำงานของโปรแกรม และผลลัพธ์ที่ได้จากการทำงานของโปรแกรมที่พัฒนาขึ้น
    ได้

     ประโยชน์ของผังงาน

       -ช่วยลำดับขั้นตอนการทำงานของโปรแกรม และสามารถนำไปเขียนโปรแกรมได้โดยไม่สับสน
       - ช่วยในการตรวจสอบ และแก้ไขโปรแกรมได้ง่าย เมื่อเกิดข้อผิดพลาด
       - ช่วยให้การดัดแปลง แก้ไข ทำได้อย่างสะดวกและรวดเร็ว
       - ช่วยให้ผู้อื่นสามารถศึกษาการทำงานของโปรแกรมได้อย่างง่าย และรวดเร็วมากขึ้น

     วิธีการเขียนผังงานที่ดี 
    
        -ใช้สัญลักษณ์ตามที่กำหนดไว้
        -ใช้ลูกศรแสดงทิศทางการไหลของข้อมูลจากบนลงล่าง หรือจากซ้ายไปขวา
        -คำอธิบายในภาพควรสั้นกระทัดรัด และเข้าใจง่าย
        -ทุกแผนภาพต้องมีลูกศรแสดงทิศทางเข้า - ออก
        -ไม่ควรโยงเส้นเชื่อมผังงานที่อยู่ไกลมาก ๆ ควรใช้สัญลักษณ์จุดเชื่อมต่อแทน
        -ผังงานควรมีการทดสอบความถูกต้องของการทำงานก่อนนำไปเขียนโปรแกรม
     
     ผังงานโปรแกรม

        - จุดเริ่มต้น / สิ้นสุดของโปรแกรม
        - ลูกศรแสดงทิศทางการทำงานของโปรแกรมและการไหลของข้อมูล
        - ใช้แสดงคำสั่งในการประมวลผล หรือการกำหนดค่าข้อมูลให้กับตัวแปร
        - แสดงการอ่านข้อมูลจากหน่วยเก็บข้อมูลสำรองเข้าสู่หน่วยความจำหลักภายในเครื่องหรือการแสดง  ผลลัพธ์จากการประมวลผลออกมา
        - การตรวจสอบเงื่อนไขเพื่อตัดสินใจ โดยจะมีเส้นออกจากรูปเพื่อแสดงทิศทางการทำงานต่อไป เงื่อนไข เป็นจริงหรือเป็นเท็จ
        - แสดงผลหรือรายงานที่ถูกสร้างออกมา
        - แสดงจุดเชื่อมต่อของผังงานภายใน หรือเป็นที่บรรจบของเส้นหลายเส้นที่มาจาก     หลายทิศทางเพื่อ  จะไป สู่ การทำงานอย่างใดอย่างหนึ่งที่เหมือนกัน 
        - การขึ้นหน้าใหม่ ในกรณีที่ผังงานมีความยาวเกินกว่าที่จะแสดงพอในหนึ่งหน้า
       ผังงานทางคอมพิวเตอร์
    
       ผังงานทางคอมพิวเตอร์แบ่งออกเป็น 2 ประเภทได้แก่
  •        ผังงานระบบ (System flowchart)
  •        ผังงานโปรแกรม (Program flowchart)


           ผังงานระบบ (System Flowchart)
    คือ ผังงานที่แสดงขั้นตอนการทำงานในระบบอย่างกว้าง ๆ แต่ไม่เจาะลงในระบบงานย่อย
           ผังงานโปรแกรม (Program Flowchart)     คือ ผังงานที่แสดงถึงขั้นตอนในการทำงานขอโปรแกรม ตั้งแต่รับข้อมูล คำนวณ จนถึงแสดงผลลัพธ์