Estruturas Auto-referenciadas

Exercício 1

Implemente em C um programa que leia uma sequência de inteiros terminada por 0 e imprima a mesma sequência, mas invertida. O programa deve ser implementado usando listas ligadas. A lista será representada pela seguinte estrutura:

    typedef struct stru_node {
        struct stru_node *next;
        int v;
    } node;

e deverá ser manipulada pelas seguintes funções:

    /* remove the first element of the list and return the new head */
    node * pop(node * head);
    /* add integer e as the first element of the list and return the new head */
    node * push(node * head, int e);
    /* frees all memory associated with the list and returns NULL */
    node * destroy(node * head);
    /* print the elements of the integers in the list, one per line */
    void print(node * head);

Exercício 2

Implemente em C um programa que leia uma linha de caracteres e imprime yes se a linha for um palíndromo e imprima no no caso contrário.

Dica: Reutilize a lista ligada do ex01. Adicionalmente implemente as funções:

    int is_eq(node *h1, node *h2);   /* compara duas listas */
    node * rev(node * head);         /* devolve uma nova lista que corresponda a lista dada invertida */

Exercício 3

Implemente em C um programa que leia uma sequência de strings sem espaços terminada por a string "x" e imprima a mesma sequência, mas invertida. O programa deve ser implementado usando listas ligadas. Podem assumir que cada string tem no máximo 1000 caracteres. Entretanto, deve-se só alocar memória suficiente para as strings dadas.

A lista será representada pela seguinte estrutura:

    typedef struct stru_node {
        struct stru_node *next;
        char *v;
    } node;

e deverá ser manipulada pelas seguintes funções definidas no exercício 1:

    /* remove the first element of the list and return the new head */
    node * pop(node *head);
    /* add string e as the first element of the list and return the new head */
    node * push(node *head, const char *e);
    /* frees all memory associated with the list and returns NULL */
    node * destroy(node *head);
    /* print the elements of the integers in the list, one per line */
    void print(node *head);

Nota: Não se esquecam, no pop, de libertar as strings alocadas no push.

Exercício 4

Implemente em C um programa que leia uma linha de caracteres e guarda os caracteres numa lista duplamente ligada. Imprima yes se a linha for um palíndromo e imprima no no caso contrário.

A lista será representada pelas estrutura seguintes:

    typedef struct str_node  {
        struct str_node *next, *previous;
        char c;
    } node;

    typedef struct  {
        struct str_node *head, *last;
    } list;

e deverá ser manipulada pelas seguintes funções:

    list* mk_list();                 /* cria nova lista vazia */
    void  free_list(list *l);        /* liberta toda a memoria associada a lista */
    void  add_last(list *l, char c); /* adiciona o char c como o ultimo elemento da lista */
    int   is_paly(const list *ls);   /* calcula se a dada lista e um palindromo */

Exercício 5

Implemente uma calculadora para Notação polaca (também denominada notação de prefixo) inversa (https://en.wikipedia.org/wiki/Reverse_Polish_notation), onde o operador segue os operandos. Por exemplo, (3+4) é 3 4 +; (3+4) * 5 é 3 4 + 5 *. A expressão é dada no standard input como uma sequência de palavras. O programa deverá imprimir o resultado numa linha separada.

Dica: Os resultados intermédios podem ser guardados numa pilha.

Dica: A função atoi pode ser usada para converter uma string no int.