• Nenhum resultado encontrado

EDLista2

N/A
N/A
Protected

Academic year: 2021

Share "EDLista2"

Copied!
5
0
0

Texto

(1)

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).

(2)

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.

(3)

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.

(4)

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

(5)

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:

Referências

Documentos relacionados

Conforme as Tabelas 2 e 3, os valores médios de resistên- cia e módulo de elasticidade a compressão paralela às fibras, a resistência ao fendilhamento, e a resistência ao

b) ACRESCENTE 36 unidades de milhar, 90 dezenas e 5 unidades ao número que corresponde à capacidade de pessoas desse estádio. Observe os calendários a seguir. a)

Nos vários casos das deposi- ções enquadráveis na Fase III, estas parecem fazer-se contiguamente à ocupação documentada; con- tudo, certo é que parecem localizar-se sob

156 da Lei das S.A., (i) os conselheiros Alejandro Daniel Laiño e Wilfred Theodoor Bruijn abstiveram-se de votar em relação à aprovação do contrato a ser celebrado com

num ritmo aproximado de uma flexão em cada 3 segundos, partindo da posição facial, mantendo o corpo em extensão, atingindo ou ultrapassando o nível de prestação definido (

E perceberás, então, como o Cristo fustigado na cruz, que os teus mais acirrados perseguidores são apenas crianças de curto entendimento e de

A Bíblia diz que “agora já não há condenação para os que estão em Cristo Jesus” A Bíblia diz que “agora já não há condenação para os que estão em Cristo Jesus”

Desta forma, além de retardar a oxidação lipídica, o preparado desenvolvido apresentou benefícios como estabilização da cor e manutenção das características sensoriais