ใครสร้าง linked list c++ เป็นบ้างครับช่วยด้วยย

     เมื่อ 2 วันที่แล้วผมเรียน data structures and algorithms  มา แล้ว งง มาก อยู่ดีๆ ครูเค้าเปิด เว็บ http://www.cplusplus.com/articles/LACRko23/  แล้วผมไม่เข้าใจเลย ในส่วนของ header 

// Node.h
// Author: Ali Selcuk AKYUZ
// Mail: selcuk@retinarobotics.com || e174043@metu.edu.tr
// Electrical and Electronics Engineering Department
// Middle East Technical University - ANKARA
// If any questions please send me an email

#ifndef NODE_H
#define NODE_H
#include <iostream>

using namespace std;

template<class T>
class Node
{
public:
        Node();
        Node(const T& item, Node<T>* ptrnext = NULL);
        T data;
 // access to the next node
        Node<T>* NextNode();
// list modification methods
        void InsertAfter(Node<T>* p);
       Node<T>* DeleteAfter();
       Node<T> * GetNode(const T& item, Node<T>* nextptr = NULL);
private:

       Node<T> * next;
};

#endif // NODE_H

• ที่ผมไม่เข้าใจเลยคือตรงส่วนของ construct ที่มี argument  Node(const T& item, Node<T>* ptrnext = NULL);

• const ที่ผมไปหาในเน็ตคือค่าคงที่ แต่ T& item คือไรหรอครับ ที่ผมไปหามาในเน็ตคือ 
                 int number =10;
                 int *ptrNumber = &number ;   
                 * คือที่เก็บ address & คือที่แสดงค่า address 
       แต่ที่ผมสงสัยคือ T&  คืออะไร ปกติ &มันต้องอยู่ข้างหน้า T ไม่ใช่หรอ Node<T>* ptrnext คืออะไร เพราะปกติ * มันต้อง *ptrNumber แบบนี้ไม่ใช่  หรอ ทำไมมันเป็น Node<T>* 

• T data; คืออะไร T มันไม่ใช่ variable ไม่ใช้หรอ

• #ifndef NODE_H
   #define NODE_H คืออะไร

• template<class T> คืออะไร ผมจึงมืด 8 ด้าน

• ในเมื่อผมไม่เข้าใจ ผมจึงไปหาข้อมูลวิธีสร้าง linked list ในเน็ตมา ส่วนใหญ่เป็นแบบนี้ 

struct node
{
int data;
node* next;
};
              แล้วได้ พบกับ struct ซึ่งครูยังไม่ได้สอน ที่ผมไปหา struct เหมือน class ใน c++ ใช่ไหมครับ ไปอ่านในเน็ตมาก็ยังไม่ค่อยเข้าใจอยู่ดี แล้วผม งง คำสั่ง ของมันอีกแล้วตรง node* คืออะไร นี้คือที่ผม สงสัยมาคราวๆครับ ผู้รู้ช่วยบอกทีเพราะผมหาข้อมูลมา 2 วันแล้วรู้สึกสงสัยมาก ขอบคุณครับ

ปล.สอนเป็นภาษา Eng และนี้เรียนครั้งที่ 2 ครั้งแรกครูเค้าติดประชุม (หัวหน้าภาค) ครั้งที่ 2 lab มาสอนอย่างงี้เลย 
แก้ไขข้อความเมื่อ
คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 3
-  c++ คีย์เวิร์ด struct กับ class เหมือนกันเว้นแต่ default access ของ struct เป็น public ต่างกับ class เป็น private
https://en.cppreference.com/w/cpp/language/class
class-key     -     one of class or struct. The keywords are identical except for the default member access and the default base class access.

-  c++ fancy pointer type  : node* next
ถังชื่อ next ขนาด sizeof(size_t) สำหรับเก็บ represented address  (ซึ่งจริง ๆ จะเป็นค่าจำนวนเต็มบวกอะไรก็ได้) ทว่าทุก ๆ ครั้งที่จะ access ค่าผ่าน *next ขณะนั้นโปรแกรมเมอร์จะ "ต้อง" รับประกันว่ามี object ของ node ที่ valid อยู่ตรง represented  address นั้นทุกครั้งไป

-  c++ reference type : T& item (หรือยกตัวอย่าง int& item)
โดยพฤตินัยคือ pointer type ซึ่งโดย syntax มันจะได้รับการ dereference อัตโนมัติเมื่อเอ่ยถึง item (โดยไม่ต้อง *item อีกที) และหา address ได้ด้วยวิธีเดิมคือ &item

-  c++ parameter passing convention : Node(const int& item
เราสามารถเลือกจะผ่านค่าโดย value หรือ address ก็ได้
และถ้าผ่านค่าเป็น address ก็เลือกได้อีกว่าจะเป็น pointer type หรือ reference type
(และหลังจาก modern c++ หรือ c++11 เราจะมี move semantics สำหรับใช้กับ rvalue ในรูปของ T&& หรือ   universal    forwarding reference อีก  เฉพาะเรื่องนี้ว่ากันยาวบานตะไท  และใช้เวลาครับ)

-  preprocessor : #ifndef NODE_H
"if not defined" ใช้สำหรับกำหนดลอจิกตอน compile เพื่อทำ compile time branching, compiler visibility
ปัจจุบันถ้าจะทำแค่ compile time branching เราใช้ c++17 "if constexpr" แทน #if ได้

-  c++ class template : template<class T> class Node, Node<T>
ถ้าเอาง่าย ๆ มันก็เหมือน template ใน visio แหละครับ  เป็นโครงที่ใส่อะไรลงไปได้
แทนที่จะเขียน

struct node
{
    int data;
    node* next;
};
....
node my_node{};

ก็เขียนว่า

template<typename T>
class node
{
public:
    T data;
    node<T>* next;
};
....
node<int> my_node{};

แล้ว compiler จะสร้าง concrete type ที่เป็น template instantiation เอง
ยังไงลองเทียบ concrete type กับ template ใน godbolt.org ดูว่าสุดท้ายแล้วเหมือนหรือต่างกันแค่ไหน

"STL" คนที่ implement standard library ของค่าย microsoft อธิบายเรื่อง template specialization
https://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-5-of-n

ภาษาที่นั่งใกล้ฮาร์ดแวร์อย่าง C++ มี learning curve สูงมาก  ต่างกับภาษาอื่น
เหมือนลูกเจ้าพ่อเอาแต่ใจ   คุณต้องให้เวลามาก ๆ เลยครับ
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่