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.