class CLista { class CCelula { public Object item; public CCelula prox; public CCelula() { item = null; prox = null; } public CCelula(object ValorItem) { item = ValorItem; prox = null; } public CCelula(object valorItem, CCelula proxCelula) { item = valorItem; prox = proxCelula; } } private CCelula primeira, pos, ultima; private int Qtde = 0; public CLista() { primeira = new CCelula(); ultima = primeira; } public bool Vazia() { return primeira == ultima; } public void Insere(Object valorItem) { ultima.prox = new CCelula(valorItem); ultima = ultima.prox; Qtde += 1; } public void InsereComeco(Object valorItem) { primeira.prox = new CCelula(valorItem, primeira.prox); CCelula nova = primeira.prox; if (nova.prox == null) ultima = nova; Qtde++; } public void Imprime() { CCelula aux = primeira.prox; while (aux != null) { Console.WriteLine(aux.item); aux = aux.prox; } } public void ImprimeFor() {
Console.Write("[ "); for (CCelula aux = primeira.prox; aux != null; aux = aux.prox) Console.Write(aux.item.ToString() + " "); Console.WriteLine("] "); } public bool Contem(Object elemento) { bool achou = false; CCelula aux = primeira.prox; while (aux != null && !achou) { achou = aux.item.Equals(elemento); aux = aux.prox; } return achou; } public bool ContemFor(Object elemento) { bool achou = false; for (CCelula aux = primeira.prox; aux != null && !achou; aux = aux.prox) achou = aux.item.Equals(elemento); return achou; } public Object RemoveComeco() { if (primeira == ultima) throw new Exception("Erro ao remover: Lista vazia!"); CCelula aux = primeira.prox; primeira.prox = aux.prox; Qtde--; return aux.item; } public void RemoveComecoSimples() { if (primeira == ultima) throw new Exception("Erro ao remover: Lista vazia!"); primeira = primeira.prox; Qtde--; } public Object removeFim() { if (primeira == ultima) throw new Exception("Erro ao remover: Lista vazia!"); CCelula aux = primeira; while (aux.prox != ultima) aux = aux.prox; CCelula aux2 = aux.prox; ultima = aux; ultima.prox = null; Qtde--; return aux2.item; } public void vaiPrimeiro() { pos = primeira; }
public void vaiProximo() { if (pos != ultima) pos = pos.prox; } public void vaiUltimo() { pos = ultima; } public Object retornaPrimeiro() { if (!Vazia()) { pos = primeira.prox; return pos.item; } else return null; } public Object retornaAtual() { if ((pos != null) && (pos != primeira)) return pos.item; else return null; } public Object retornaProximo() { if (pos != ultima) { pos = pos.prox; return pos.item; } else return null; } public Object retornaUltimo() { if (!Vazia()) { pos = ultima; return pos.item; } else return null; } public int Quantidade() { return Qtde; } public int Count { get { return Qtde; } } public void InsereOrdenadoSimples(Object valorItem) { if (primeira == ultima) {
Insere(valorItem); } else { CCelula aux = primeira; while (aux.prox != null && (int)aux.prox.item < (int)valorItem) { aux = aux.prox; } if (aux.prox == null) { Insere(valorItem); } else { aux.prox = new CCelula(valorItem, aux.prox); Qtde++; } } } }
class CListaDup { class CCelulaDup { public Object item; public CCelulaDup ant, prox; public CCelulaDup() { item = null; ant = null; prox = null; } public CCelulaDup(object valorItem) { item = valorItem; ant = null; prox = null; } public CCelulaDup(object valorItem, CCelulaDup celulaAnt, CCelulaDup proxCelula) { item = valorItem; ant = celulaAnt; prox = proxCelula; } } private CCelulaDup primeira, pos, ultima; private int Qtde = 0; public CListaDup() { primeira = new CCelulaDup(null); pos = ultima = primeira; } public bool Vazia() { return primeira == ultima;
} public void InsereFim(Object valorItem) { ultima.prox = new CCelulaDup(valorItem, ultima, null); ultima = ultima.prox; Qtde++; } public void InsereComeco(Object valorItem) { if (primeira == ultima) InsereFim(valorItem); else { primeira.prox = new CCelulaDup(valorItem, primeira.prox, primeira.prox.prox); Qtde++; } } public bool InsereIndice(Object valorItem, int posicao) { return false; } public void RemoveComeco() { if (primeira == ultima) throw new Exception("Erro ao remover: Lista vazia!"); primeira = primeira.prox; primeira.ant = null; Qtde--; } public void RemoveFim() { if (primeira == ultima) throw new Exception("Erro ao remover: Lista vazia!"); ultima = ultima.ant; ultima.prox = null; Qtde--; } public void Imprime() { CCelulaDup aux = primeira.prox; while (aux != null) { Console.WriteLine(aux.item); aux = aux.prox; } } public void ImprimeFor() { if (primeira != ultima) for (CCelulaDup aux = primeira.prox; aux != null; aux = aux.prox) Console.WriteLine(aux.item); } public void ImprimeInv() { CCelulaDup aux = ultima; while (aux.ant != null)
{ Console.WriteLine(aux.item); aux = aux.ant; } } public void ImprimeInvFor() { if (primeira != ultima) for (CCelulaDup aux = ultima; aux.ant != null; aux = aux.ant) Console.WriteLine(aux.item); } public Object retornaPrimeiro() { pos = primeira.prox; return pos.item; } public void Primeiro() { pos = primeira; } public Object retornaAtual() { if (pos != null && pos != primeira) return pos.item; else return null; } public Object retornaProximo() { if (pos != ultima) { pos = pos.prox; return pos.item; } else return null; } public void Proximo() { if (pos != ultima) pos = pos.prox; } public Object retornaAnterior() { if (pos.ant != primeira) { pos = pos.ant; return pos.item; } else return null; } public void Anterior() { if (pos != primeira.ant) pos = pos.ant; } public Object retornaUltimo() { pos = ultima;
return pos.item; } public void Ultimo() { pos = ultima; } public int Quantidade() { return Qtde; } public int Count { get { return Qtde; } } public void InsereOrdenadoDupla(Object valorItem) { if (primeira == ultima) { primeira.prox = ultima = new CCelulaDup(valorItem); ultima.ant = primeira; } else { CCelulaDup aux = primeira.prox; while (aux != null && (int)aux.item < (int)valorItem) { aux = aux.prox; } if (aux == null) { InsereFim(valorItem); } else { aux.ant = new CCelulaDup(valorItem, aux.ant, aux); aux.ant.ant.prox = aux.ant; } } Qtde++; } public int Min() { CCelulaDup aux = primeira.prox; int min = (int)aux.item; while (aux != null) { if ((int)aux.item < min) { min = (int)aux.item; } aux = aux.prox; } return min; } public int Max()
{ CCelulaDup aux = primeira.prox; int max = (int)aux.item; while (aux != null) { if ((int)aux.item > max) { max = (int)aux.item; } aux = aux.prox; } return max; } public int IndexOf(Object valorItem) { CCelulaDup aux = primeira.prox; int indice = 1; while ((int)aux.item != (int)valorItem && aux.item != null) { aux = aux.prox; indice += 1; } if ((int)aux.item == (int)valorItem) { return indice; } else { return -1; } } }
class CFila { class CCelula { public Object item; public CCelula prox; public CCelula() { item = null; prox = null; } public CCelula(object valorItem) { item = valorItem; prox = null; } public CCelula(object valorItem, CCelula proxCelula) { item = valorItem; prox = proxCelula; } } private CCelula frente, tras; private int Qtde = 0; public CFila()
{ frente = new CCelula(null); tras = frente; } public bool Vazia() { return frente == tras; } public void Enfileira(Object valorItem) { tras.prox = new CCelula(valorItem); tras = tras.prox; Qtde++; } public Object Desenfileira() { Object item = null; if (!Vazia()) { frente = frente.prox; item = frente.item; Qtde--; } return item; } public Object Peek() { if (!Vazia()) return frente.prox.item; else return null; } public int Quantidade() { return Qtde; } public int Count { get { return Qtde; } } }
class CPilha { class CCelula { public Object item; public CCelula prox; public CCelula() { item = null; prox = null; } public CCelula(object valorItem) { item = valorItem;
prox = null; } public CCelula(object valorItem, CCelula proxCelula) { item = valorItem; prox = proxCelula; } } private CCelula topo = null; private int Qtde = 0; public CPilha() { } public bool Vazia() { return topo == null; } public void Empilha(Object valorItem) { CCelula aux = topo; topo = new CCelula(valorItem); topo.prox = aux; Qtde++; } public void Empilha2(Object valorItem) { topo = new CCelula(valorItem, topo); Qtde++; } public Object Desempilha() { Object item = null; if (!Vazia()) { item = topo.item; topo = topo.prox; Qtde--; } return item; } public Object Peek() { if (!Vazia()) return topo.item; else return null; } public void VaiProFundo(Object valorItem) { CCelula aux = topo; CCelula auxAnt = null; while (aux != null) { auxAnt = aux; aux = aux.prox; } auxAnt.prox = new CCelula(valorItem); } public int Quantidade() { return Qtde;
} public int Count { get { return Qtde; } } public CPilha InvertePilha(CPilha pilha) { CCelula aux = pilha.topo; CPilha pilhaInversa = new CPilha(); while (aux!=null) { CCelula aux1 = pilhaInversa.topo; pilhaInversa.topo = new CCelula(aux.item); pilhaInversa.topo.prox = aux1; pilhaInversa.Qtde++; aux = aux.prox; } return pilhaInversa; } }