alphasil Posted July 6, 2012 at 02:03 PM Report #467690 Posted July 6, 2012 at 02:03 PM 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
pmg Posted July 6, 2012 at 02:11 PM Report #467692 Posted July 6, 2012 at 02:11 PM 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!
HappyHippyHippo Posted July 6, 2012 at 02:21 PM Report #467696 Posted July 6, 2012 at 02:21 PM (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 July 6, 2012 at 02:22 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted July 6, 2012 at 02:23 PM Author Report #467697 Posted July 6, 2012 at 02:23 PM Ok; vou acrescentar, mas pondo NULL já defino a estrutura como vazia?? struct clientes *ini=NULL; gmc11
HappyHippyHippo Posted July 6, 2012 at 02:32 PM Report #467699 Posted July 6, 2012 at 02:32 PM 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 Portugol Plus
alphasil Posted July 6, 2012 at 09:23 PM Author Report #467814 Posted July 6, 2012 at 09:23 PM (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 July 6, 2012 at 09:41 PM by alphasil gmc11
pmg Posted July 6, 2012 at 09:35 PM Report #467816 Posted July 6, 2012 at 09:35 PM 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!
alphasil Posted July 6, 2012 at 09:38 PM Author Report #467818 Posted July 6, 2012 at 09:38 PM (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 July 6, 2012 at 09:43 PM by alphasil gmc11
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now