MFC - połączone listy
ZA linked listto liniowa struktura danych, w której każdy element jest oddzielnym obiektem. Każdy element (nazwiemy go węzłem) listy zawiera dwa elementy - dane i odniesienie do następnego węzła. Ostatni węzeł ma odniesienie do null.
Lista połączona to struktura danych składająca się z grupy węzłów, które razem reprezentują sekwencję. Jest to sposób na przechowywanie danych ze strukturami, aby programista mógł automatycznie tworzyć nowe miejsce do przechowywania danych, gdy zajdzie taka potrzeba. Niektóre z jego najważniejszych cech to:
- Lista połączona to sekwencja łączy, która zawiera elementy. 
- Każde łącze zawiera połączenie z innym łączem. 
- Każda pozycja na liście nazywana jest węzłem. 
- Jeśli lista zawiera przynajmniej jeden węzeł, nowy węzeł jest umieszczany jako ostatni element na liście. 
- Jeśli lista ma tylko jeden węzeł, ten węzeł reprezentuje pierwszy i ostatni element. 
Istnieją dwa rodzaje list linków -
Lista pojedynczo połączona
Listy połączone pojedynczo to rodzaj struktury danych. Na liście pojedynczo połączonej każdy węzeł na liście przechowuje zawartość węzła i wskaźnik lub odniesienie do następnego węzła na liście.
 
                Lista podwójnie połączona
Lista podwójnie połączona to połączona struktura danych, która składa się z zestawu kolejno połączonych rekordów zwanych węzłami. Każdy węzeł zawiera dwie zmienne, które są odniesieniami do poprzedniego i następnego węzła w sekwencji węzłów.
 
                CList Class
MFC udostępnia klasę CListktóra jest implementacją listy połączonej z szablonem i działa doskonale. Listy CList zachowują się jak listy podwójnie połączone. Kluczem do listy jest zmienna typu POSITION. Możesz użyć zmiennej POSITION jako iteratora do przechodzenia przez listę sekwencyjnie i jako zakładki do przechowywania miejsca.
| Sr.No. | Nazwa i opis | 
|---|---|
| 1 | AddHead Dodaje element (lub wszystkie elementy z innej listy) na początek listy (tworzy nowy nagłówek). | 
| 2 | AddTail Dodaje element (lub wszystkie elementy z innej listy) do końca listy (tworzy nowy koniec). | 
| 3 | Find Pobiera pozycję elementu określonego przez wartość wskaźnika. | 
| 4 | FindIndex Pobiera pozycję elementu określonego przez indeks liczony od zera. | 
| 5 | GetAt Pobiera element z danej pozycji. | 
| 6 | GetCount Zwraca liczbę elementów na tej liście. | 
| 7 | GetHead Zwraca główny element listy (nie może być pusty). | 
| 8 | GetHeadPosition Zwraca pozycję elementu głównego listy. | 
| 9 | GetNext Pobiera następny element do iteracji. | 
| 10 | GetPrev Pobiera poprzedni element do iteracji. | 
| 11 | GetSize Zwraca liczbę elementów na tej liście. | 
| 12 | GetTail Zwraca element końcowy listy (nie może być pusty). | 
| 13 | GetTailPosition Zwraca pozycję elementu końcowego listy. | 
| 14 | InsertAfter Wstawia nowy element po podanej pozycji. | 
| 15 | InsertBefore Wstawia nowy element przed podaną pozycją. | 
| 16 | IsEmpty Testy dla warunku pustej listy (brak elementów). | 
| 17 | RemoveAll Usuwa wszystkie elementy z tej listy. | 
| 18 | RemoveAt Usuwa element z tej listy, określony przez pozycję. | 
| 19 | RemoveHead Usuwa element z nagłówka listy. | 
| 20 | RemoveTail Usuwa element z końca listy. | 
| 21 | SetAt Ustawia element na określonej pozycji. | 
Poniżej przedstawiono różne operacje na obiektach CList -
Utwórz obiekt CList
Aby utworzyć kolekcję wartości lub obiektów CList, należy najpierw zdecydować o typie wartości kolekcji. Możesz użyć jednego z istniejących pierwotnych typów danych, takich jak int, CString, double itp., Jak pokazano poniżej w poniższym kodzie.
CList<double, double>m_list;Dodaj przedmioty
Aby dodać element, możesz użyć funkcji CList :: AddTail (). Dodaje element na końcu listy. Aby dodać element na początku listy, możesz użyć funkcji CList :: AddHead (). W OnInitDialog () CList tworzony jest obiekt i dodawane są cztery wartości, jak pokazano w poniższym kodzie.
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);Odzyskaj przedmioty
Kluczem do listy jest zmienna typu POSITION. Możesz użyć zmiennej POSITION jako iteratora do sekwencyjnego przechodzenia przez listę.
Step 1 - Aby pobrać element z listy, możemy użyć następującego kodu, który pobierze wszystkie wartości.
//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 - Oto pełna funkcja 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 - Gdy powyższy kod zostanie skompilowany i wykonany, zobaczysz następujące dane wyjściowe.
 
                Dodaj elementy w środku
Aby dodać element w środku listy, możesz użyć funkcji CList ::. InsertAfter () i CList ::. InsertBefore (). Zajmuje dwa parametry - po pierwsze położenie (gdzie można je dodać) i po drugie, wartość.
Step 1 - Wstawmy nowy element, jak pokazano w poniższym kodzie.
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 - Teraz widać, że najpierw pobraliśmy pozycję o wartości 85,26, a następnie wstawiliśmy jeden element przed i jeden po tej wartości.
Step 3 - Gdy powyższy kod zostanie skompilowany i wykonany, zobaczysz następujące dane wyjściowe.
 
                Zaktualizuj wartość przedmiotu
Aby zaktualizować element w środku tablicy, możesz użyć funkcji CArray ::. SetAt (). Potrzeba dwóch parametrów - po pierwsze, pozycji i po drugie, wartości.
Zaktualizujmy 300,00 do 400 na liście, jak pokazano w poniższym kodzie.
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
}Gdy powyższy kod zostanie skompilowany i wykonany, zobaczysz następujące dane wyjściowe. Teraz widać, że wartość 300,00 jest aktualizowana do 400,00.
 
                Usuń elementy
Aby usunąć konkretny element, możesz użyć funkcji CList :: RemoveAt (). Aby usunąć cały element z listy, można użyć funkcji CList :: RemoveAll ().
Usuńmy element, który ma wartość 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
}Gdy powyższy kod zostanie skompilowany i wykonany, zobaczysz następujące dane wyjściowe. Teraz widać, że wartość 95,78 nie jest już częścią listy.
