MFC - Listas Vinculadas
UMA linked listé uma estrutura de dados linear onde cada elemento é um objeto separado. Cada elemento (vamos chamá-lo de nó) de uma lista compreende dois itens - os dados e uma referência ao próximo nó. O último nó tem uma referência a nulo.
Uma lista ligada é uma estrutura de dados que consiste em um grupo de nós que juntos representam uma sequência. É uma forma de armazenar dados com estruturas para que o programador possa criar automaticamente um novo local para armazenar dados sempre que necessário. Algumas de suas características mais importantes são -
Lista vinculada é uma sequência de links que contém itens.
Cada link contém uma conexão com outro link.
Cada item da lista é denominado nó.
Se a lista contiver pelo menos um nó, um novo nó será posicionado como o último elemento da lista.
Se a lista tiver apenas um nó, esse nó representará o primeiro e o último item.
Existem dois tipos de lista de links -
Lista vinculada individualmente
As Listas Ligadas Individualmente são um tipo de estrutura de dados. Em uma lista vinculada individualmente, cada nó na lista armazena o conteúdo do nó e um ponteiro ou referência para o próximo nó na lista.
Lista duplamente vinculada
Uma lista duplamente vinculada é uma estrutura de dados vinculada que consiste em um conjunto de registros vinculados sequencialmente chamados de nós. Cada nó contém dois campos que são referências ao nó anterior e ao próximo na sequência de nós.
Classe CList
MFC fornece uma classe CListque é uma implementação de lista vinculada de modelo e funciona perfeitamente. As listas CList se comportam como listas duplamente vinculadas. Uma variável do tipo POSITION é uma chave para a lista. Você pode usar uma variável POSITION como um iterador para percorrer uma lista sequencialmente e como um marcador para manter um lugar.
Sr. Não. | Nome e Descrição |
---|---|
1 | AddHead Adiciona um elemento (ou todos os elementos em outra lista) ao cabeçalho da lista (cria um novo cabeçalho). |
2 | AddTail Adiciona um elemento (ou todos os elementos em outra lista) ao final da lista (cria um novo final). |
3 | Find Obtém a posição de um elemento especificado pelo valor do ponteiro. |
4 | FindIndex Obtém a posição de um elemento especificado por um índice baseado em zero. |
5 | GetAt Obtém o elemento em uma determinada posição. |
6 | GetCount Retorna o número de elementos nesta lista. |
7 | GetHead Retorna o elemento principal da lista (não pode estar vazio). |
8 | GetHeadPosition Retorna a posição do elemento principal da lista. |
9 | GetNext Obtém o próximo elemento para iteração. |
10 | GetPrev Obtém o elemento anterior para iteração. |
11 | GetSize Retorna o número de elementos nesta lista. |
12 | GetTail Retorna o elemento final da lista (não pode estar vazio). |
13 | GetTailPosition Retorna a posição do elemento final da lista. |
14 | InsertAfter Insere um novo elemento após uma determinada posição. |
15 | InsertBefore Insere um novo elemento antes de uma determinada posição. |
16 | IsEmpty Testa a condição de lista vazia (sem elementos). |
17 | RemoveAll Remove todos os elementos desta lista. |
18 | RemoveAt Remove um elemento desta lista, especificado pela posição. |
19 | RemoveHead Remove o elemento do topo da lista. |
20 | RemoveTail Remove o elemento do final da lista. |
21 | SetAt Define o elemento em uma determinada posição. |
A seguir estão as diferentes operações em objetos CList -
Criar objeto CList
Para criar uma coleção de valores ou objetos CList, você deve primeiro decidir o tipo de valores da coleção. Você pode usar um dos tipos de dados primitivos existentes, como int, CString, double etc., conforme mostrado abaixo no código a seguir.
CList<double, double>m_list;
Adicionar itens
Para adicionar um item, você pode usar a função CList :: AddTail (). Ele adiciona um item no final da lista. Para adicionar um elemento no início da lista, você pode usar a função CList :: AddHead (). Na CList OnInitDialog (), o objeto é criado e quatro valores são adicionados, conforme mostrado no código a seguir.
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);
Recuperar Itens
Uma variável do tipo POSITION é uma chave para a lista. Você pode usar uma variável POSITION como um iterador para percorrer uma lista sequencialmente.
Step 1 - Para recuperar o elemento da lista, podemos usar o seguinte código que recuperará todos os valores.
//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 - Aqui está a função CMFCCListDemoDlg :: OnInitDialog () completa.
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 o código acima for compilado e executado, você verá a seguinte saída.
Adicionar itens no meio
Para adicionar um item no meio da lista, você pode usar as funções CList ::. InsertAfter () e CList ::. InsertBefore (). Leva dois parâmetros - primeiro, a posição (onde pode ser adicionado) e segundo, o valor.
Step 1 - Vamos inserir um novo item conforme mostrado no código a seguir.
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 - Agora você pode ver que primeiro recuperamos a posição do valor 85,26 e, em seguida, inserimos um elemento antes e um elemento depois desse valor.
Step 3 - Quando o código acima for compilado e executado, você verá a seguinte saída.
Atualizar valor do item
Para atualizar o item no meio do array, você pode usar a função CArray ::. SetAt (). São necessários dois parâmetros - primeiro, a posição e, segundo, o valor.
Vamos atualizar 300,00 para 400 na lista, conforme mostrado no código a seguir.
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 o código acima for compilado e executado, você verá a seguinte saída. Agora você pode ver que o valor de 300,00 foi atualizado para 400,00.
Remover itens
Para remover qualquer item específico, você pode usar a função CList :: RemoveAt (). Para remover todos os elementos da lista, a função CList :: RemoveAll () pode ser usada.
Vamos remover o elemento, que tem 95,78 como valor.
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 o código acima for compilado e executado, você verá a seguinte saída. Agora você pode ver que o valor de 95,78 não faz mais parte da lista.