MC102MN

Introdução a Algoritmos e programação de computadores

Exercícios

  • Escrever uma função para copiar uma lista ligada
    struct no {
      int v;
      struct no *prox;
    };
    
    struct no *novo(int v, struct no *prox) {
      struct no *n = malloc(sizeof(struct no));
      n-> v = v;
      n-> prox = prox;
      return n;
    }
    
    struct no *copia_rec(struct no *n) {
      if (n == NULL) return NULL;
      return novo(n->v, copia_rec(n->prox));
    }
    
    struct no *copia_for(struct no *n) {
      struct no *copia, *c0;
      if (n == NULL) return NULL;
      copia = c0 = novo(n->v, NULL);
      for (n = n->prox; n != NULL; n = n->prox) {
        copia->prox = novo(n->v, NULL);
        copia = copia->prox;
      }
      return c0;
    }
    
    
  • Escrever uma função para inverter uma lista ligada criando uma cópia invertida
    struct no *rev_copia(struct no *n) {
      struct no *rev = NULL;
      for (; n != NULL; n = n->prox) {
        rev = novo(n->v, rev);
      }
      return rev;
    }
    
  • Escrever uma função para inverter uma lista ligada sem copiar (dica: use recursão)
    void rec_rev(struct no *n, struct no *prev) {
      if (n == NULL) return;
      rec_rev(n->prox, n);
      n->prox = prev;
    }
    
  • Escrever uma função para alocar e retornar uma cópia de uma string dada
    char *copia_str(char *str) {
      char *copia = malloc(sizeof(char)*strlen(str));
      strcpy(copia, str);
      return copia;
    }
    
  • Escrever uma função para inserir e remover elementos em uma lista ligada com ponteiro pro anterior
    void insere(struct no *ant, int v) {
      ant->prox = novo(v, ant->prox);
    }
    
    void remove(struct no *ant) {
      struct no *r = ant->prox;
      ant->prox = r->prox;
      free(r);
    }
    

Author: Alexandre Tachard Passos <alexandre.tp@gmail.com>

Date: 2010-11-16 15:24:41 BRST

HTML generated by org-mode 6.21b in emacs 23