Jump to content
alphasil

Lista ligada

Recommended Posts

alphasil

Oi novamente

Mas um exercício que me diz:

nome da pessoa;

numero tel;

numero lugares;

valor pago

Defina a estrutura de dados que representa a lista ligada e defina a lista local à função main

Fiz assim

#include <stdio.h>
#include <stdlib.h>
typedef struct clientes{
char nome[100];
int tel, lugares;
float valor;
struct clientes *prox; //ponteiro para elemento da propria estrutura
};
struct clientes *aloca()
{
   return malloc(sizeof(struct clientes)); //retorno de uma posição válida na memória
}
int main()
{
   struct clientes ini;
   ini.prox=NULL; //proximo elemento da lista é nulo
   return 0;
}

Alguma anomalia ou passa??

Share this post


Link to post
Share on other sites
pmg

Até aqui tudo bem.

Repara que nunca chamas a funcao aloca().

No entanto já tens espaço para 1 cliente reservado no objecto ini (ini.nome; ini.tel, ...).

O que se faz normalmente, é definir um ponteiro para o primeiro elemento (ponteiro com NULL antes de se saber o primeiro cliente)

int main(void) {
   struct cliente *ini = NULL;
   /* aqui alocar, usar e libertar */
   return 0;
}


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
HappyHippyHippo

passar passa, apesar não ser muito convencional.

o que normalmente se faz é que a própria lista ser referenciada por um ponteiro

int main()
{
   struct clientes * ini; // ponteiro
   ini = aloca();
   return 0;
}

depois, como terás de verificar se ouve problemas na alocação de memória

if ((ini = aloca()) == NULL) {
 // ups ... sem memória ...
}

e no final, necessitas de um ciclo para limpar a memória alocada, isso já deixo para ti

notei agora também que estas a declarar a estrutura de dados com a palavra reservada typedef, no entanto não estás a dar nenhum nome ao novo tipo de dados. como nunca fiz tal coisa, nem sei se o compilador deveria se queixar

typedef struct clientes{
...
}; // <------- falta o nome do novo tipo de dados

exemplo >>

typedef struct clientes{
 char nome[100];
 int tel, lugares;
 float valor;
 struct clientes *prox;
} cliente; // a estrutura "struct cliente" pode ser denominada somente com "cliente" a partir de agora

int main() {
 cliente * ini; // um ponteiro para um tipo de dados "struct cliente"
}

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
alphasil

Ok;

vou acrescentar, mas pondo NULL já defino a estrutura como vazia??

struct clientes *ini=NULL;

Share this post


Link to post
Share on other sites
HappyHippyHippo

Ok;

vou acrescentar, mas pondo NULL já defino a estrutura como vazia??

struct clientes *ini=NULL;

sim, ao atribuires o valor de NULL ao ponteiro, pode representar que a lista se encontra vazia

ou então podes mais tarde, porque primeiro acho melhor fazeres assim, criar um "header" da tua lista usando uma estrutura extra

exemplo:

struct ListNode {
 // data
 struct ListNode * next;
}

struct List {
 unsigned int count;
 struct ListNode * first;
}

deste modo podes rapidamente saber quantos elementos tem a lista ou então teres um local de rápido acesso a informação que possas armazenar da lista

- podes adicionar um novo ponteiro para referenciar o último elemento

- podes adicionar uma nova variável que contabiliza o somatório dos elementos da lista para fazer médias e afins sem necessidade de efetuar nenhuma transversão da lista

Mas como referi acima, acaba primeiro este exemplo (lista ligada sem cabeça)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
alphasil

Bem de volta, agora com uma pequena dúvida que está aqui.

Copiei um exercício que estava na plataforma mas dá uns warnings, das duas uma, ou é o meu pc ou quem pôs isso, não pôs bem, já li e reli o código todo e está igual.

#include <stdio.h>
#include <stdlib.h>
typedef struct clientes{
char *nome; //ponteiro de
char *morada; //ponteiro de
int tel;
struct clientes *prox; //ponteiro para elemento da propria estrutura
}cliente;
//inicia a lista
cliente* inicia()
{
return NULL;
}
int insere(cliente* cl,char *nome, char *morada, int tel)
{
cliente* aux=malloc(sizeof(cliente));
aux->nome=nome;
aux->morada= morada;
aux->tel=tel;
aux->prox = cl;
return aux;
}
int imprime(cliente* cl)
{
int i=1;
cliente* aux1;
for(aux1= cl; aux1!=NULL; aux1=aux1->prox)
{
	printf("Registos %d\n", i);
	printf("Nome: %s\n", aux1->nome);
	printf("Morada: %s\n", aux1->morada);
	printf("Tel: %d\n", aux1->tel);
	i++;
}
return 0;
}
int main()
{
char nome[100], morada[100];
int tel;
cliente *cl; //Declara lista não inicializada
cl=inicia();//Inicia a lista como vazia
//Insere dados
printf("Introduza o seu nome: \n");
gets(nome);
printf("Introduza a sua morada: \n");
gets(morada);
printf("Introduza o seu tel: \n");
scanf("%d", &tel);
getchar();
cl=insere(cl,nome, morada, tel); //chama a funçao insere
imprime(cl);
return 0;
}

ao entrar na função imprime, o Registos aparece com um número enorme.

warning: return makes integer from pointer without a cast [enabled by default]| (return aux)

|warning: assignment makes pointer from integer without a cast [enabled by default]| (cl=(cl, nome, morada, tel)

Atenção...não me deem nas orelhas....não fui eu que fiz, mas também não estou a ver o problema..

Edited by alphasil

Share this post


Link to post
Share on other sites
pmg
int insere(cliente* cl,char *nome, char *morada, int tel)
{
   cliente* aux=malloc(sizeof(cliente));
   aux->nome=nome;
   aux->morada= morada;
   aux->tel=tel;
   aux->prox = cl;
   return aux;
}

aux e um ponteiro para cliente; a funcao foi definido como devolvendo um int; tens uma instrucao "return aux" -- ou seja 'return um ponteiro', e como esse ponteiro nao e compativel com o tipo definido o compilador da-te o primeiro warning a dizer que transformou o ponteiro num inteiro.

O segundo warning deixo para outro membro descortinar :)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
alphasil

Oi

Já está resolvido uma parte, os warnings desapareceram, agora o "i" na função insere é que que me dá dores de cabeça, quando imprime "Registos" e chamo a variavel "i" deu-me 5771280

e tenho na definição da variável int i=1

???

Resolvido, era mesmo uma pequena correçao, como a lista definida na folhas chamava-se I, pus isso na definição da variável.

Edited by alphasil

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.