MFC - Elenchi collegati
UN linked listè una struttura dati lineare in cui ogni elemento è un oggetto separato. Ogni elemento (lo chiameremo nodo) di un elenco comprende due elementi: i dati e un riferimento al nodo successivo. L'ultimo nodo ha un riferimento a null.
Un elenco collegato è una struttura dati costituita da un gruppo di nodi che insieme rappresentano una sequenza. È un modo per memorizzare i dati con strutture in modo che il programmatore possa creare automaticamente una nuova posizione in cui memorizzare i dati ogni volta che è necessario. Alcune delle sue caratteristiche salienti sono:
L'elenco collegato è una sequenza di collegamenti che contiene elementi.
Ogni collegamento contiene una connessione a un altro collegamento.
Ogni elemento nell'elenco è chiamato nodo.
Se l'elenco contiene almeno un nodo, un nuovo nodo viene posizionato come ultimo elemento dell'elenco.
Se l'elenco ha un solo nodo, quel nodo rappresenta il primo e l'ultimo elemento.
Esistono due tipi di elenco di collegamenti:
Elenco collegato singolarmente
Gli elenchi collegati singolarmente sono un tipo di struttura dati. In un elenco collegato singolarmente, ogni nodo nell'elenco memorizza il contenuto del nodo e un puntatore o riferimento al nodo successivo nell'elenco.
Elenco doppiamente collegato
Un elenco a doppio collegamento è una struttura dati collegata che consiste in un insieme di record collegati sequenzialmente chiamati nodi. Ogni nodo contiene due campi che sono riferimenti al nodo precedente e successivo nella sequenza di nodi.
Classe CList
MFC fornisce una classe CListche è un'implementazione di un elenco collegato di modelli e funziona perfettamente. Gli elenchi CList si comportano come elenchi a doppio collegamento. Una variabile di tipo POSITION è una chiave per l'elenco. Puoi utilizzare una variabile POSITION come iteratore per attraversare un elenco in sequenza e come segnalibro per contenere un posto.
Sr.No. | Nome e descrizione |
---|---|
1 | AddHead Aggiunge un elemento (o tutti gli elementi in un altro elenco) all'inizio dell'elenco (crea una nuova intestazione). |
2 | AddTail Aggiunge un elemento (o tutti gli elementi in un altro elenco) alla coda dell'elenco (crea una nuova coda). |
3 | Find Ottiene la posizione di un elemento specificato dal valore del puntatore. |
4 | FindIndex Ottiene la posizione di un elemento specificato da un indice in base zero. |
5 | GetAt Ottiene l'elemento in una determinata posizione. |
6 | GetCount Restituisce il numero di elementi in questo elenco. |
7 | GetHead Restituisce l'elemento head dell'elenco (non può essere vuoto). |
8 | GetHeadPosition Restituisce la posizione dell'elemento head della lista. |
9 | GetNext Ottiene l'elemento successivo per l'iterazione. |
10 | GetPrev Ottiene l'elemento precedente per l'iterazione. |
11 | GetSize Restituisce il numero di elementi in questo elenco. |
12 | GetTail Restituisce l'elemento di coda della lista (non può essere vuoto). |
13 | GetTailPosition Restituisce la posizione dell'elemento di coda della lista. |
14 | InsertAfter Inserisce un nuovo elemento dopo una data posizione. |
15 | InsertBefore Inserisce un nuovo elemento prima di una data posizione. |
16 | IsEmpty Verifica la condizione dell'elenco vuoto (nessun elemento). |
17 | RemoveAll Rimuove tutti gli elementi da questo elenco. |
18 | RemoveAt Rimuove un elemento da questo elenco, specificato dalla posizione. |
19 | RemoveHead Rimuove l'elemento dall'intestazione dell'elenco. |
20 | RemoveTail Rimuove l'elemento dalla coda dell'elenco. |
21 | SetAt Imposta l'elemento in una determinata posizione. |
Di seguito sono riportate le diverse operazioni sugli oggetti CList:
Crea oggetto CList
Per creare una raccolta di valori o oggetti CList, è necessario prima decidere il tipo di valori della raccolta. È possibile utilizzare uno dei tipi di dati primitivi esistenti come int, CString, double ecc. Come mostrato di seguito nel codice seguente.
CList<double, double>m_list;
Aggiungi elementi
Per aggiungere un elemento, puoi utilizzare la funzione CList :: AddTail (). Aggiunge un elemento alla fine dell'elenco. Per aggiungere un elemento all'inizio dell'elenco, è possibile utilizzare la funzione CList :: AddHead (). In OnInitDialog () CList, viene creato l'oggetto e vengono aggiunti quattro valori come illustrato nel codice seguente.
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);
Recupera elementi
Una variabile di tipo POSITION è una chiave per l'elenco. È possibile utilizzare una variabile POSITION come iteratore per attraversare un elenco in sequenza.
Step 1 - Per recuperare l'elemento dalla lista, possiamo usare il seguente codice che recupererà tutti i valori.
//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 - Ecco la funzione completa 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 - Quando il codice sopra è stato compilato ed eseguito, vedrai il seguente output.
Aggiungi elementi nel mezzo
Per aggiungere un elemento al centro dell'elenco, è possibile utilizzare le funzioni CList ::. InsertAfter () e CList ::. InsertBefore (). Ci vogliono due parametri: primo, la posizione (dove può essere aggiunto) e secondo, il valore.
Step 1 - Inseriamo un nuovo elemento come mostrato nel seguente codice.
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 - Ora puoi vedere che abbiamo prima recuperato la posizione del valore 85.26 e quindi inserito un elemento prima e un elemento dopo quel valore.
Step 3 - Quando il codice sopra è stato compilato ed eseguito, vedrai il seguente output.
Aggiorna valore articolo
Per aggiornare l'elemento al centro dell'array, è possibile utilizzare la funzione CArray ::. SetAt (). Ci vogliono due parametri: Primo, la posizione e Secondo, il valore.
Cerchiamo di aggiornare 300.00 a 400 nell'elenco come mostrato nel codice seguente.
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
}
Quando il codice precedente viene compilato ed eseguito, vedrai il seguente output. È ora possibile vedere che il valore di 300,00 viene aggiornato a 400,00.
Rimuovi elementi
Per rimuovere un elemento particolare, è possibile utilizzare la funzione CList :: RemoveAt (). Per rimuovere tutti gli elementi dall'elenco, è possibile utilizzare la funzione CList :: RemoveAll ().
Rimuoviamo l'elemento, che ha 95,78 come valore.
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
}
Quando il codice precedente viene compilato ed eseguito, vedrai il seguente output. Ora puoi vedere che il valore di 95,78 non fa più parte dell'elenco.