Cod sursa(job #1699344)

Utilizator stoianmihailStoian Mihail stoianmihail Data 7 mai 2016 10:18:59
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <bits/stdc++.h>

#define NIL -1

struct nod {
  int val;
  nod *urm;
};

class list {
private:
  nod* l;

  int marime(nod* curr) {
    if (curr == NULL) {
      return 0;
    }
    return 1 + marime(curr -> urm);
  }

  void print(nod* curr) {
    if (curr == NULL) {
      fprintf(stdout, "\n");
      return;
    }
    fprintf(stdout, "%d, ", curr -> val);
    print(curr -> urm);
  }

public:
  list() {
    l = NULL;
  }

  /** Marimea listei. **/
  int size() {
    return marime(l);
  }

  /** Adauga valoarea "x" in lista. **/
  void insert(int x) {
    nod* nou = new nod;
    nou -> val = x;
    nou -> urm = l;
    l = nou;
  }

  /** Cauta valoarea "x" in lista. **/
  int find(int x) {
    if (size() == 0) {
      assert(0);
    }

    int pos = 0;
    nod* walk = l;

    while (walk != NULL && walk -> val != x) {
      walk = walk -> urm;
      pos++;
    }
    return walk == NULL ? NIL : pos;
  }

  /** Sterge valoarea "x" din lista. **/
  void erase(int x) {
    int pos = this -> find(x);

    if (pos != NIL) {
      if (size() == 1) {
        l = NULL;
      } else if (pos == 0) {
        l = l -> urm;
      } else {
        nod* prev = l;
        nod* curr = prev -> urm;
        while (curr -> val != x) {
          prev = curr;
          curr = prev -> urm;
        }
        prev -> urm = curr -> urm;
      }
    } else {
      assert(0);
    }
  }

  /** Sorteaza crescator lista. **/
  void sort() {
    if (size() <= 1) {
      return;
    }

    for (nod* walk = l; walk -> urm != NULL; walk = walk -> urm) {
      for(nod* curr = walk -> urm; curr != NULL; curr = curr -> urm) {
        if (curr -> val < walk -> val) {
          int tmp = curr -> val;
          curr -> val = walk -> val;
          walk -> val = tmp;
        }
      }
    }
  }

  /** Intoarce pe dos lista. **/
  void reverse() {
    if (size() <= 1) {
      return;
    }

    nod* tmp;
    nod* prev = NULL;
    nod* walk = l;

    while (walk -> urm != NULL) {
      tmp = walk -> urm;
      walk -> urm = prev;
      prev = walk;
      walk = tmp;
    }
    walk -> urm = prev;
    l = walk;
  }

  /** Afiseaza continutul listei. **/
  void write() {
    print(this -> l);
  }
};

int main(void) {
  list l;

  l.insert(1);
  l.insert(2);
  l.insert(3);
  l.insert(4);
  l.insert(5);
  l.insert(6);
  l.insert(7);

  l.write();
  fprintf(stderr, "%d\n", l.size());

  l.reverse();
  l.write();

  l.insert(10);
  l.write();

  l.reverse();
  l.write();

  l.erase(6);
  l.write();

  l.erase(10);
  l.write();

  l.sort();
  l.write();

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}