prog
};
struct no { struct no *ante; struct no *prox; int dado;
};
int remove_elemento(struct lista *L, struct no *P)
{
struct no *ante = P->ante; struct no *prox = P->prox; ante->prox = prox; /* ante != NULL por causa do cabeca */ if(prox != NULL) { prox->ante = ante; } if(L->ultimo == P) { L->ultimo = ante; } int dado = P->dado; free(P); return dado;
}
4 - struct lista { struct no *cabeca; struct no *ultimo;
};
struct no { struct no *ante; struct no *prox; int dado;
};
typedef struct lista TipoLista; typedef struct no Apontador; void Troca(TipoLista *L, Apondador *P)
{
struct no *ante; struct no *prox = P->prox; if(prox == NULL) { return; } /* impossível trocar posições. */ ante = L->cabeca; while(ante->prox != P) { ante = ante->prox; } ante->prox = prox; P->prox = prox->prox; prox->prox = P; if(L->ultimo == prox) { L->ultimo = ante; }
}
Achei na net
6
Escreva dois procedimentos (um usando a implementação por arranjos (alocação sequencial) e outro usando a implementação por apontadores) para remover de uma lista encadeada um elemento com uma chave específica (passada como parâmetro): Remove(TipoLista *Lista, TipoChave c). Qual é a ordem de complexidade dos seus procedimentos? IImplementação para lista de inteiros: #define MAX_ELEMENTOS 65535 struct lista_arranjo { int dados[MAX_ELEMENTOS]; int ultimo;
};
int remove_elemento_arranjo(struct lista_arranjo *L, int dado)
{
int i; int j; for(i = 0; i < L->ultimo && L->dados[i] != chave; i++); /* se o dado está na lista, i contém o índice do elemento a * remover. se o dado não está na lista, i == L->ultimo. */ if(i == L->ultimo) { return 0; } else { /* o dado está no elemento no índice i, que vamos remover: */ while(i < L->ultimo - 1) { L->dados[i] = L->dados[i+1];