ANHANGUERA EDUCACIONAL
Faculdade Anhanguera de Valinhos – FAV
Curso Ciência da Computação
Disciplina Estruturas de Dados
Segunda Lista de Exercícios – Listas
Considere as seguintes declarações de tipos definidos pelo usuário:
/* Definição do tipo TNode. */
typedef struct TNode {
TData* pData;
struct TNode* next; } TNode;
/* Definição do tipo lista encadeada. */
typedef struct {
TNode* first; TNode* last; } TList;
Forneça o código fonte da seguinte lista de funções. Todas as funções devem testar seus parâmetros de entrada e valores de retorno. Considere também que o primeiro nó de uma lista qualquer é do tipo sentinela.
01. Escreva uma função que crie uma variável do tipo TNode com alocação dinâmica de memória. O campo pData também deve ser alocado dinamicamente utilizando a função dataCreate() definida na primeira lista de exercícios.
TNode* nodeCreate();
02. Escreva uma função que libere a memória alocada para uma variável do tipo TNode. O campo pData também deve ter a memória alocada liberada pelo uso da função dataFree() definida na primeira lista de exercícios.
void nodeFree(TNode* pNode);
03. Escreva uma função que crie uma lista encadeada usando a estratégia de uso de um nó sentinela.
TList* listCreate();
04. Escreva uma função que verifique se uma lista é vazia. int listIsEmpty(TList* pList);
05. Escreva uma função que libere a memória alocada para todos os elementos de uma lista. A função deve retornar o número de elementos liberados.
int listFree(TList* pList);
06. Escreva uma função que libere a memória alocada para todos os elementos de uma lista, inclusive o nó sentinela. A função deve retornar o número de elementos liberados (incluindo o nó sentinela).
int listFreeAll(TList* pList);
07. Escreva uma função que insira um elemento no final da lista. void listInsertEnd(TList* pList, TData* pData); 08. Escreva uma função que insira um elemento no início da lista.
void listInsertBegin(TList* pList, TData* pData);
09. Escreva uma função que insira um elemento após um determinado item da lista. A função deve receber um ponteiro para o item que antecede a posição de inserção (pNode) e um nó a ser inserido (pNodeIns). Verifique se pNode e pNodeIns são referências válidas. Teste os casos de pNode ser o primeiro ou o último elemento da lista.
void listInsertAfter(TNode* pNode, TNode* pNodeIns);
10. Escreva uma função que insira um item em uma lista de forma ordenada. O item deve ser inserido imediatamente antes do item da lista que possuir um valor de referência superior (ordenação crescente). Utilize qualquer campo do tipo TData como critério.
void listInsertSort(TList* pList, TData* pData, int idField, int* pos);
11. Escreva uma função que remova um item de uma lista tendo como parâmetro o endereço do respectivo nó (pNodeDel). A função deve devolver uma cópia do conteúdo em pData do nó removido. Verifique se pNodeDel possui informações válidas. Teste os casos de pNodeDel ser o primeiro ou o último elemento da lista.
int listRemove(TList* pList, TNode* pNodeDel, TData* pData); Dica: para a remoção do item representado por pNodeDel, é necessário conhecer o item que o antecede. Para isso, utilize a função listFindNode() conforme detalhamento do Exercício 17.
12. Escreva uma função que receba dois itens de uma lista encadeada, representados por pNodeA e pNodeB, e remova todos os itens existentes entre estes dois itens. Utilize a função listRemove() do Exercício 11.
int listRemoveBetween(TList* pList, TNode* pNodeA, TNode* pNodeB);
13. Escreva uma função que imprima o conteúdo (campos de TData) de uma lista encadeada que termina em NULL.
void listPrint(TList* pList);
14. Escreva uma função que, ao receber o endereço de uma lista encadeada, devolva o número de nós da lista.
int listCount(TList* pList);
15. Escreva uma função que receba dois itens de uma lista encadeada, representados por pNodeA e pNodeB, e calcule o número de itens existentes entre estes dois itens. Os ponteiros pNodeA e pNodeB não devem ser considerados no cálculo, ou seja, se forem adjacentes a função deve retornar zero.
16. Suponha que pList->first é o endereço do primeiro item de uma lista encadeada terminada comum uma referência igual a NULL. Pretende-se somar uma unidade (1) ao campo intValue de cada campo pData. O trecho de código abaixo resolve tal tarefa? Implemente e demonstre os resultados.
TNode* p;
for (p = pList->first; p->next != NULL; p = p->next)
(p->data->intValue)++;
17. Escreva uma função que faça uma busca por um determinado item da lista. Esta função recebe como parâmetro um ponteiro para o item (pNode) sendo procurado. A função deve devolver um ponteiro para o item que antecede o item sendo procurado, e um valor nulo caso a busca não tenha sucesso.
TNode* listFindNode(TList* pList, TNode* pNode);
18. Escreva uma função que faça uma busca pela lista recebendo como parâmetro a posição do item procurado. Os índices de posição têm início em zero e vão até o número de elementos menos uma unidade. A função deve devolver um ponteiro para o item sendo procurado. Caso a posição não seja válida, a função deve devolver NULL como indicação de insucesso da busca.
TNode* listFindNodePos(TList* pList, int pos);
19. Escreva uma função que faça uma busca pela lista recebendo como parâmetro uma referência (ponteiro) para uma variável TData. Utilize a função dataComp() do TAD TData com a possibilidade de determinar qual o campo deste tipo que será utilizado na comparação (idField). Crie um parâmetro por referência denominado pos para determinar a posição do nó encontrado. Em caso de falha na busca, faça pos igual a -1. A função deve devolver um ponteiro para o primeiro node encontrado.
TNode* listFindData(TList* pList, TData* pData, int idField, int* pos)
20. Escreva uma função que crie uma cópia uma lista. Deve-se criar uma nova lista e copiar cada para esta nova lista todos os itens da lista de origem (listSource). A função deve devolver um ponteiro para a lista cópia.
TList* listCopy(TList* pListSource);
21. Escreva uma função que concatene (emende) duas listas. A função deve alterar o parâmetro pListA para conter o resultado da concatenação (sem alocação de memória de seus nós). Ao final, o parâmetro pListB deve ser uma lista vazia.
void listConcat(TList* pListA, TList* pListB);
22. Aperfeiçoe a função listConcat() do Exercício 21 para que seja retornada uma nova lista resultante da concatenação de pListA e pListB com alocação de memória de seus nós. Utilize a função listCopy() do Exercício 20.
TList* listConcatCopy(TList* pListA, TList* pListB);
23. Escreva uma função que inverta a ordem dos itens de uma lista encadeada. A função deve devolver o número de elementos da lista.
int listInvert(TList* pList); Veja um exemplo a seguir.
24. Escreva uma função que intercale os elementos de duas listas. A função deve devolver uma nova lista resultante da intercalação, ou seja, a lista intercalada deve ser uma cópia das duas listas fornecidas como parâmetros. Utilize a função listCopy() do Exercício 20.
TList* listMerge(TList* pListA, TList* pListB); Veja um exemplo a seguir.
25. Escreva uma função que copie os itens de uma lista para um vetor. O vetor deve ser de ponteiros para o tipo TData e deve ser alocado dinamicamente. Para determinar o número de elementos da lista, utilize a função listCount() desenvolvida no Exercício 14.
TData** listToVector(TList* pList);
26. Escreva uma função que copie os elementos de um vetor para uma lista encadeada. O vetor e sua dimensão são fornecidos como parâmetros.
TList* listFromVector(TData* vectorData, int size);
27. Escreva uma função que escreva em arquivo o conteúdo de uma lista. int listSaveToFile(TList* pList, FILE* file);
Veja um exemplo do formato do arquivo a seguir.
//Arquivo de conteúdo de uma lista encadeada. //RG Nome # disciplinas
1 Adams 1 2 Black 2 3 Brown 4 4 Jackson 2
28. Escreva uma função que leia um arquivo conforme descrito no Exercício 27 e preencha uma lista.
TList* listLoadFromFile(FILE* file);
29. Escreva uma função que ordene os elementos de uma lista. A ordenação pode ser por qualquer um dos campos do tipo TData.
void listSort(TList* pList);
1 3 5 2 4 6 4 5 6 1 2 3 12 99 37 37 99 12
30. Escreva uma função que verifique se uma lista está ordenada em ordem crescente de seus valores. Utilize a função datacomp() com o parâmetro idField como recursos para a comparação das informações contidas em cada nó da lista.
int listCheckSort(TList* pList, int idField);
31. Escreva uma função que remova todos os itens que contenham a mesma informação
passada como um parâmetro pData. A função deve retornar o número de itens removidos da lista.
int listRemoveAllEqual(TList* pList, TData* pData, int idField);
Dica: utilize o algoritmo de busca apresentado na função listFindData(). Quando encontrar
um nó (node) que possua o mesmo valor dado por pData e idField, utilize a função listRemove() para retirar este nó da lista. A função listRemove() tem o seguinte cabeçalho: