Você está na página 1de 7

DEFINIÇÃO

_ Lista linear é uma sequência de zero ou mais elementos de um mesmo tipo.


_ Simbolicamente, L = a1, a2, ..., an, onde n >= 0.

1 - Implementação com vetor

Estrutura base
const int max = 50;
typedef char vetor[max+1];
struct lista {
vetor Elementos;
int Ultimo;
};
lista L1, L2, L3;

Função de criação da lista


lista criarLista () {
lista L; int i;
printf("Digite o numero de elementos: ");
scanf("%d",&L.Ultimo);
if (L.Ultimo > max) {
printf("Numero excede tamanho maximo para listas");
L.Ultimo = 0;
}
else if (L.Ultimo > 0) {
printf ("Digite %d elemento(s): ", L.Ultimo);
for (i = 1; i <= L.Ultimo; i++)
scanf("%c",& L.Elementos[i]);
}
return L;
}

Programa Principal
void main () {
lista L1;
L1 = criarLista ();
}

Impressão da lista
void escreverLista (lista L) {
int i;
if (L.Ultimo < 1) printf("Lista vazia");
else
for (i = 1; i <= L.Ultimo; i++)
printf("%c",L.Elementos[i]);
}

void main () {
lista L1;
- - - - -
escreverLista (L1);
}

Inserção na Lista
void inserirElemento (char x, int p, lista *L) {
int q;
if (L->Ultimo >= max)
printf ("Lista cheia: insercao impossivel");
else if (p < 1 || p > L->Ultimo + 1)
printf("A posicao de insercao nao existe");
else {
L->Ultimo++;
for (q = L->Ultimo - 1; q >= p; q--)
L->Elementos[q+1] = L->Elementos[q];
L->Elementos[p] = x;
}
}

Eliminação de Elemento da Lista


void eliminarElemento (int p, lista *L) {
int q;
if (p < 1 || p > L->Ultimo)
printf("A posicao de eliminacao nao existe");
else {
L->Ultimo--;
for (q = p; q <= L->Ultimo; q++)
L->Elementos[q] = L->Elementos[q+1];
}
}
2 – Implementação com ponteiros

Estrutura

#include <stdio.h>
#include <malloc.h>
#include<stdlib.h>

struct no{
int val;
struct no *prox;
} *plista=NULL, *ant=NULL, *loc=NULL, *t=NULL, *v=NULL, *z=NULL;

Programa Principal

int main()
{
int i, n, m, chv1, chv2;
char insere, exclui;
printf("Digite o numero de elementos da lista:");
scanf("%d",&n);

Criação da Lista

for (i=1; i<=n; i++)


{
ant=(struct no *) malloc(sizeof (struct no));
printf("Digite a val:");
scanf("%d", &m);
ant->val=m;
ant->prox=plista;
plista=ant;
}

Imprime a Lista

for (ant=plista;ant; ant=ant->prox)


{
printf ("%d\n", ant->val);

}
Busca na Lista

printf("Digite a val procurada:");


scanf("%d", &chv1);
chv2=chv1;
loc=plista;

while (loc!=NULL){
if (loc->val!=chv1){
ant=loc;
loc=loc->prox;
}
else{
t=loc;
loc=NULL;
printf("val encontrada!");
}
}

Inserção na lista

if(t==NULL ){
printf("val nao encontrada!");
printf("\n Deseja inserir esta val? (S/N):");
scanf("%s", &insere);
if (insere=='S'|| insere=='s'){
ant=(struct no *) malloc(sizeof (struct no));
ant->val=chv1;
ant->prox=plista;
plista=ant;
}
}

Retirada de elemento da lista

if (t!=NULL)
{
printf("\nDeseja excluir esta val? (S/N):");
scanf("%s", &exclui);
if (exclui=='S'|| exclui=='s'){
ant->prox=t->prox;
chv2=t->val;
free(t);
}
}
Inversão da lista

invert.c

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>

struct no {
int val;
struct no* prox;
};

struct no* L;

struct no* criaUm(){


struct no *novo;
novo = malloc(sizeof (struct no));
novo->val = rand() % 100;
novo->prox = NULL;
printf( "%d\n", novo->val);
return novo;
}

void preencheComDados(){

L= malloc(sizeof (struct no*));


struct no* atual = L;

int n;
for(n=0; n < 5; n++){
atual->prox = criaUm();
atual = atual->prox;
}
}
void inverte(){

struct no* atual = L;


struct no* proximo = L->prox;

/*
* preserva o link do proximo elemento na sequencia
* a->b->c
* temp = c, porque vamos mudar o prox de b para a (a<-b)
* e precisamos saber como caminhar com o atual na lista encadeada
*/
struct no* temp = L->prox;

while( proximo != NULL ){


// preserva ponteiro para caminhar no encadeamento
temp = temp->prox;

// inverte o caminho do elemento posterior ao atual


proximo->prox = atual;

// determina o proximo elemento a ser processado


atual = proximo;

// determina o elemento posterior


proximo = temp;
}

// remove link do primeiro elemento com o segundo elemento


L->prox->prox = NULL;

// aponta para a nova cabeca da lista


L->prox = atual;
}

void print(){
struct no *atual = L->prox;

while(atual != NULL ){
printf( "%d ", atual->val );
atual = atual->prox;
}
}

int main() {
srand(time(NULL));
preencheComDados();

printf("original\n");
print();
inverte();

printf("\ninvertida \n");
print();

printf( "\n");
}

Você também pode gostar