Baixe o app para aproveitar ainda mais
Prévia do material em texto
Lista de Exercícios de Programação Estruturada (Q1) Considerando as seguintes declarações de uma lista encadeada: struct lista{ int info; struct lista *prox; }; Escreva uma função em C que, dada uma lista l qualquer, retorne, numa lista de saída, os elementos ímpares e os elementos pares da lista l, na ordem em que os elementos aparecem em l. Ao final da execução desta função, a lista resultante terá todos os elementos da lista l (primeiro os ímpares, depois os pares, na ordem em que eles aparecem em l), e a lista l continuará contendo os seus elementos. O protótipo da função é o seguinte: TLista* i_p (TLista *l). (Q2) Considerando as seguintes declarações de uma lista encadeada: typedef struct lista{ int mat; char nome[81]; float cr; struct lista *prox; } TLista; Escreva uma função RECURSIVA em C que, dadas duas listas l1 e l2 encadeadas, verifique se l1 e l2 são iguais. As listas l1 e l2 devem permanecer inalteradas. Esta função retorna 1 se as listas são iguais e 0, caso contrário. O protótipo desta função é o seguinte: int igual (TLista *l1, TLista *l2). OBS: protótipo de função que pode ser útil: int strcmp (char *s, char *t). (Q3) Considere seguinte declaração de uma lista simplesmente encadeada: typedef struct lista{ int info; struct lista *prox; }TLista; Escreva uma função em C que, dada uma lista l qualquer, desloque uma vez os elementos de l, de acordo com n. Se n é ímpar, o elemento que está na última posição passa a ser o primeiro quando a lista é deslocada. Senão, o elemento que está na primeira posição passa a ser o último. O protótipo desta função é o seguinte: TLista* desloca (TLista* l, int n). (Q4) Considerando as seguintes declarações de lista encadeada: struct lista{ char *info; struct lista *prox; }; Escreva uma função em C que, dadas duas listas, faça a concatenação das mesmas ao final de l1. O protótipo da função é o seguinte: struct lista* junta_listas (struct lista* l1, struct lista* l2). (Q5) Considere a existência de um tipo que representa um aluno numa universidade hipotética: typedef struct aluno { char nome[81], mat[11]; float cr; struct aluno *prox; }TAluno; Escreva uma função que copie uma lista. A lista original deve permanecer inalterada. O protótipo da função é o seguinte: TAluno *copia (TAluno *l). OBS: Protótipos de funções que podem ser úteis: int strcmp (char *s, char *t); char* strcpy (char *s, char *t); (Q6) Considerando a seguinte declaração de uma lista encadeada: typedef struct lista{ int mat; char nome[81]; float cr; struct lista *prox; } Tlista; Escreva uma função em C que, dadas duas listas l1 e l2 encadeadas, verifique se l1 é a inversão de l2. As listas l1 e l2 devem permanecer inalteradas. Esta função retorna 1 se as listas estão invertidas e 0, caso contrário. O protótipo desta função é o seguinte: int Contrario (TLista *l1, TLista *l2). (Q7) Escreva uma função em C que remova todas as ocorrências de um elemento numa lista. Seu protótipo O protótipo desta função é o seguinte: TLista* rto (TLista* l, int elem). (Q8) Refaça as operações supracitadas com as listas duplamente encadeada (TLDE) e circular (TLSEC). (Q9) Considere a existência de um tipo abstrato pilha de números inteiros, cuja a interface é definida no arquivo pilha.h da seguinte forma: typedef struct pilha TPilha; TPilha * inicializa (void); void push (TPilha *p, int elem); int pop (TPilha *p); void libera (TPilha *p); int vazia (TPilha *p); usando somente estas operações, escreva: (a) uma função que, dada uma pilha f, retorne uma nova pilha, com todos os elementos de f, porém invertida em relação à f. Não é possível alterar a ordem dos elementos da pilha de entrada. A função deve obedecer o seguinte protótipo: TPilha* inv_P (TPilha *f); (b) escreva uma função que receba uma pilha e retire todos os elementos pares desta pilha. A função deve obedecer o seguinte protótipo: void retira_pares (TPilha *p); (c) uma função que, dada uma pilha f, retorne uma nova pilha contendo os elementos pares de f, e modifique a original (f) para que ela possua somente os elementos ímpares, respeitando a ordem de entrada em f. A função deve obedecer o seguinte protótipo: TPilha* sep_p (TPilha *f); (d) escreva uma função que, dadas duas pilhas f1 e f2, retorne uma pilha, contendo todos os elementos de f1 seguidos pelos elementos de f2, e obedecendo a ordem de entrada dos inteiros nas pilhas de entrada. Além disso, f1 e f2 devem permanecer inalteradas. A função deve obedecer ao seguinte protótipo: TPilha* Junta_p (TPilha *f1, TPilha *f2); (e) implemente uma função que receba três pilhas, f, impares e pares, e separe todos os valores guardados em f de tal forma que os valores pares são colocados na pares e os valores ímpares na impares. Ao final da execução desta função, f permanecerá com todos os seus elementos. O protótipo desta função é o seguinte: void separa_pilhas(TPilha * f, TPilha *par, TPilha * impar).
Compartilhar