You are on page 1of 30

AED Algoritmos e Estruturas de Dados LEEC/LEE - 2005/2006

Estrutura de Dados e Operações

Dados e Algoritmos: o que são?
• Dados
– Conjunto de valores, que representam elementos informativos (ex: o valor inteiro 74 pode indicar o peso de uma pessoa, o ano da revolução do 25 de Abril, ...) – Os valores podem estar armazenados de forma permanente - constantes (ex:π), ou podem ser substituídos em localizações – variáveis (ex: saldo da conta bancária, luz do semáforo, ...)

• Algoritmo
– Sequência de instruções que, a partir de vários dados (previamente armazenados, ou indicados por entidades externas ao programa como utilizadores ou ficheiros), calcula novos dados. Ex: cálculo do maior divisor comum, determinação do valor das compras num supermercado, ...
AED (IST/DEEC) 2

Tipologia de dados [1]
• Simples
– Inteiros (int Index); – Reais (float Stock, double Income); – Caracteres (char Answer)

• Estruturados
– Tabelas (‘‘array’’) - estáticas ou dinâmicas: vários elementos do mesmo tipo
• Unidimensionais (Array1[N]) • Multidimensionais (Array2[N1]...[Nk] ou Array2[N1,...,Nk]) • Acervos (Heap[N])

– Estruturas (‘‘struct’’): elementos de tipos possivelmente distintos
AED (IST/DEEC) 3

Tipologia de dados [2]
• Dinâmicos: volume dos dados pode ser modificado durante a execução do algoritmo
– Listas
• Lista simples • Pilha (“stack”), Fila (“queue”), Fila Prioritária (“priority queue”) • Duplamente ligadas, anéis

– Árvores – Grafos

• Composições
– listas de listas, listas de estruturas, lista de tabelas, tabelas de listas, ...

AED (IST/DEEC)

4

Que estrutura de dados escolher?
• A escolha da forma como se armazenam os dados depende de
– Operações que sejam mais frequentes no algoritmo a implementar:
• Quando o acesso e modificação são a base do algoritmo, as tabelas deverão ser escolhidas • Quando a inserção e remoção são mais frequentes
– Usar listas simples, se estas operações ocorrem sempre no início (“STACK”) – Usar listas simples com ponteiro adicional para o fim da lista, se a inserção se fizer no fim e a remoção no início (“QUEUE”)

– Previsibilidade sobre a memória necessária:
• O uso de tabelas pressupõe que se saiba que memória é suficiente, ou que se defina um valor suficientemente alto que comporte todas as instâncias de interesse. • Quando tal valor é incomportável, o único recurso razoável consiste em gerir a memória dinamicamente.

AED (IST/DEEC)

5

Tipos básicos [1]
• Def: Um tipo de dados define os valores e as operações possíveis sobre esses valores.
– Inteiros
• int (valores dependem da máquina: 16 bits entre -32768 e 32767, 32 bits entre -215 e 215-1) : o mais usado • short (2 Bytes entre -32768 e 32767) • long (32 bits) Os literais podem ter base decimal (ex: 27, -15), octal (iniciados por 0, ex: 031) ou hexadecimal (iniciados por 0x ou 0X, ex: 0x1f5, 0XFF).

AED (IST/DEEC)

6

'}') – caracteres especiais formados por ‘\letra’ '\n' : mudança de linha (``newline´´) '\t' : tabulador '\\' : barra à esquerda (``backslash´´) – código ASCII em base octal '\0' : carácter nulo (``NULL´´) AED (IST/DEEC) 8 . 9.3E-2.5) ou – base e expoente.Tipos básicos [2] – Reais • double (precisão dupla) : o mais usado • float (precisão simples) Os literais possuem duas partes – inteira e fraccionária. 4E3). AED (IST/DEEC) 7 Tipos básicos [3] – Caracteres • char Os literais são delimitados por “plicas” – carácter impresso (ex: 'a'. separadas por ponto (ex: -27. separadas por E (ex: 2. – Nota: Os inteiros e reais podem conter apenas valores positivos. se o tipo contiver qualificador unsigned.3.

tipo par2.Conversão de tipos • Conversão implícita: int Numb. num ficheiro «header» (. Price = ((float) Numb1) / Numb2.h> /*biblioteca*/ #include “ficheiro.. O operador / converte Numb para real antes de efectuar a divisão. float Inflation. na forma tipo-retorno nome(tipo par1. • Conversão explícita (‘‘casting’’): int Numb1. é dividida em dois ficheiros: • A interface. • A implementação. no próprio directório*/ AED (IST/DEEC) 10 .. no C.5.c»: – Código das funções Cada utilização do tipo é feita num ficheiro «cliente» onde o header é incluído: #include <stdio.. float Price.). – Protótipos das funções usadas para manipular objectos deste tipo.h): – Definição do tipo.h” /*declarações de projecto. Inflation = Numb / 3. AED (IST/DEEC) 9 Organização em C das definições de tipos A definição dos tipos. num ficheiro com extensão «. Numb2.

. pt.x – pB.c: #include <math.y. Pt2 = create_point(3. } Point.7. Ficheiro Point. Number y. } AED (IST/DEEC) 12 .h> #include “Point. } Point create_point(Number x.. Number distance(Point pA.h” main () { Point Pt1.x = x.. Pt2.y = y.x. return pt. Point pB).0). return(sqrt(dx*dx + dy*dy)). Pt2). 2. Point create_point(Number x. } 11 Ficheiro Point.y – pB.5). Pt1 = create_point(1.h” typedef struct { Number x. Point pB) { Number dx = pA.h” Number distance(Point pA. pt. Number y).h : typedef float Number. Number dy = pA. Numb = distance(Pt1. 4.0. Number y) { Point pt.Definição de tipo: exemplo [1] Ficheiro Num. Number Numb. AED (IST/DEEC) Definição de tipo: exemplo [2] Ficheiro principal: #include “Point.h : #include “Num.

• &N1 é o endereço de memória onde o valor de “N1” é armazenado. ou do primeiro inteiro de uma tabela de inteiros.Ponteiros [1] • A linguagem C permite aceder a posições de memória específicas por meio de ponteiros. • Reserva uma posição de memória. N1 3 &N1 N1 3 &N1 AED (IST/DEEC) 14 . • Para cada um dos tipos básicos é possível criar ponteiros. • Exemplo: int N1. de nome “N2”. onde se poderá colocar o endereço de um inteiro. N1 ?? N1 = 3. AED (IST/DEEC) 13 Ponteiros [2] • Exemplo (continuação): int N1. • Reserva uma posição de memória onde a variável “N1” irá morar. int *N2.

N2 &N1 N1 3 A alocação de memória ocorre em qualquer sítio. AED (IST/DEEC) 16 .Ponteiros [3] • Exemplo (continuação): int *N2. + adiciona espaço de cada célula printf(“%d”. N2 ?? N2=&N1. N2 &N2[0] &N2[0] AED (IST/DEEC) ?? ?? ?? 15 Ponteiros [4] • Exemplo (continuação) N2[1] = 5. *N2+1). •5 • porque N2+1 é &N2[1]: quando a variável for de tipo ponteiro para tabela. podendo ser acima ou abaixo do local onde “mora” o ponteiro. &N1 N2 = (int *) malloc(3*sizeof(int)). • ??+1 • porque *N2 é o conteúdo de N2[0] que contém ??. N2 &N2[0] &N2[1] ?? 5 ?? printf(“%d”. *(N2+1)).

Síntese da Aula 1 de Tipologia e Operações • Introdução aos Dados e Algoritmos • Listagem de tipos de dados mais vulgares e critérios de escolha • Tipos básicos. – Sintaxe: após a declaração base inserir uma das opções • {[Dimensão]}+ – Restrições: • as dimensões são inteiros positivos. /* tabela de 4 inteiros */ char Tab2[3][2]. conversão de tipos • Organização em C das definições de tipos • Ponteiros AED (IST/DEEC) 17 Tabelas [1] • Def: Uma tabela (“array”) é uma série de localizações. /* tabela de char 3 por 2 */ char Tab3[5][14][2]. /* tabela de char 5 por 14 por 2 */ Tab1[0] Tab1[1] Tab1[2] Tab1[3] AED (IST/DEEC) 18 . acedidas por índices numéricos a partir de 0. todas do mesmo tipo. ex: int Tab1[4].

'f'} }. ex: Tab1[0]=0. /*correcto*/ Tab1[4]=-25. Idx2++) Tab2[Idx1][Idx2] = 'a'+2*Idx1+Idx2.1.2. /*correcto*/ É responsabilidade do programador garantir que os índices estão dentro dos limites!!! AED (IST/DEEC) 19 Tabelas [3] As tabelas são inicializadas por ciclos de varrimento ou lista de valores delimitada por { }. Idx++) Tab1[Idx]=Idx.'b'}. /*incorrecto: limite máximo é 3 */ Tab2[2][0]='?'.'d'}. Idx1++) for (Idx2=0.Tabelas [2] • Os índices são valores entre 0 e largura-1. – Tab1 = {0. Idx<4. AED (IST/DEEC) 20 . /* inicialização de Tab2 */ – for(Idx1=0. para cada dimensão. {'e'. ex: /* tabela Tab1 inicializada com inteiros */ – for(Idx=0. Idx1<3.3}. – Tab2 = { {'a'. Idx2<2. {'c'.

int *Space = (int *) malloc(Numb * sizeof (int)). int *Ptr. “Memória insuficiente. *Ptr). Array[2] = 3. escrevem 3 no terminal.Tabelas [4] Em C. char *pArgv[]) { int Numb = atoi(pArgv[1]).\n”). Ptr = Array + 2. printf(“%d\n”. existe uma correspondência entre tabelas e ponteiros: *Array ⇔ Array[0] *(Array + 1) ⇔ Array[1] *(Array + Idx) ⇔ Array[Idx] As instruções seguintes: int Array[10]. if (Space == NULL) fprintf(stderr. AED (IST/DEEC) 21 Tabelas [5] Quando o tamanho da tabela é conhecido apenas na altura da execução deve-se alocar a memória de maneira dinâmica (ver também acetato 15): #include <stdlib.h> #include <stdio.h> main (int pArgc. … AED (IST/DEEC) 22 .

Declara um vector de 10 elementos. for (Idx=0. int pColumns) { int Idx. /* mat é um apontador para uma tabela que contém float ! */ mat = (float **)malloc(pRows * sizeof (float *)). Idx<pRows. AED (IST/DEEC) 24 . ?? mat mat = (float **) malloc(3*sizeof(float *)). } AED (IST/DEEC) 23 Tabelas multidimensionais [2] • Exemplo: float ** mat. &mat[0] &mat[0][0] &mat[0][0] ?? ?? ?? ?? ?? ?? – há que fazer malloc para mat[1] e mat[2] como acima. Idx++) mat[Idx]=(float *)malloc(pColumns * sizeof(float)).Tabelas multidimensionais [1] • Declaração: float Vect[10][20]. • Alocação dinâmica: float ** Newmatrix(int pRows. float **mat. cada elemento sendo um vector de 20 elementos de float. return mat. &mat[0] &mat[0] ?? ?? ?? mat[0] = (float *) malloc(4*sizeof(float)).

free(mat). “mat[1]” e “mat[2]” e só depois se liberta “mat” – A sequência free(mat[0]). AED (IST/DEEC) 26 . mat = (float **) malloc(3*sizeof(float *)). depois de alocar “mat[0]” se fizesse a libertação de “mat”? – Ou seja. • para efeitos de posterior utilização de memória.Tabelas multidimensionais [3] • Exemplo (continuação): – Depois de se usar a matriz “mat” pode ser necessário libertar a memória. – Tal faz-se pela ordem inversa da alocação – Liberta-se “mat[0]”. free(mat[1]). free(mat[2]). nunca mais podendo ser usado por outras alocações. free(mat). mat[0] = (float *) malloc(4*sizeof(float)). produz ?? mat AED (IST/DEEC) 25 Tabelas multidimensionais [4] • O que aconteceria se. Como fica a memória? ?? ?? ?? ?? ?? mat – O espaço de memória que foi reservado para “mat[0][0-3]” permanece.

5}.17. for (IdxI=0.IdxK. IdxJ < pCB.Tabelas multidimensionais [5] • Exemplo: multiplicação de matrizes: float **Mult(float **pA. LINEA. ex: char Msg[]=“texto”.COLB). **ArrB = Newmatrix(SIZE. IdxI++) for (IdxJ=0. unsigned pS){ int IdxI. COLB.SIZE). – Numa tabela inicializada. **ArrC. float **pB. SIZE). IdxK < pS. – Uma cadeia pode ser indicada entre aspas (ex: “perigo!” é uma cadeia de 8 caracteres).} uso da função: #define LINEA 10 #define COLB 15 #define SIZE 20 float **ArrA = Newmatrix(LINEA. /*tabela 3 inteiros*/ Os ponteiros e a gestão dinâmica de memória facilitam o tratamento de cadeias de caracteres.IdxJ. AED (IST/DEEC) 27 Cadeias de caracteres [1] • Def: Uma cadeia de caracteres (“string”) é uma tabela de caracteres.pCB). IdxK++) Res[IdxI][IdxJ] += pA[IdxI][IdxK] * pB[IdxK][IdxJ]. sendo obrigatoriamente '\0' o último carácter. unsigned pCB. unsigned pLA. /*tabela 6 caracteres*/ int Tab[]={-4. AED (IST/DEEC) 28 . IdxJ++) for (IdxK=0. float **Res = Newmatrix(pLA. IdxI < pLA. return(Res). o compilador de C determina a dimensão. ArrB. ArrC = Mult(ArrA.

• Função que devolve uma cópia da cadeia de caracteres: char *strdup(char *s). igual ou menor do que 0 consoante a cadeia s1 for menor. (pString[Idx] != ‘\0’) && (pString[Idx] != C). O ponteiro dest deve ter a memória alocada suficiente para conter a cadeia src. /* retorna uma cadeia de caracteres que começa pelo símbolo contido em C ou por uma cadeia vazia. AED (IST/DEEC) 30 . */ } AED (IST/DEEC) 29 Cadeias de caracteres [3] A biblioteca do C string.Cadeias de caracteres [2] • Processamento de cadeias de caracteres Exemplo: procura numa cadeia de caracteres char * Procura (char C. return pString+Idx. Idx++). igual ou maior do que s2. • Função que compara duas cadeias de caracteres: int strcmp(char *s1. char *pString){ int Idx.h oferece um conjunto de funções para manipular cadeias de caracteres: • Função para copiar o conteúdo de uma cadeira de caracteres: char *strcpy(char *dest. char *src). for (Idx=0. char *s2). devolve um inteiro maior.

} pessoa. • Para agrupar objectos de tipos diferentes numa mesma variável existem as estruturas – Exemplo: #define SIZE 80 struct { char nome[SIZE]. – Podem-se declarar variáveis do tipo “pessoa” pessoa aluno. só caracteres.. int idade. podem definir-se novos tipos – Exemplo: • typedef struct { char nome[SIZE]. ????? .Estruturas [1] • As tabelas apenas permitem alocar. mais ou menos complexas. como já se fazia com os tipos básicos AED (IST/DEEC) 32 .. – Só inteiros. float altura. *aed.. estática ou dinamicamente.. float altura. “caixas” de memória para objectos do mesmo tipo. ip[400]. só reais. ??? pessoa AED (IST/DEEC) ? ? 31 Estruturas [2] • A partir do momento que se definem estruturas. } pessoa. int idade.

AED (IST/DEEC) 33 Estruturas [4] • Fazer no *aed.numero ? numero ? aluno ? proximo 34 aed AED (IST/DEEC) . • Inclusivamente pode-se fazer o seguinte • typedef struct _no_elementar{ unsigned int numero. pessoa aluno. equivale a fazer ?? aed • E fazer aed = (no *) malloc(1*sizeof(no)). struct _no_elementar * proximo. pessoa aluno. } no.Estruturas [3] • Uma estrutura pode ter qualquer número de campos e cada campo pode ser qualquer um dos tipos definidos e/ou ponteiros para esses tipos. } aluno_IST. equivale a fazer &aed. – struct { int numero. float *notas_de_cadeiras.

equivale a &#1 &#1 ? numero ? aluno &#2 &#2 ? ? ? proximo aed proximo numero aluno • Notar que qualquer campo de uma estrutura que seja um ponteiro apenas reserva o espaço para o ponteiro aquando da alocação.Estruturas [5] • E fazer aed->proximo = (no *) malloc(1*sizeof(no)). Tem de reservar posteriormente memória para guardar os objectos apontados por esse ponteiro. AED (IST/DEEC) 35 Estruturas [6] • Como se liberta a memória dos objectos criados atrás – Correctamente free(aed->proximo). ?? ? ? ? proximo aed &#2 numero aluno AED (IST/DEEC) 36 . assim como lembrar-se de libertar essa memória. free(aed). ?? aed – Incorrectamente free(aed). • Compete ao programador estar consciente de que tem ponteiros como campos das estruturas.

entre o primeiro e o penúltimo. contendo informação específica do nó. ou indutivos).Síntese da Aula 2 de Tipologia e Operações • Tabelas – Unidimensionais – Multidimensionais – Alocação dinâmica e estática • Cadeias de Caracteres • Estruturas – Conceito base e construção – Definição de novos tipos – Exemplos de manipulação dinâmica de memória AED (IST/DEEC) 37 Listas [1] • Definição: uma lista é uma sequência de nós compostos por • um item. contêm um apontador para um elemento do mesmo tipo. AED (IST/DEEC) 38 . • um apontador para o nó seguinte. • Um nó é uma estrutura recorrente (“recursive”) – Último elemento (terminal) aponta para vazio (NULL) – Os restantes elementos (recorrentes.

normalmente definido por declaração tipo: typedef xxx Item.Listas [2] • Estrutura conceptual item Cabeça (‘‘head’’) item item • Disposição em memória “head” &#1 &#1 &#2 &#3 &#2 &#3 NULL AED (IST/DEEC) 39 Listas [3] • Definição em C: Cada nó da lista é composto por : – Um item. que contém a informação específica ao elemento. struct _list * next. AED (IST/DEEC) 40 . – Um apontador para o próximo elemento da lista. O último elemento da lista tem o seu campo next inicializado com NULL. } list. typedef struct _list { Item item.

if (l == NULL) { fprintf(stderr. l->next • Elementos seguintes na lista: l->item: item do primeiro elemento da lista.!\n”)..Listas [4] • Declaração: uma lista é representada por um apontador para uma estrutura de tipo list: list *l. • Alocação de um elemento de lista: l = (list *) malloc(sizeof(list)). l->next->item: item do segundo elemento da lista. (*l). Mais simplesmente. podemos usar o operador -> e escrever: l->item.next permitem aceder aos dois campos da estrutura. l->next->next->item: item do terceiro elemento da lista AED (IST/DEEC) 42 .item e (*l). “Não há mais memória.. } AED (IST/DEEC) 41 Listas [5] • Acesso a informação: list *l.

tlst = (list **) malloc(4*sizeof(list *)). AED (IST/DEEC) 44 .3. Essa estrutura possui dois campos § apontador para o próximo elemento da lista de listas. } lst_lst. lst_lst *exemplo. AED (IST/DEEC) 43 Lista de listas [1] • Como se cria uma lista de listas? typedef struct _l_of_l_ { list *lista.1. com i=0. tlst &tlst[0] ?? &tlst[0] &tlst[1] &tlst[2] &tlst[3] ?? ?? ?? – Cada “tlst[i]”. é um ponteiro para uma variável do tipo “list” – Notar que “tlst” é um ponteiro para apontadores de “list”. /* ponteiro para sub-lista */ struct _l_of_l_ *seguinte.2. § apontador para variáveis do tipo list. A variável “exemplo” é um apontador para um tipo que é uma estrutura.Tabela de listas • Como se cria uma tabela de listas? list **tlst.

item &#3 &#3 &#2 ?? 00. produz apenas exemplo ?? • E as instruções exemplo = (lst_lst *) malloc(sizeof(lst_lst))... &#1 &#1 &#2 ?? lista &#2 seguinte ?? lista 00..00 seguinte AED (IST/DEEC) 45 Lista de listas [3] • Supor que de seguida se faz exemplo->seguinte = (lst_lst *) malloc(sizeof(lst_lst))... exemplo->seguinte = NULL. produzem exemplo &#1 &#1 ?? lista 00. exemplo->list->next = NULL.00 ?? 00. exemplo->seguinte->seguinte = NULL..Lista de listas [2] • A instrução lst_lst * exemplo.00 next &#1 exemplo AED (IST/DEEC) 46 .00 seguinte exemplo • Para criar o primeiro nó da primeira lista... faz-se exemplo->list = (list *) malloc(sizeof(list)).

criam xpto &#1 &#1 ?? 00.00 AED (IST/DEEC) 48 . xpto->seguinte = NULL.Lista de tabelas [1] • Como se cria uma lista de tabelas? typedef struct _l_tab { Item * tabela. xpto &#1 &#1 &#2 &#3 &#2 &#3 ?? 00.. xpto->seguinte->seguinte = NULL.00 AED (IST/DEEC) 47 Lista de tabelas [2] • Para criar uma tabela no campo “xpto->tabela” basta usar o procedimento já descrito para a criação de uma tabela xpto->tabela = (Item *) malloc(N*sizeof(Item)). xpto = (ltab *) malloc(sizeof(ltab)). struct _l_tab * seguinte. • As instruções ltab * xpto. } ltab.. • Para criar o próximo elemento da lista basta usar o procedimento já descrito para criação de um novo nó numa lista xpto->seguinte = (ltab *) malloc(sizeof(ltab))...

.. dlst * frente_verso. frente_verso &#1 &#1 ?? 00.. } dlst. frente_verso->anterior = frente_verso->posterior = NULL. frente_verso->posterior->anterior = frente_verso.00 &#2 ?? &#1 00..00 00.. struct _d_lst_ * posterior. frente_verso = (dlst *) malloc(sizeof(dlst)). frente_verso->posterior->posterior = NULL. frente_verso &#1 &#1 ?? 00. struct _d_lst_ * anterior....00 posterior objecto anterior AED (IST/DEEC) 49 Listas duplamente ligadas [2] • Para acrescentar um novo elemento há que fazer frente_verso->posterior = (dlst *) malloc(sizeof(dlst)).Listas duplamente ligadas [1] • Para criar uma lista com ponteiros para a frente e para trás (anel) typedef struct _d_lst_ { Item objecto.00 posterior objecto anterior posterior &#2 anterior objecto AED (IST/DEEC) 50 .

Ficheiro que define item – Alocação de um novo elemento: list * NewElement(Item). list *). struct _list *next. – Função para aceder ao elemento seguinte: list * Next (list *).h” typedef struct _list { Item item. AED (IST/DEEC) /* acessor */ 52 . é constituída por: – A definição do tipo list: #include “defs. } list. AED (IST/DEEC) 51 Interface para Listas [2] – Inserção de um elemento a seguir a outro: void InsertNext(list *. – Remoção de um elemento a seguir a outro: void DeleteNext(list *). – Libertação da memória associada a um elemento: void FreeElement(list *). /* acessor */ – Função de acesso a um item: Item Item(list *).Interface para Listas [1] • A interface do tipo list.

AED (IST/DEEC) 53 Implementação para Listas [1] Implementação do tipo list: – Alocação de um novo elemento: list * NewElement(Item N) { list *El = malloc(sizeof(list)). El ->next = NULL. } AED (IST/DEEC) 54 . } – Libertação da memória associada a um elemento: void FreeElement(list *pEl) { free(pEl).h” define-se o item. El->item = N. por exemplo typedef int Item.Interface para Listas [3] • No ficheiro “defs. return(El).

} pEl aux depois! pEl AED (IST/DEEC) primeiro! 56 . pEl2 pEl1 etc.. } etc.. pEl2 primeiro! pEl1 depois! AED (IST/DEEC) 55 Implementação para Listas [3] – Remoção de um elemento a seguir a outro: void DeleteNext(list *pEl) { list *Aux. Aux = pEl->next->next. list *pEl2) { pEl1->next = pEl2->next. pEl2->next = pEl1. pEl->next = Aux.Implementação para Listas [2] – Inserção de um elemento a seguir a outro: void InsertNext(list *pEl1. FreeElement(pEl->next).

} – Função de acesso a um item: Item Item(list *pEl) { return pEl->item. Ptr = Ptr ->next) pFirst aponta para o primeiro elemento da lista. Ptr != NULL. Ptr != NULL. Æ O último elemento da lista deve ter o seu campo next inicializado com NULL.Implementação para Listas [4] – Função para aceder ao elemento seguinte: list * Next (list *pEl) { return pEl->next. • Exemplo: para imprimir todos os elementos da lista: for (Ptr = pFirst. } AED (IST/DEEC) 57 Implementação para Listas [5] Processamento de listas • Para percorrer uma lista: for (Ptr = pFirst. Ptr = Ptr ->next) PrintItem(Ptr->item). AED (IST/DEEC) 58 .

Cur ->next = Res. *Res = NULL. } return Res. Cur = Next.Implementação para Listas [6] • Função para reverter uma lista: list *reverse (list *pL) { list *Next = pL. while (Cur != NULL) { Next = Cur->next. } AED (IST/DEEC) 59 Síntese da Aula 3 de Tipologia e Operações • Listas – – – – – Lista simples Tabelas de listas Listas de listas Listas de tabelas Listas duplamente ligadas • Interface para listas simples • Implementação para listas simples AED (IST/DEEC) 60 . Res = Cur. *Cur = pL.