Jump to content

Recommended Posts

Posted

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??

gmc11

 

Posted

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!

Posted (edited)

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
Posted

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
Posted (edited)

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
gmc11

 

Posted
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!

Posted (edited)

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
gmc11

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.