วันพฤหัสบดีที่ 28 กรกฎาคม พ.ศ. 2554

ลิ้งค์ลิสต์

โครงสร้างข้อมูลลิ้งค์ลิสต์ 
                วิธีแก้ปัญหาในการย้ายข้อมูลที่พบในการจัดเก็บที่มีรูปแบบเรียงตามลำดับ(Sequential)เปลี่ยนมาใช้รูปแบบไม่เรียงตามลำดับ (Non-sequential)ซึ่งรูปแบบการเรียงตามลำดับจะมีสมาชิกเรียงต่อเนื่องติดกันในทางตรรกะ (Logical) และทางกายภาพ(Physical) เป็นแบบเดียวกัน แต่รูปแบบไม่เรียงตามลำดับสมาชิกต่อเนื่องติดกันในทางตรรกะ ส่วนทางกายภาพไม่จำเป็นต้องเหมือนกัน โดยในทางตรรกะจะแสดงด้วยแต่ละสมาชิกมีการชี้ (Point) ต้อไปยังสมาชิกตัวถัดไป สมาชิกทุกตัวในรายการจึงถูกเชื่อมต่อ (Link) เข้าด้วยกัน ดังรูปที่ 6.1 เป็นรายการเชื่อมต่อหรือเรียกว่าลิ้งค์ลิสต์ (Linked List) มีสมาชิก N ตัว แต่ละสมาชิกเรียกว่าโหนด (Node)

                จากรูปที่ 6.1 มีตัวแปรพอยน์เตอร์ First ชี้ไปยังโหนดแรกของรายการ แต่ละโหมดมีตัวเชื่อมเป็นพอยน์เตอร์ที่ชี้ไปยังโหนดถัดไปโดยโหนดสุดท้ายมีค่าเป็น NULL แสดงให้ทราบว่าไม่ได้ชี้ไปยังโหมดถัดไป แต่ละโหนดเป็นโครงสร้างข้อมูลเรคคอร์ด ประกอบด้วยสองส่วน คือ
                1.ส่วนเก็บข้อมูล (Info) ใช้เก็บข้อมูลข่าวสารที่มีโครงสร้างข้อมูลเบื้องต้นหรือเรียบง่าย
                2.ส่วนการเชื่อมต่อ (Next) เป็นตัวชี้หรือพอยน์เตอร์เก็บค่าแอดเดรสใช้อ้างไปยังโหนดถัดไปในหน่วยความจำ
                สำหรับในทางกายภาพของลิ้งค์ลิสต์ แต่ละดหนดไม่จำเป็นต้องอยู่ติดกัน อาจกระจัดกระจายไปยู่ส่วนไหนก็ได้ในหน่วยความจำโดยมีตัวเชื่อมชี้ไปยังตัวตำแหน่งของโหนดถัดไป
                ดังที่กล่าวในตอนต้นโครงสร้างสแตกและคิวมีการใช้อาร์เรย์ในการเก็บค่า สมาชิกทุกตัวจึงถูกจำกัดให้เป็นชนิดเดียวกัน(Homogenous) ซึ่งแก้ไขโดยเปลี่ยนมาใช้ลิ้งค์ลิสต์ที่มีโครงสร้างข้อมูลต่างกันได้ นอกจากนี้ยังมีผลดีในการปฏิบัติการแทรกข้อมูลหรือลบข้อมูล เพียงแต่ย้ายการชี้ของตัวแปรพอยน์เตอร์เท่านั้น ทำให้สมาชิกอื่นไม่มีผลกระทบ แต่ในกรณีค่าใช้จ่ายแล้วลิงค์ลิสต์จะสูงกว่าที่ต้องใช้พื้นที่เผิ่มมากขึ้นสำหรับส่วนการเชื่อมต่อเพื่อชี้ไปยังโหนดถัดไป และการค้นหาโหนดที่ต้องการใช้เวลามากเนื่องจากเป็นการค้นหาเรียงตามลำดับ (Sequential Search) ได้โหนดเดียวโดยเริ่มต้นที่โหนดแรกเสมอ

การปฏิบัติการพื้นฐานของลิงค์ลิสต์ 
                สิ่งสำคัญอย่างหนึ่งในการใช้โครงสร้างข้อมูลลิงค์ลิสต์ คือ ตัวแปรพอยน์เตอร์ (Pointer Variable) ซึ่งเก็บค่าเป็นตำแหน่งแอดเดรสในหน่วยความจำ (Memory Address) ในการปฏิบัติการกับลิ้งค์ลิสต์และให้มีความถูกต้องจะใช้ตัวแปรพอยน์เตอร์ในการจัดการเรื่องต่อไปนี้
1.ใช้ทดสอบกับค่า NULL
2.ใช้ทดสอบว่ามีค่าเท่ากับตัวแปรพอยน์เตอร์อื่น
3.กำหนดให้มีค่าเป็น NULL
4.กำหนดให้ชี้ไปยังโหนด
                ชุดปฏิบัติการของลิ้งค์ลิสต์ที่ทกวานร่วมกับตัวแปรพอยน์เตอร์ มีดังนี้
1.Node(P)  ส่งโหนดที่ถูกชี้ด้วยต้วแปรพอยน์เตอร์ P กลับมาให้
2.INFO(P) ส่งค่าในส่วนเก็บข้อมูลของโหนดที่ถูกชี้ด้วยตัวแปรพอยน์เตอร์ P กลับมาให้
3.Next(P)  ส่งพอยน์เตอร์ในส่วนการเชื่อมต่อขยองโหนดที่ถูกชี้ด้วยตัวแปรพอยน์เตอร์ P กลับมาให้

การแทรกโหนดไว้ในลิ้งค์ลิสต์ 
                อัลกอลิทึมในการแทรกโหนดใหม่เข้าไปไว้ในลิ้งค์ลิสต์ดังในตารางที่6.1

ตารางที่ 6.1 อัลกอริทึมการแทรกโหนดใหม่ลงในลิ้งค์ลิสสต์ 

        ตัวอย่างการแทรกโหนดใหม่ไว้ในลิ้งค์ลิสต์ โดยเริ่มต้นสร้างเป็นโหนด I ในหน่วยความจำกำหนดส่วนเก็บข้อมูลมีค่า L ส่วนการเชื่อมต่อมี่ค่าเป็น NULL ซึ่งมีตัวแปรพอยน์เตอร์ New  ชี้อยู่ ดังในรูปที่ 6.2 และมีลิงค์ลิสต์ที่ต้องการแทรกโหนดใหม่เข้ามาระหว่างโหนด 2 เป็นโหนดก่อนหน้า (Predecessor) และโหนด 3 เป็นโหนดถัดไป (Successor) ดังนั้นจึงกำหนดให้ตัวแปรพอยน์เตอร์ P ชี้ไปยังโหนด 2 และขั้นตอนในการแทรกประกอบด้วย

  1. Next(New) =Next (P) กำหนดให้ตัวชี้ของโหนด I เปลี่ยนไปชี้ยังโหนด 3 ซึ่งเป็นส่วนหลังของการแทรกโหนดใหม่ ในรูปที่ 6.3






  1. Next(P) =New กำหนดให้ตัวชี้ของโหนด 2 ที่มีตัวแปรพอยน์เตอร์ P ชี้อยู่เปลี่ยนไปชี้ยังโหนด I ที่มีตัวแปรพอยน์เตอร์ New ชี้อยู่ ในรูปที่ 6.4

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

           พิจารณาจากตัวอย่างลิ้งค์ลิสต์ในรูปที่ 6.5 ต่อไปนี้ เป็นอัลกอริทึมในการลบโหนดออกจากลิ้งค์ลิสต์ โดยเริ่มต้นให้ตัวแปรพอยน์เตอร์ P ชี้ไปโหนด 2 ซึ่งเป็นโหนดก่อนหน้าโหนด 3 ที่ต้องการลบ และชั้นตอนในการลบประกอบด้วย

             (a)       Q = Next (P) เป็นการใช้ตัวแปรพอยน์เตอร์ Q เป็นตัวช่วย กำหนดให้ชี้ไปยังโหนด 3 ที่ต้องการลบในรูปที่ 6.6
                  
(b)     Next(P) =Next (Q)  กำหนดให้ตัวชี้ของโหนด 2 ที่มีตัวแปรพอยน์เตอร์ P ชี้อยู่เปลี่ยนไปชี้ยังโหนด 4 ซึ่งเป็นโหนดถัดไปหลังโหนดที่ตัวแปรพอยน์เตอร์ Q ชี้อยู่ ในรูปที่ 6.7
  
       (c) Free (Q) หลังจากนั้นจึงปลดปล่อยโหนดที่ต้องการลบซึ่งมีตัวพอยน์เตอร์ Q ชี้อยู่ เพื่อคืนพื้นที่หน่วยความจำของโหนดที่ลบไปและนำไปใช้กับงานอื่นได้ (Reuse)ได้เป็น
รูปที่ 6.8

                ลำดับการทำงานดังกล่าวจะเห็นว่ามีเพียง 2 โหนดเท่านั้นที่มาเกี่ยวข้อง คือ โหนดที่ตัวแปรพอยน์เตอร์ P และ  Q ชี้อยู่ ส่วนโหนดอื่นๆ ไม่ถูกเรียกใช้งานหรือเปลี่ยนแปลง ยกเว้นในกรณีที่ตัวแปรพอยน์เตอร์ P ชี้ไปยังโหนดสุดท้ายไม่สามารถลบโหนดถัดไปได้ ซึ่งต้องมีการไขอัลกอริทึมโดยตรวจสอบก่อนจะทำการลบ
ลิ้งค์ลิสต์ทางเดียว
   โดยทั่งไปลิ้งค์ลิสต์จะมีโหนดที่มีส่วนการเชื่อมต่อชี้ไปยังโหนดถัดไปเพียงทางเดียว (Unidirectional)         ดังที่ผ่านมา เรียกว่าลิ้งค์ลิสต์ทางเดียว (Singly Linked List ) ซึ่งนอกจากจะมีชุดปฏิบัติการแทรกและลบโหนดแล้วยังมีอัลกอรึทึมในการจัดการลิงค์แบบอื่น ๆ ดังนี้
                1.การค้นหาแต่ละโหนด เป็นการเริ่มต้นที่โหนดแรกจากนั้นหาไปทีละโหนดตามลำดับที่เชื่อมต่อกันจนกว่าจะพบโหนดในลิงค์ลิสต์ดังในตารางที่ 6.3
ตารางที่ 6.3 อัลกอริทึมการวิ่งไปยังแต่ละโหนดในลิ้งค์ลิสต์

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

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

                4.การสลับด้านของรายการในลิ้งค์ลิสต์ เป็นการสร้างลิงค์ลิสต์ใหม่ให้รายการสลับด้านกับลิ้งค์ลิสต์ตัวเก่า โดยให้โหนดสุดท้ายเปลี่ยนป็นโหนดแรก และให้โหนดแรกกลายเป็นโหนดสุดท้าย
                นอกจากนี้ยังมีอัลกอรึทึมอื่น ๆ อีก เช่น การรวมสองลิ้งค์ลิสต์เป็นลิ้งค์ลิต์เดียว หรือแยกลิ้งค์ลิสต์เดียวเป็นสองลิ้งค์ลิสต์
             
ลิ้งค์ลิสต์วงกลม 
                โดยปกติการใช้ลิ้งค์ลิสต์ เมื่อตัวแปรพอยน์เตอร์ P ชี้ไปยังโหนดหนึ่งจะไม่สามารถชี้กลับไปยังโหนดก่อนหน้าน้ำได้ วิธีการอย่างหนึ่งที่ทำให้สามารถวิ่งจากโหนดหนึ่งไปยังโหนดอื่น ๆ ได้ในลิงค์ลิสต์ โดยให้ตัวชี้ของโหนดสุดท้ายซึ่งเดิมเป็นค่า NULL ก็ให้ชี้กลับไปยังโหยดแรกแทน ดังในรูปที่ 6.11 และเรียกว่าลิงค์ลิสต์วงกลม (Circular Linked List)

                ปัญหาอย่างหนึ่งของการใช้ลิงค์ลิสต์วงกลมคือการวิ่งไปแต่ละโหนดจะเป็นการวนลูปที่ไม่รู้จบ แนวทางหนึ่งในการแก้ปัญหาคือ การเพิ่มโหนดหัรายการ (Head Node) เข้ามาในตอนต้นหรือตอนท้ายลิงค์ลิสต์วงกลม ดังในรูปที่ 6.12 ซึ่งมีความแตกต่างจากโหนดอื่น ๆ ที่มีข้อมูลพิเศษหรือค่าสัญลักษณ์ (Flag) บอกให้ทราบว่าเป็นโหนดหัวรายการ

                การวิ่งไปแต่ละโหนดจะทราบได้ว่าจุดสิ้นสุดอยู่ตรงไหนโดยใช้โหนดหัวรายการ นอกจากนี้การใช้โหนดหัวรายการ กับลิงค์ลิสต์ทางเดียวช่วยการทำงานมีประสิทธิภาพมากขึ้น เช่น ทุก ๆ โหนดในลิงค์ลิสต์จะมีโหนดก่อนหน้าเสมอ ทำให้อัลกอริทึมในการแทรกหรือลบโหนดมีความสะดวงและง่ายขึ้น เมื่อลิงค์ลิสต์วงกลมว่าง (Empty Circular Linked Lidt) จะมีเพียงโหนดหัวรายการเท่านั้นและมีพอยน์เตอร์ชี้กลับมาที่ตัวเอง ดังในรูปที่ 6.13
ตัวอย่างการใช้ลิ้งค์ลิสต์วงกลม 
                ปัญหาโจเซฟ (Josephus Problem) เป็นที่รู้จักกันมากและนำลิงค์ลิสต์วงกลมมาใช้ในการแก้ปัญหา   เริ่มต้นเมื่อมีทหารกลุ่มหนึ่งถูกข้าศึกล้อมรอบอยู่ในเมืองซึ่งไม่สามารถต่อสูและหมดหวังที่จะชนะได้ แต่มีม้าเพียงตัวเดียวที่จะขี่พาหนีออกไปได้ กลุ่มทหารจึงตัดสินใจ เลือกคนที่โชคดีขี่ม้าหนีไปโดยการให้ทุกคนนั่งเป็นวงกลม  จากนั้นสุ่มเลือกชื่อทหารคนหนึ่งเพื่อเริ่มต้นและนับทหารทีละคนในวงกลมจนเท่ากับ  N  ก็ให้ทหารคนนั้นออกจากวงกลม  และเริ่มต้นนับแบบเดิมเมื่อถึงคนที่  N  ก็ออกจากวงกลมไปเรื่อย ๆ จนจำนวนทหารลดลงเหลือเพียงคนสุดท้ายเป็นผู้ที่ได้ขี่ม้าหนีไป  เช่น  รูปที่  6.14  มีทหารอยู่  5  คนมีการนับเพื่อคัดออกเท่ากับ  4  จากรูป  (a)  จะได้คนสุดท้ายคือคนที่เริ่มต้นนับในรูป  (e)

             
                ถ้าเราเป็นทหารคนหนึ่งควรจะยีนเป็นลำดับเท่าไรจึงจะเป็นคนสุดท้ายโดยมีทะหารทั้งหมด M คน และจำนวนการนับเพื่อคัดออกเท่ากับ N อัลกอริทึมในการปัญหาดังกล่าวจึงนำลิงค์ลิสต์วงกลมมาช่วยดังในตารางที่ 6.4 คือ โปรแกรม Linklist.c
ตารางที่ 6.4 ตัวอย่างโปรแกรม LinList.c

ลิ้งค์ลิสต์สองทาง 
                ในบางครั้งการทำงานกับลิงค์ลิสต์อาจต้องการวิ่งไปยังโหนดต่าง ๆ ในลิงค์ลิสต์โดยการถอยกลับไปยังโหนดก่อนหน้าหรือลบแต่ละโหนด เพื่อห้เกิดประสิทธิภาพจึงนำลิงค์ลิสต์สองทาง (Doubly Linked List) มาใช้แทนลิงค์ลิสต์ทางเดียว ดังในรูปที่ 6.15 ซึ่งแต่ละโหนดประกอบด้วย 3 ส่วน คือ
                1.ส่วนเก็บข้อมูล (Info) ใช้เก็บข้อมูลข่าวสารที่มีโครงสร้างข้อมูลเบื้องต้นหรือเรียบง่าย
                2.ส่วนการเชื่อมต่อถัดไป (Next) เป็นตัวชี้หรือพอยน์เตอร์เก็บค่าแอดเดรสใช้อ้างไปยังโหนดถัดไปในหน่วยความจำ
                3.ส่วนการเชื่อมต่อก่อนหน้า เป็นตัวชี้หรือพอยน์เตอร์เก็บค่าแอดเดรสใช้อ้างกลับไปยังโหนดก่อนหน้าในหน่วยความจำ

                ลิงค์ลิสต์สองทางบางครั้งเรียกว่าลิงค์ลิสต์สมมาตร (Symmetrically Linked List) เนื่องจากมีตัวชี้จากสองทิศทาง (Bidirectional) ทั้งด้านซ้ายและขวา เมื่อนำมาใช้เป็นลิงค์ลิสต์สองทางวงกลม (Circular Doubly Linked List) ได้ดังในรูปที่ 6.16 โดยอาจยกเลิกโหนดหัวรายการก็ได้

                ในการปฏิบัติการจะชี้ไปยังโหนดถัดไปโดยใช้ Next(P) และชี้กลับไปยังโหนดก่อนหน้าโดยใช้ Prior(P) ตัวชี้ทั้งสองมักจะเป็นพอยน์เตอร์ใช้ชื่อ Right และ Left หรือใช้ s-link (Successor) และ          p-link (Predecessor) ดังนั้นเมื่อมีตัวแปรพอยน์เตอร์ p ชี้ไปยังโหนดใดจะได้ว่า
                                Next (Prior (P)) = P = Prior (Next (P))
                การถอยกลับไปหนึ่งโหนดและไปข้างหน้าหนึ่งโหนดก็จะกลับมายังโหนดเดิม หรือไปข้างหน้าหนึ่งโหนดและถอยกลับหนึ่งโหนดก็กลับมายังโหนดเดิมเช่นกัน สำหรับลิงค์ลิสต์สองทางว่าง (Empty Doubly Linked List) มีพอยน์เตอร์ทั้งสองชี้กลับมายังโหนดหัวรายการดังในรูปที่ 6.17 ซึ่งไม่มีโหนดอื่นอยู่ในลิงค์ลิสต์ จะได้ว่า
                                Prior (Head) = Head = Next (Head)

การแทรกโหนดไว้ในลิงค์ลิสต์สองทาง 
                การแทรกโหนดใหม่เข้าไปไว้ในลิงค์ลิสต์สองทางจะมีอัลกอริทึมดังในตารางที่ 6.5
ตารางที่ 6.5 อัลกอริทึมการแทรกโหนดใหม่ลงในลิงค์ลิสต์สองทาง

                ตัวอย่างที่ใช้จะเริ่มต้นโดยใช้โหนดใหม่ I ขึ้นในหน่วยความจำ กำหนดส่วนเก็บข้อมูลมีค่า L, ส่วนการเชื่อมต่อ Left และ Right มีค่าเป็น NULL ซึ่งเป็นตัวแปรพอยน์เตอร์ New ชี้อยู่ดังในรูปที่ 6.18 และมีลิงค์ลิสต์สองทางที่มีการแทรกโหนดใหม่เข้ามาระหว่างโหนด 2 เป็นโหนดก่อนหน้าและโหนด 3 เป็นโหนดถัดไป จึงกำหนดให้ตัวแปรพอยน์เตอร์ P ชี้ไปยังโหนด 2 และขั้นตอนในการแทรกประกอบด้วยดังต่อไปนี้

  1. Next(New) = Next(P) กำหนดให้ตัวชี้ Right ของโหนด I เปลี่ยนไปชี้ยังโหนด 3 ซึ่งเป็นส่วนหลังของการแทรกโหนดใหม่ ในรูปที่ 6.19 และ Prior(New) = P กำหนดให้ตัวชี้ Left ของโหนด I เปลี่ยนไปชี้ยังโหนด 2 ซึ่งเป็นส่วนก่อนหน้าของการแทรกโหนดใหม่

  1. Next(P) = New กำหนดให้ตัวชี้ Right ของโหนด 2 ที่มีตัวแปรพอยน์เตอร์ P ชี้อยู่เปลี่ยนไปชี้ที่โหนด I ที่มีตัวแปรพอยน์เตอร์ New ชี้อยู่ ในรูปที่ 6.20 และ Prior(P) = New กำหนดให้ตัวชี้ Left ของโหนด 3 เปลี่ยนไปชี้ยังโหนด I เช่นกัน

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

การลบโหนดออกจากลิงค์ลิสต์สองทาง 
                อัลกอริทึมที่นำมาใช้ลบโหนดออกจากลิงค์ลิสต์ดังในตารางที่ 6.6
ตารางที่ 6.6 อัลกอริทึมการลบโหนดออกจากลิงค์ลิสต์สองทาง

                พิจารณาจากตัวอย่างลิงค์ลิสต์สองทางในรูปที่ 6.21 เป็นอัลกอริทึมในการลบโหนดออกจากลิงค์ลิสต์สองทาง โดยเริ่มต้นให้ตัวแปรพอยน์เตอร์ P ชี้ไปโหนด 2 ซึ่งเป็นโหนดที่ต้องการลบ และขั้นตอนการลบประกอบด้วย

  1. Next(Prior(P)) = Next(P) เป็นการใช้ตัวชี้ left ของโหนดที่ต้องการลบอ้างกลับไปยังโหนดก่อนหน้าเพื่อชี้ Right ชี้ไปยังโหนดถัดไปต่อจากโหนดที่ต้องการลบ ในรูปที่ 6.22


  1. Prior(Next(P)) = Prior(P) เป็นการใช้ตัวชี้ Right ขอองโหนดที่ต้องการลบอ้างไปยังโหนดถัดไปเพื่อสร้างตัวชี้ Left ชี้กลับไปยังโหนดก่อนหน้าโหนดที่ต้องการลบในรูปที่ 6.23

  1. Free(P) หลังจากนั้นจึงปลดปล่อยโหนดที่ต้องการลบซึ่งมีตัวแปรพอยน์เตอร์ P ชี้อยู่ เพื่อคืนพื้นที่หน่วยความจำของโหนดที่ลบไปและนำไปใช้กับงานอื่นได้ (Reuse) ได้เป็นรูปที่ 6.24

                ลำดับการทำงานจะมี 3 โหนดที่มาเกี่ยวข้อง คือ โหนดที่ต้องการลงมีตัวแปรพอยน์เตอร์ P โหนดก่อนหน้าและโหนดถัดไป ส่วนโหนดอื่น ๆ ไม่ถูกเรียกใช้งานหรือเปลี่ยนแปลง
ลิ้งค์ลิสต์หลายทาง 
                มีอยู่หลายกรณีที่นำลิงค์ลิสต์มาใช้งานตามความเหมาะสมซึ่งแต่ละโหนดจะถูกกำหนดให้ส่วนการเชื่อมต่อมีมากกว่าสองทางเรียกว่าลิงค์ลิสต์หลายทาง (Multi-linked List) อย่างเช่นในรูปที่ 6.25 ที่แต่ละโหนดในลิงค์ลิสต์จะมีตัวชี้สามทางโดยมีพื้นฐานเป็นลิงค์ลิสต์สองทางซึ่งมีส่วนเก็บข้อมูลคือ NameLength เก็บค่าความยาวของสตริง กับส่วนเชื่อมต่อที่เป็นตัวชี้ Right และ Left และส่วนที่เชื่อมต่อที่สาม คือ ตัวชี้ NamePtr ใช้ชี้ไปยังข้อมูลจริงอีกทีซึ่งมีโครงสร้างข้อมูลสตริงเก็บไว้ในหน่วยความจำที่ขอมาแทนการเก็บไว้ภายในโหนด

วันจันทร์ที่ 25 กรกฎาคม พ.ศ. 2554

Resume

RESUME
Personal Detail
Name :  Miss. Sreema  Kanyanat
Address : 8/1  M.5  T. Kanchong  A.Wadbot  Phitsanulok 65160
Age :   22  Years
Height :  160  Cm.
Weight :  46  Kg.
Date of birth :  17  Mar.  1989
Telephone :  0-85270-5818
E-mail : kanyanat_kib@hotmail.com
Educational Background
        2008 – 2011   Suan Dusit Ratjabhat University.   GPA : 3.04
        2005 – 2007   Kanchongphitayacom School.   GPA : 3.42
Tranining Background
        Nov  2011 – Feb  2012
Specal Abilities
        Can Speak, Write, Reading English
        Can type 30 word perminute in Thai and 25 word per minute in English
Interests
        Sport


cover letter
Dear Sir / Madam.
            Referring to your advertize in Job Thai Hotel.com in position of Computer graphics.
 I would appreciate to apply for this position.
I very ensure that my background and experience as serve you will. Here with my
 resume with file attached.
I look forward to hearing from you soon or your convenience time. My contact                                               number is 0-85270-5818. Personal Email :kanyanat_kib@hotmail.com.
                                                                                                                          
                                                                                                                         Sincerely Yours,
                                                                     Miss. Sreema  Kanyanat

วันพฤหัสบดีที่ 14 กรกฎาคม พ.ศ. 2554

Convertation

บทสนทนาเกี่ยวกับการแนะนำตัวในการสัมภาษณ์งาน
ถาม: Good morning. How do you do?
ตอบ: Good morning. How do you do.
ถาม: How are you ?
ตอบ: I'm fine very well thank you and you.
ถาม: Nice to meet you?
ตอบ: Nice to meet you too.
การแนะนำตัว
May I introduce myself?
My name is ...ชื่อ... I,’m now …อายุ.. year old. I have …จำนวนพี่ชายหรือน้องชาย.. brother and …จำนวนพี่สาวหรือน้องสาว… sister.   หรือ I’m only one child (กรณีเป็นลูกคนเดียว)   หรือ I have no brother and sister.(กรณีไม่มีพี่น้อง) I graduated from ...สถาบันที่จบการศึกษา University.   หรือ กำลังเรียน I ‘m studing ชื่อสถานที่เรียน University.
I did a bachelor in ...คณะที่เรียน... my major was...สาขาที่เรียน...
ตัวอย่างบทสนทนา
A: Good morning. How do you do?
B: Good morning. How do you do.
A: Nice to meet you?
B: Nice to meet you too.
A: Could you please introduce yourself briefly?
B: My name is Kanyanat  Sreema. I’m now 22 year old. I have one sister. I‘m studying Suan Dusit Rajbhat University.I did a bachelor in management scince. my major wos business computer.
A: What are you doing now?
B: I'm still out of work.
A: What do you during you free time?
B: Reading book.
A: Can you drive a car?
B: No I can't.
A:Can you speak English?
B: Yes I can speak abate.
A: Can you type?
B: Yes I can type 30 words per minute in Thai and 25 words per minute in English.
A: What Salary do you expect?
B: 15,000.
อาจารย์ นงค์นุช บุญกล่ำ  11 กรกฏาคม 2554

วันเสาร์ที่ 9 กรกฎาคม พ.ศ. 2554

Joomla



Joomla คือระบบที่ช่วยในการจัดการเนื้อหา(Content Management System: CMS) บนเว็บไซต์ เพื่อช่วยในการอำนวยความสะดวก ลดขั้นตอน และความยุ่งยากในการบริหารจัดการเว็บไซต์ โดยที่ ผู้ใช้ไม่จำเป็นต้องมีความรู้ในด้านการเขียนโปรแกรม หรือออกแบบเว็บไซต์ ก็สามารถจัดทำเว็บไซต์
-เข้าเว็บเบราว์์เซอร์ จากนั้นพิมพ์ Localhost จะเข้าหล้าหลัก เลือก phlegmatic Database Manager 2.10.2 จากนั้นจะขึ้นหน้า Login ขึ้นมา ใส่ username = >root , password => root (ส่วนมากที่ใช้กัน)=> ok
เปิดหน้าเว็บใหม่พิมพ์ http://localhost/joomla 
พิมพ์ชนิดฐานข้อมูล => mysql
ชื่อโฮสต์ =>  localhost
ชื่อผู้ใช้   =>  root
รหัสผ่าน => root
ชื่อฐานข้อมูล => Joomla (ชื่อฐานข้อมูลของเรา)=> ถัดไป => ถัดไป
ใส่ชื่อเว็บไซต์ เช่น Joomla program
ใส่อีเมล์ ad@hotmail.com (อีเมล์ปลอม)
ใส่รหัสผ่าน admin
ยืนยันรหัสผ่าน admin => ถัดไป
ไปที่ ไดร์ C/Appserv/www/joomla ไปที่ install เปลี่ยนชื่่อหรือลบทิ้ง(ถ้าทำจริงต้องลบทิ้ง)
จากนั้นเข้า http://locahost/joomla/administrator จะขึ้นหน้า Login ขึ้นมา 


ผู้บรรยาย อ.วราวุฒิ แข่งขัน 
วันจันทร์ ที่ 4 กรกฎาคม 2554

วันพุธที่ 29 มิถุนายน พ.ศ. 2554

Wordpress

Wordpress
วันที่ 27 มิถุนายน 2554
ผู้บรรยาย อาจารย์วราวุฒิ  แข่งขัน
              เวิร์ดเพรส (WordPress) คือ โปรแกรมจัดการบริหารข้อมูล หรือ CMS ที่อยู่ในรูปแบบของบล๊อก   (ดาวโหลด WordPress V ล่าสุดได้ที่http://wordpress.org/  อยู่ตรงกลางๆ หน้าหน่อย) ซึ่งช่วยให้มีเว็บไซท์และดูแลข้อมูลภายในเว็บได้ง่าย มีรูปแบบที่ไม่ซับซ้อนมากนักและเรียนรู้วิธีใช้งานได้รวดเร็ว มีโปรแกรมเสริม หรือปลั๊กอิน (Plug-in) ที่ช่วยเพิ่มความสามารถและประสิทธิภาพในการทำงานมากมาย สามารถเปลี่ยนธีม (Theme) หรือหน้าตาของบล๊อกได้และมีธีมให้เลือกใช้มากมายทั้งฟรี และเสียเงิน การทำงานของ WordPress นั้นได้เปลี่ยนการสร้างเว็บไซต์ที่เมื่อก่อนต้องมีความรู้เรื่อง HTML และโครงสร้างต่างๆ ของเว็บ ต้องดีไซด์เอง และอะไร อื่นๆ อีกมากมายครับ แต่ทุกวันนี้เวลาเป็นสิ่งสำคัญที่สุดนะครับ เจ้า WP ตัวนี้ช่วยล่นระยะเวลาในการสร้างเว็บไซต์ซัก 1 เว็บเป็นเรื่องที่ไม่ไกลเกินตัวครับ และตอนนี้ก็กำลังเป็นที่นิยมกันทั่วโลก
Wordpress.com เป็นเว็บโฮสติ้งฟรี                                               
wordpress เป็นที่นิยมเพราะ subport ในการทำ serchging ทุกครั้งที่ทำโปรแกรม sever ต้องเปิด wordpress เสมอ  
scm ดับเบิ้ลคลิกที่ Apache 2.2 เปลี่ยนเป็น Manual กด Apply แล้วกด OK จากนั้นดับเบิ้ลคลิกที่  Mysql เปลี่ยนเป็น Manul  กด Apply แล้วกด OK   ที่ทำแบบนี้เพื่อที่ไม่ให้มันเริ่มต้นตอนเปิดโปรแกรม
http://localhost หรือ http://192.02.13 พิมในแอดเดสเพื่อตรวจสอบว่า Website ใช้ได้หรือไม่ เมื่อกดเปิดหน้า  http://localhost   ได้แล้วให้เลือก php Myadmin Database พิมพ์ Username และPassword   
ขั้นตอนการเตรียมฐานข้อมูล
1.สร้างฐานข้อมูลใหม่ พิมพ์ตั้งชื่อ wordpress font มาตราฐานที่ใช้ utf8_general _ci กดสร้าง
2.การเก็บเว็บไซต์ทั้งหมด โดยเริ่มจากการ Copy โฟลเดอร์ wordpress ไปใส่ที่ไดร์ : C จากนั้น เข้า Appserv เลือก www เลือก wp_config_sample ก็อปปี้ แล้ว paste  ลงในนั้นโดยเปลี่ยนชื่อที่วางโฟลเดอร์ไปเป็น wp_config
เมื่อสามารถสร้างเว็บไซต์ได้แล้วต่อไปเป็นการสร้าง Page  Page ----> Add new ----> พิมตั้งชื่อ หัวข้อ
การใช้งานของwordpress คล้ายๆกับการใช้งานของ Blogger

บทที่ 3 Array

บทที่ 3 Array

Array โครงสร้างข้อมูลแบ่งออกเป็น 2 ประเภท คือ
1.โครงสร้างข้อมูลแบบเชิงเส้น ( Linear Lists )
เช่น อาร์เรย์( Array ), สแต็ก ( Stack ) และ คิว ( Queues )
2.โครงสร้างข้อมูลแบบไม่เป็นเชิงเส้น ( Non-Linear Lists )           
เช่น ทรี ( Trees ) และกราฟ ( Graphs )
โครงสร้างข้อมูลแบบอาร์เรย์
            อาร์เรย์ ( Array ) หรือแถวลำดับ คือการรวมกลุ่มของตัวแปรที่สามารถใช้ตัวแปรชื่อเดียวแทนข้อมูลสมาชิกได้หลายๆตัว ใช้เลขดรรชนี ( index ) หรือ ( Subscript ) เป็นตัวอ้างอิงตำแหน่งสมาชิกบนแถวลำดับ
คุณสมบัติสำคัญของอาร์เรย์

1.อาร์เรย์เป็นตัวแทนของกลุ่มที่มีความสัมพันธ์กัน

2.มีชนิดข้อมูลเหมือนกันทั้งหมด

3.อาร์เรย์มีขนาดคงที่

4.ผู้ใช้สามารถอ้างอิงเพื่อเข้าถึงข้อมูลที่ต้องการได้ทันที

การอ้างอิงตำแหน่งสมาชิกในอาร์เรย์
ต้องเริ่มต้นด้วยชื่ออาร์เรย์และตามด้วยเลขลำดับกำกับไว้ 
ด้วย สามารถเรียกได้หลายชื่อด้วยกัน เช่น เลขลำดับ เรียกอีกชื่อ ซัป
สคริปต์ หรือเลขดรรชนี
 
ขอบเขตของอาร์เรย์ (Bounds)         เลขดรรชนีในอาร์เรย์ประกอบด้วยช่วงขอบเขตของค่าซึ่งประกอบด้วยขอบเขตล่างสุดและขอบเขตบนสุด
การคำนวณหาจำนวนสมาชิก                                            
โดยที่  U  = ขอบเขตบนสุด  , L = ขอบเขตล่างสุด
อาร์เรย์ 1 มิติ  ใช้สูตร         U – L + 1                                  
อาร์เรย์ 2 มิติ  ใช้สูตร  ( U1 – L1 + 1) * ( U2 – L2 + 1)
การจัดเก็บอาร์เรย์ในหน่วยความจำ
-อาร์เรย์จัดเก็บอยู่ในหน่วยความจำคอมพิวเตอร์จะมีลักษณะเป็นลำดับต่อเนื่องกัน
-ใช้เนื้อที่ในการจัดเก็บข้อมูลสมาชิกของแต่ละตัวในขนาดเท่าๆกัน
-สมาชิกทุกตัวในต้องเป็นข้อมูลชนิดเดียวกัน
 
รูปแบบทั่วไปของโครงสร้างข้อมูลอาร์เรย์
                                                         อาร์เรย์ 1 มิติ ใช้สูตร ArrayName [ L:U ]
 a[1:10] = a[10] 
    
อาร์เรย์ 2 มิติ ใช้สูตร ArrayName [ L1:U1,L2:U2 
          
 a[4,5] = a[0:3,0:4] 
อาร์เรย์ 3 มิติ ใช้สูตร ArrayName [ L1:U1,L2:U2 ,L3:U3 
 
a[6,5,4] = a[0:5,0:4,0:3] 
 
การคำนวณหาตำแหน่งแอดเดรสในหน่วยความจำอาร์เรย์ 1 มิติ
ใช้สูตร LOC(a[i]) = B + w(i – L)
โดยที่                                                                                  
LOC(a[i]) คือ ตำแหน่งแอดเดรสที่เก็บ a[i] ในหน่วยความจำ                       
B คือ แอดเดรสเริ่มต้นของ a                                                 
w  คือ ขนาดของข้อมูลในการจัดเก็บ                                    
 i คือ ตำแหน่งของสมาชิกในอาร์เรย์                                     
 L คือ ขอบเขตล่างสุด                                                             
 
ตัวอย่าง
อยากทราบอาร์เรย์ a[10] (ภาษา C ) ถูกจัดเก็บในหน่วยความจพเดรสใด กำหนดให้ : 
 แอดเดรสเริ่มต้น = 1000      w =  1 ไบต์
LOC(a[i]) = B + w(i – L)                  
                  = 1000 + 1(10-0)
                  = 1000 + 10
                  = 1010
อาร์เรย์ 2 มิติ                                                                        การจัดเก็บด้วยการเรียงคอลัมน์เป็นหลัก   
ใช้สูตร      LOC(a[i]) = B + w[C(i – L1) + ( j – L2)] 
 
โดยที่ C  คือตำแหน่งคอลัมน์ของแถวลำดับ ( R*C )            
ตัวอย่าง  ต้องการทราบตำแหน่งที่เก็บข้อมูลอาร์เรย์ K แถวที่ 2 คอลัมน์ 1 กำหนด B = 500, w = 4 ( ภาษา C )
LOC(K[i,j]     = B + w[C(i – L1) + ( j – L2)] 
LOC(K[2,1])  = 500 + 4[3(2– 0) + ( 1 – 0)]
                        = 500 + 4[6 +1]
                        = 500 +28
                        = 528
อาร์เรย์ 3 มิติ                                                                            
การจัดเก็บด้วยการเรียงแถวเป็นหลัก       ใช้สูตร
      LOC(s[i,j,k])  = B + [ w * R * C( i - L1)                  
                                     + [w * C( j – L2 )] + [w(k-L3)]
ตัวอย่าง      
ต้องการทราบตำแหน่งที่เก็บข้อมูลอาร์เรย์ S ชั้นที่ 0 แถวที่ 3 คอลัมน์ 4 กำหนดให้ B = 500, w =4 (ภาษา C S[3][4][5] )
LOC(s[i,j,k])  = B + [ w * R * C( i - L1)                  
                               + [w * C( j – L2 )] + [w(k-L3)]
LOC(s[0,3,4])  = 500 + [ 4 * 4 * 5( 0 - 0)                  
                                     + [4 * 5( 3– 0 )] + [4(4-0)]
                           = 500 + 0 + 60 + 16
                          = 576
อาร์เรย์ 3 มิติ 
-การนำเอาอาร์เรย์ 2 มิติ มาเรียงซ้อนกันหลายๆ ชั้น
-มีแถว (row) และคอลัมน์ (column) และความลึก(deap)
                                      
การจัดเก็บด้วยการเรียงคอลัมน์เป็นหลัก      
 
ใช้สูตร
LOC( S[i,j,k]) = B + [w * K * R * C(j – L2) ]
                                + [ w * K * R(i – L1 )]  + [k – L3]
การคำนวณหาตำแหน่งแอดแดรสในหน่วยความจำของอาร์เรย์ 3 มิติ
สามารสจัดเก็บได้ 2 วิธี
1. การจัดเก็บด้วยการเรียงแถวเป็นหลัก (Row Major Order)
2. การจัดเก็บด้วยการเรียงคอลัมน์เป็นหลัก (Column Major Order)
        

                                                                                                                          

วันพฤหัสบดีที่ 23 มิถุนายน พ.ศ. 2554

บทที่ 2 ภาษา c (Review C Language)

บทที่2 ภาษา C (Review C Language)

Contents 

คำสั่งพื้นฐานต่างๆ เช่น printf,scanf

  • เช่น printf( “abc” );
        printf( “%s”, ”abc” ); 
  • เช่น scanf( “%d”,&x);
Format Code ใช้ในการแสดงผลที่นิยมใช้ ได้แก่ 
       %d   ใช้กับข้อมูลแบบ integer
       %c    ใช้กับข้อมูลแบบ character
       %f     ใช้กับข้อมูลแบบ floating
       %s    ใช้กับข้อมูลแบบ string

Operator
เครื่องหมายดำเนินการ (Operator) แบ่งออกเป็น 3 ชนิด คือนิพจน์ (Expression)
  • Arithmetic Operators ได้แก่  +, - , *, /, % , -- , ++
  • Relational and Equality Operators ได้แก่ < , > , <= , >= , == , !=
  •    - Logical Operators ได้แก่ ! , && , ||
 คือการนำตัวแปรค่าคงที่มาสัมพันธ์กันโดยใช้เครื่องหมายอย่างใดอย่างหนึ่ง
นิพจน์จะทำงานจากซ้ายไปขวาามลำดับการทำงานของเครื่องหมาย

  1. วงเล็บ
  2. !, ++, --
  3. *, /, %
  4. +, -
  5. <, <=, >, >=
  6. ==, !=
  7. &&
  8. ||
selection/Condition
  • if statement
  • if - else statement
  • if - else statement (Nested if)
  • switch statement
Repetition/Loop
  • while statement
      Format :
   
          while (expression) {                  
                   statement-1;                  
                   statement-2;                      
                       ……                  
                   statement-n;     
           }
  • for statement
    Format :
              for (expression -1; expression-2; expression-3 ) {                
                   statement -1 ;                
                   statement -2 ;                     
                            …..                
                  statement -n ;  
          }
  • do-while statement
    Format :
                   do {                
                         statement -1 ;                
                         statement -2 ;                  
                               …..                 
                         statement -n ;            
                   } while (expression);
Function
ข้อดี
  • เขียนโค้ดครั้งเดียว แต่สามารถเรียกใช้ได้หลายครั้ง
  • สามารถนำหลับมาใช้ใหม่ในโปรแกรมอื่นได้
  • ถ้าต้องการเปลี่ยนแปลงแก้ไขเพียงที่เดียว
  • ทำให้โปรแกรมมีความเป็นโครงสร้าง 
  • สามารถแบ่งเป็นโมดูลย่อยๆได้
Function (Cont.)
ฟังก์ชันแบ่งเป็น 2 ประเภท คือ

  1. Library Function
  • Format :
           #include<file-name>
  •  Example
           #include<stdio.h>   #include<conio.h >   etc. 
Example Library Function
strcpy() - อยู่ในแฟ้มข้อมูล string.h
  • ทำหน้าที่: คัดลอกข้อมูลจาก string หนึ่งไปยังอีก string หนึ่ง
  • Format:
          strcpy(str1, str2);

Library Function

วิธีเรียกใช้งาน  Library Function
  • เรียกชื่อของฟังก์ชันที่ต้องการใช้งาน
  • เอาค่าที่จะส่งไปทำงานในฟังก์ชัน ใส่ลงในวงเล็บตามหลังชื่อฟังก์ชันนั้น
    User Defined Function 
     
       -คือ ฟังก์ชันที่ผู้เขียนโปรแกรมสามารถเขียนฟังค์ชันขึ้นใช้เอง โดยฟังก์ชันนี้อาจจะรวมอยู่กับโปรแกรมหลักเป็นแฟ้มเดียวกัน หรือยกฟังก์ชันเหล่านี้ไว้คนละแฟ้มข้อมูลก็ได้
       -การสร้างฟังก์ชัน ประกอบด้วย
    • Function Definition
    • Function Prototype
    • Invocation
     Function Definition
    • Function Definition หรือนิยามฟังก์ชัน คือ รายละเอียดในการทำงานของฟังก์ชัน
    • Format :
              /*…………..*/  clip_image001 heading comment
              data-type function-name(type argument )   
             {      
                      declaration;      
                      statement;    
                      return(value);
              }
    Function Prototype 
    •  เป็นตัวบอกให้ Compiler ทราบว่าการประกาศฟังก์ชันขึ้นและฟังก์ชันนั้นมีค่าที่ส่งกลับเป็นอะไร มีการรับพารามิเตอร์อะไรบ้าง มีประโยชน์ในการตรวจสอบข้อผิดพลาดระหว่างการเรียกใช้ฟังก์ชัน 
    Example:
               void print_banner(void);
               void print_banner(int  amount);
    Invocation
    • คือการเรียกใช้ฟังก์ชัน

    • ลักษณะของฟังก์ชัน
              -ฟังก์ชันที่ไม่มีการส่งค่ากลับ การเรียกใช้ทำได้โดยอ้างถึงชื่อฟังก์ชัน
               ...........
      Print_banner () ;
             
              -ฟังก์ชันที่มีการส่งค่ากลับ การเรียกใช้ทำได้เหมือนแบบแรก แต่ต้องมีตัวแปรมารับค่าที่จะต้องส่งกลับด้วย
    int main(void) {
    int k, j;
       j = prompt ()
       k = prompt ();
    printf(“j = %d and k = %d”, j, k);
              
               -ฟังก์ชันที่มีการรับค่า argument
    การเรียกใช้ฟังก์ชันทำได้โดยอ้างถึงชื่อของฟังก์ชันพร้อมทั้งส่งค่าของตัวแปร(parameter)ไปด้วย โดยจะ ต้องมีชนิดสอดคล้องกับ argument ของฟังก์ชัน ที่เรียกใช้
             
               -การผ่านค่า argument ให้ฟังก์ชัน ทำได้ 2 แบบ คือ
    Pass by Value คือ การส่งค่าไปยังฟังก์ชันที่ถูกเรียกใช้โดยส่งค่าของตัวแปรหรือค่าที่ส่งไปโดย ค่าคงที่ผ่านให้กับค่าฟังก์ชันจะถูกคัดลอกส่งให้กับ ฟังก์ชันและจะถูกเลี่ยนแปลงเฉพาะภายในฟังก์ชัน โดยค่าของ argumentในโปรแกรมที่เรียกใช้จะไม่เปลี่ยนแปลง   ตัวอย่าง :
    void swap(int num1, int num2) {
            int tmp;
    tmp = num1;
    num1 = num2;
    num2 = tmp;
    print(“A is %d B is %d\n”, num1, num2);
    }
    Pass by Reference
    คือ การส่งค่าไปยังฟังก์ชันที่ถูกเรียกใช้โดยส่งเป็นตำแหน่งที่อยู่ของตัวแปรไป ซึ่งหากภายในฟังก์ชันมีการเปลี่ยนแปลงค่าของ argument ที่ส่งไป ก็จะมีผลทำให้ค่าของ argument นั้นใน โปรแกรมที่เรียกใช้เปลี่ยนไปด้วย ตัวอย่าง :
    void swap(int * num1, int * num2) {
           int tmp;
    tmp = *num1;
    *num1 =* num2;
    *num2 = tmp;
    }

ตัวอย่าง Library Function s

trcpy () –อยู่ในแฟ้มข้อมูล string.h 
  • ทำหน้าที่ : คัดลอกข้อมูลจาก string หนึ่งไปยัง string หนึ่ง
  •   Format : 
           strcpy (str1, str2);