• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

rgcouto

[Dúvida] Listas Ligadas

13 mensagens neste tópico

Boas,

Estou aqui com uma dúvida, alguém me pode dar o código de inserção à cabeça de Listas Ligadas? É que tinha o código, mas entretanto nao sei onde o pûs :/

Abraço..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Estou aqui com uma dúvida, alguém me pode dar o código de inserção à cabeça de Listas Ligadas? É que tinha o código, mas entretanto nao sei onde o pûs :/

Abraço..

inserir á cabeça?

Ora bem, deixa ver se ainda me lembro disso:

typedef struct coisasInuteis
{
int b;
char nome[10];
struct coisasInuteis *next;
} *MesmoInuteis;



int insere(MesmoInuteis realmenteInuteis, int bla, char uuuu[10])
{
MesmoInuteis * aux;
aux=(MesmoInuteis*)malloc(sizeof(MesmoInuteis));
aux->b=bla;
strcpy(aux->nome, uuuu);
aux->next=realmenteInuteis;
return 0;
}

Acho que é assim, não testei, mas pelo que me lembro, truclas =D

Abraços BTIII

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

inserir á cabeça?

Ora bem, deixa ver se ainda me lembro disso:

typedef struct coisasInuteis
{
int b;
char nome[10];
struct coisasInuteis *next;
} *MesmoInuteis;



int insere(MesmoInuteis realmenteInuteis, int bla, char uuuu[10])
{
MesmoInuteis * aux;
aux=(MesmoInuteis*)malloc(sizeof(MesmoInuteis));
aux->b=bla;
strcpy(aux->nome, uuuu);
aux->next=realmenteInuteis;
return 0;
}

Acho que é assim, não testei, mas pelo que me lembro, truclas =D

Abraços BTIII

acho que tem aí alguns erros... o MesmoInuteis já é um apontador pa estrutura, logo o aux vai ser um apontador para apontador e n tás a modificar a lista inicial, acho que o melhor seria a função retornar MesmoInuteis, algo tipo:

MesmoInuteis insere(MesmoInuteis realmenteInuteis, int bla, char uuuu[10])
{
MesmoInuteis aux;
aux=(MesmoInuteis)malloc(sizeof(MesmoInuteis));
aux->b=bla;
strcpy(aux->nome, uuuu);
aux->next=realmenteInuteis;
return aux;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é pá é provavel, nada que um compilador não resmunga-se, tirando não devlver a lista.

Ele disse que queria inserir á cabeça, não disse que queria devolver ;)

fiu

:P

Nata79, por acaso voce não ser o pastel...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nata79, por acaso voce não ser o pastel...

Meninos, PM ftw ;)

Nata79, ali na linha

aux=(MesmoInuteis)malloc(sizeof(MesmoInuteis));

estás a reservar espaço para um apontador. É preciso adicionar outra definição no typedef para alocar espaço correctamente:

typedef struct _coisasInuteis
{
/* (...) */
} CoisasInuteis, *MesmoInuteisP;

/* (...) */
aux=(MesmoInuteisP)malloc(sizeof(CoisasInuteis));
/* (...) */

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou então tirar o * do typedef e usa-lo só quando necessário, ou seja, sempre menos no sizeof :X

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e para inserir as strings ordenadamente o que fazem? usam o stcmp?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e para inserir as strings ordenadamente o que fazem? usam o stcmp?

sim... s o resultado d strcmp for positivo a segunda string é "maior" que a primeira, s for negativo é o contrário e se for 0 são iguais... axo eu que é mais ou menos isto... faço sempre uma confusão dos diabos com o strcmp...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
sim... s o resultado d strcmp for positivo a segunda string é "maior" que a primeira, s for negativo é o contrário e se for 0 são iguais... axo eu que é mais ou menos isto... faço sempre uma confusão dos diabos com o strcmp...

Nata, realmente acho que fizeste confusão:

strcmp( s, v) > 0 ----> s é "maior" que v

strcmp(s, v) == 0 -----> s é igual a v

strcmp(s,v) <0 ------> s é "menor" que v

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu já sei inserir à cabeça e no fim da lista.

E se quisermos fazer a inserção no meio da lista,

Por exemplo:

typedef struct celula *LInt;
struct celula{
  int valor;
  LInt next;
};

LInt insert_at (LInt, int, int)

Em que LInt é a lista, o primeiro int é o inteiro que quero inserir e o segundo int é a posição. Se a posição for maior que o tamanho da lista o valor é inserido no fim desta.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens que ir percorrendo a lista e ir contando sempre o nº de elementos que já percorreste (através de um acumulador). Quando estiveres no elemento cuja posição é igual n-1 (sendo n a posição onde queres inserir), crias o novo nodo e alteras os apontadores.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já tenho aqui algo que acho que funciona. Fica aqui pra quem quiser. Agradecimentos a quem me fez isto e me aturou pra me explicar.  :P

typedef struct listaligada{

int valor;
struct listaligada *prox;

} * LInt;



LInt insert_at (LInt l, int v, int p){

int i;
LInt k, ik, novo;

if(l==NULL){
	l=(LInt) malloc(sizeof(struct listaligada));
	l->valor=v;
	l->prox=NULL;

}else if (p==0){
	LInt aux;
	aux=(LInt) malloc (sizeof(struct listaligada));
	aux->valor=v;
	aux->prox=l;
	l=aux;
        }else{
	i=0;
	k=l;

	while(i<p || k!=NULL){
	  ik=k; //guarda o anterior
	  i++;  //aumenta o contador
		  k=k->prox; //avança na lista
	}

	novo=(LInt) malloc(sizeof(struct listaligada));
	novo->valor=v;
	novo->prox=k;
	ik->prox=novo;
}
   return l;

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora