MFC - รายการที่เชื่อมโยง
ก linked listเป็นโครงสร้างข้อมูลเชิงเส้นโดยแต่ละองค์ประกอบเป็นวัตถุแยกกัน แต่ละองค์ประกอบ (เราจะเรียกว่าโหนด) ของรายการประกอบด้วยสองรายการ - ข้อมูลและการอ้างอิงไปยังโหนดถัดไป โหนดสุดท้ายมีการอ้างอิงถึง null
รายการที่เชื่อมโยงคือโครงสร้างข้อมูลที่ประกอบด้วยกลุ่มของโหนดซึ่งร่วมกันแสดงถึงลำดับ เป็นวิธีการจัดเก็บข้อมูลที่มีโครงสร้างเพื่อให้โปรแกรมเมอร์สามารถสร้างที่ใหม่โดยอัตโนมัติเพื่อจัดเก็บข้อมูลเมื่อจำเป็น คุณสมบัติเด่นบางประการ ได้แก่ -
- Linked List คือลำดับของลิงก์ที่มีรายการต่างๆ 
- แต่ละลิงค์มีการเชื่อมต่อไปยังลิงค์อื่น 
- แต่ละรายการในรายการเรียกว่าโหนด 
- หากรายการมีอย่างน้อยหนึ่งโหนดโหนดใหม่จะถูกวางตำแหน่งเป็นองค์ประกอบสุดท้ายในรายการ 
- หากรายการมีเพียงโหนดเดียวโหนดนั้นจะแสดงรายการแรกและรายการสุดท้าย 
รายการลิงค์มีสองประเภท -
รายการที่เชื่อมโยงเดี่ยว
Singly Linked Lists เป็นโครงสร้างข้อมูลประเภทหนึ่ง ในรายการที่เชื่อมโยงเดี่ยวแต่ละโหนดในรายการจะเก็บเนื้อหาของโหนดและตัวชี้หรืออ้างอิงไปยังโหนดถัดไปในรายการ
 
                รายการที่เชื่อมโยงเป็นทวีคูณ
รายการที่เชื่อมโยงแบบทวีคูณคือโครงสร้างข้อมูลที่เชื่อมโยงซึ่งประกอบด้วยชุดของระเบียนที่เชื่อมโยงตามลำดับที่เรียกว่าโหนด แต่ละโหนดมีสองฟิลด์ที่อ้างอิงไปยังโหนดก่อนหน้าและโหนดถัดไปตามลำดับของโหนด
 
                คลาส CList
MFC จัดให้มีชั้นเรียน CListซึ่งเป็นเทมเพลตที่เชื่อมโยงรายการและทำงานได้อย่างสมบูรณ์ รายการคลิสต์จะทำงานเหมือนรายการที่เชื่อมโยงสองครั้ง ตัวแปรประเภท POSITION เป็นกุญแจสำคัญสำหรับรายการ คุณสามารถใช้ตัวแปร POSITION เป็นตัววนซ้ำเพื่อสำรวจรายการตามลำดับและเป็นบุ๊กมาร์กเพื่อเก็บสถานที่
| ซีเนียร์ | ชื่อและคำอธิบาย | 
|---|---|
| 1 | AddHead เพิ่มองค์ประกอบ (หรือองค์ประกอบทั้งหมดในรายการอื่น) ไปที่ส่วนหัวของรายการ (สร้างส่วนหัวใหม่) | 
| 2 | AddTail เพิ่มองค์ประกอบ (หรือองค์ประกอบทั้งหมดในรายการอื่น) ที่ส่วนท้ายของรายการ (สร้างส่วนท้ายใหม่) | 
| 3 | Find รับตำแหน่งขององค์ประกอบที่ระบุโดยค่าตัวชี้ | 
| 4 | FindIndex รับตำแหน่งขององค์ประกอบที่ระบุโดยดัชนีฐานศูนย์ | 
| 5 | GetAt รับองค์ประกอบในตำแหน่งที่กำหนด | 
| 6 | GetCount ส่งคืนจำนวนองค์ประกอบในรายการนี้ | 
| 7 | GetHead ส่งคืนองค์ประกอบส่วนหัวของรายการ (ต้องไม่ว่างเปล่า) | 
| 8 | GetHeadPosition ส่งคืนตำแหน่งขององค์ประกอบส่วนหัวของรายการ | 
| 9 | GetNext รับองค์ประกอบถัดไปสำหรับการทำซ้ำ | 
| 10 | GetPrev รับองค์ประกอบก่อนหน้าสำหรับการทำซ้ำ | 
| 11 | GetSize ส่งคืนจำนวนองค์ประกอบในรายการนี้ | 
| 12 | GetTail ส่งคืนองค์ประกอบส่วนท้ายของรายการ (ต้องไม่ว่างเปล่า) | 
| 13 | GetTailPosition ส่งคืนตำแหน่งขององค์ประกอบส่วนท้ายของรายการ | 
| 14 | InsertAfter แทรกองค์ประกอบใหม่หลังตำแหน่งที่กำหนด | 
| 15 | InsertBefore แทรกองค์ประกอบใหม่ก่อนตำแหน่งที่กำหนด | 
| 16 | IsEmpty ทดสอบเงื่อนไขรายการว่าง (ไม่มีองค์ประกอบ) | 
| 17 | RemoveAll ลบองค์ประกอบทั้งหมดออกจากรายการนี้ | 
| 18 | RemoveAt ลบองค์ประกอบออกจากรายการนี้ซึ่งระบุโดยตำแหน่ง | 
| 19 | RemoveHead ลบองค์ประกอบออกจากส่วนหัวของรายการ | 
| 20 | RemoveTail ลบองค์ประกอบออกจากส่วนท้ายของรายการ | 
| 21 | SetAt ตั้งค่าองค์ประกอบในตำแหน่งที่กำหนด | 
ต่อไปนี้คือการดำเนินการต่างๆบนวัตถุ CList -
สร้างวัตถุ CList
ในการสร้างคอลเล็กชันค่า CList หรืออ็อบเจ็กต์ก่อนอื่นคุณต้องเลือกประเภทของค่าของคอลเล็กชัน คุณสามารถใช้ประเภทข้อมูลดั้งเดิมที่มีอยู่เช่น int, CString, double เป็นต้นดังที่แสดงด้านล่างในรหัสต่อไปนี้
CList<double, double>m_list;เพิ่มรายการ
ในการเพิ่มรายการคุณสามารถใช้ฟังก์ชัน CList :: AddTail () จะเพิ่มรายการที่ส่วนท้ายของรายการ ในการเพิ่มองค์ประกอบที่จุดเริ่มต้นของรายการคุณสามารถใช้ฟังก์ชัน CList :: AddHead () ใน OnInitDialog () CList อ็อบเจ็กต์ถูกสร้างขึ้นและมีการเพิ่มค่าสี่ค่าดังที่แสดงในโค้ดต่อไปนี้
CList<double, double>m_list;
//Add items to the list
m_list.AddTail(100.75);
m_list.AddTail(85.26);
m_list.AddTail(95.78);
m_list.AddTail(90.1);ดึงรายการ
ตัวแปรประเภท POSITION เป็นกุญแจสำคัญสำหรับรายการ คุณสามารถใช้ตัวแปร POSITION เป็นตัววนซ้ำเพื่อสำรวจรายการตามลำดับ
Step 1 - ในการดึงองค์ประกอบจากรายการเราสามารถใช้รหัสต่อไปนี้ซึ่งจะดึงค่าทั้งหมด
//iterate the list
POSITION pos = m_list.GetHeadPosition();
while (pos) { 
   double nData = m_list.GetNext(pos);
   CString strVal;
   strVal.Format(L"%.2f\n", nData);
   m_strText.Append(strVal);
}Step 2 - นี่คือฟังก์ชัน CMFCCListDemoDlg :: OnInitDialog () ที่สมบูรณ์
BOOL CMFCCListDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();
   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);             // Set big icon
   SetIcon(m_hIcon, FALSE);             // Set small icon
   // TODO: Add extra initialization here
   CList<double, double>m_list;
   //Add items to the list
   m_list.AddTail(100.75);
   m_list.AddTail(85.26);
   m_list.AddTail(95.78);
   m_list.AddTail(90.1);
   //iterate the list
   POSITION pos = m_list.GetHeadPosition();
   while (pos) {
      double nData = m_list.GetNext(pos);
      CString strVal;
      strVal.Format(L"%.f\n", nData);
      m_strText.Append(strVal);
   }
   UpdateData(FALSE);
 
   return TRUE; // return TRUE unless you set the focus to a control
}Step 3 - เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้
 
                เพิ่มรายการที่อยู่ตรงกลาง
ในการเพิ่มรายการตรงกลางรายการคุณสามารถใช้ฟังก์ชัน CList ::. InsertAfter () และ CList ::. InsertBefore () ต้องใช้พารามิเตอร์สองตัว - อันดับแรกตำแหน่ง (ที่สามารถเพิ่มได้) และค่าที่สอง
Step 1 - ให้เราใส่รายการใหม่ตามที่แสดงในโค้ดติดตาม
BOOL CMFCCListDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();
   
   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);             // Set big icon
   SetIcon(m_hIcon, FALSE);          // Set small icon
   // TODO: Add extra initialization here
   CList<double, double>m_list;
   //Add items to the list
   m_list.AddTail(100.75);
   m_list.AddTail(85.26);
   m_list.AddTail(95.78);
   m_list.AddTail(90.1);
   POSITION position = m_list.Find(85.26);
   m_list.InsertBefore(position, 200.0);
   m_list.InsertAfter(position, 300.0);
   //iterate the list
   POSITION pos = m_list.GetHeadPosition();
   while (pos) {
      double nData = m_list.GetNext(pos);
      CString strVal;
      strVal.Format(L"%.2f\n", nData);
      m_strText.Append(strVal);
   }
   UpdateData(FALSE);
   return TRUE; // return TRUE unless you set the focus to a control
}Step 2 - ตอนนี้คุณจะเห็นว่าเราดึงตำแหน่งของค่า 85.26 ก่อนแล้วจึงแทรกองค์ประกอบหนึ่งก่อนและอีกหนึ่งองค์ประกอบหลังจากค่านั้น
Step 3 - เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้
 
                อัปเดตมูลค่ารายการ
หากต้องการอัปเดตรายการที่กลางอาร์เรย์คุณสามารถใช้ฟังก์ชัน CArray ::. SetAt () ต้องใช้พารามิเตอร์สองตัว - อันดับแรกตำแหน่งและตัวที่สองคือค่า
ให้เราอัปเดต 300.00 ถึง 400 ในรายการดังที่แสดงในรหัสต่อไปนี้
BOOL CMFCCListDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();
   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);              // Set big icon
   SetIcon(m_hIcon, FALSE);            // Set small icon
   // TODO: Add extra initialization here
   CList<double, double>m_list;
   //Add items to the list
   m_list.AddTail(100.75);
   m_list.AddTail(85.26);
   m_list.AddTail(95.78);
   m_list.AddTail(90.1);
   POSITION position = m_list.Find(85.26);
   m_list.InsertBefore(position, 200.0);
   m_list.InsertAfter(position, 300.0);
   position = m_list.Find(300.00);
   m_list.SetAt(position, 400.00);
   //iterate the list
   POSITION pos = m_list.GetHeadPosition();
   while (pos) {
      double nData = m_list.GetNext(pos);
      CString strVal;
      strVal.Format(L"%.2f\n", nData);
      m_strText.Append(strVal);
   }
   UpdateData(FALSE);
   return TRUE; // return TRUE unless you set the focus to a control
}เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้ ตอนนี้คุณจะเห็นว่าค่า 300.00 ได้รับการอัปเดตเป็น 400.00
 
                ลบรายการ
หากต้องการลบรายการใด ๆ คุณสามารถใช้ฟังก์ชัน CList :: RemoveAt () ในการลบองค์ประกอบทั้งหมดออกจากรายการสามารถใช้ฟังก์ชัน CList :: RemoveAll () ได้
ให้เราลบองค์ประกอบซึ่งมี 95.78 เป็นค่าของมัน
BOOL CMFCCListDemoDlg::OnInitDialog() {
   CDialogEx::OnInitDialog();
   // Set the icon for this dialog. The framework does this automatically
   // when the application's main window is not a dialog
   SetIcon(m_hIcon, TRUE);              // Set big icon
   SetIcon(m_hIcon, FALSE);             // Set small icon
   // TODO: Add extra initialization here
   CList<double, double>m_list;
   //Add items to the list
   m_list.AddTail(100.75);
   m_list.AddTail(85.26);
   m_list.AddTail(95.78);
   m_list.AddTail(90.1);
   POSITION position = m_list.Find(85.26);
   m_list.InsertBefore(position, 200.0);
   m_list.InsertAfter(position, 300.0);
   
   position = m_list.Find(300.00);
   m_list.SetAt(position, 400.00);
   position = m_list.Find(95.78);
   m_list.RemoveAt(position);
   //iterate the list
   POSITION pos = m_list.GetHeadPosition();
   while (pos) {
      double nData = m_list.GetNext(pos);
      CString strVal;
      strVal.Format(L"%.2f\n", nData);
      m_strText.Append(strVal);
   }
   UpdateData(FALSE);
   
   return TRUE; // return TRUE unless you set the focus to a control
}เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นผลลัพธ์ต่อไปนี้ ตอนนี้คุณจะเห็นว่าค่า 95.78 ไม่ได้เป็นส่วนหนึ่งของรายการอีกต่อไป
