Lista simplesmente encadeada
1. Critique a função abaixo. Ao receber uma lista encadeada e um inteiro x, ela promete devolver o endereço de uma célula com conteúdo x. Se tal célula não existe, promete devolver NULL. celula *busca (int x, celula *ini) { int achou; celula *p; achou = 0; p = ini->prox; while (p != NULL && !achou) { if (p->conteudo == x) achou = 1; p = p->prox; } if (achou) return p; else return NULL; }
2. Escreva uma versão da função busca para listas simplesmente encadeada.
3. Escreva uma função que encontre uma célula de conteúdo mínimo.
4. Escreva uma função que faça um busca em uma lista crescente.
5. Verificação do tamanho. Compile e execute o seguinte programa: typedef struc cel celula; struct cel { int conteudo; celula *prox; }; int main (void) { printf ("sizeof (celula) = %d\n", sizeof (celula)); return 0; }
6. Escreva uma função que copie um vetor para uma lista encadeada.
7. Escreva uma função que copie uma lista encadeada para um vetor.
8. Escreva uma função que faça uma cópia de uma lista dada.
9. Escreva uma função que concatena duas listas encadeadas (isto é, "amarra" a segunda no fim da primeira).
10. Escreva uma função que conta o número de células de uma lista encadeada.
11. Escreva uma função que remove a k-ésima célula de uma lista encadeada. Escreva uma função que insere na lista uma nova célula com conteúdo x entre a k-ésima e a k+1-ésima células.
12. Escreva uma função que verifica se duas listas dadas são iguais, ou melhor, se têm o mesmo conteúdo.
13. Escreva uma função que desaloca todos os nós de uma lista encadeada. 14. Escreva uma função que inverte a ordem das células de uma lista encadeada (a primeira passa a ser a última, a segunda passa a ser a penúltima etc.). Faça isso sem usar espaço auxiliar; apenas altere os ponteiros. Dê duas soluções: uma iterativa e uma recursiva.