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 ไม่ได้เป็นส่วนหนึ่งของรายการอีกต่อไป