alphasil Posted July 6, 2012 Report Share Posted July 6, 2012 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 Link to comment Share on other sites More sharing options...
pmg Posted July 6, 2012 Report Share Posted July 6, 2012 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! Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted July 6, 2012 Report Share Posted July 6, 2012 (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 by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
alphasil Posted July 6, 2012 Author Report Share Posted July 6, 2012 Ok; vou acrescentar, mas pondo NULL já defino a estrutura como vazia?? struct clientes *ini=NULL; gmc11 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted July 6, 2012 Report Share Posted July 6, 2012 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 Link to comment Share on other sites More sharing options...
alphasil Posted July 6, 2012 Author Report Share Posted July 6, 2012 (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 by alphasil gmc11 Link to comment Share on other sites More sharing options...
pmg Posted July 6, 2012 Report Share Posted July 6, 2012 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! Link to comment Share on other sites More sharing options...
alphasil Posted July 6, 2012 Author Report Share Posted July 6, 2012 (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 by alphasil gmc11 Link to comment Share on other sites More sharing options...
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