Buscar

Exercícios de Programação

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

Continue navegando