Ir para o conteúdo
f-22

Apontadores

Mensagens Recomendadas

f-22    0
f-22

Boas pessoal,

Estou com 1 problema 1 programa, tenho que entregar isto para a semana e não estou a conseguir dar a volta.

O problema é que eu tenho 2 "listas" e quero passa-la/recebela por referência mas ele nunca actualiza a variável global.

Tenho 1 struct

Tenho 2 variáveis que me representam as 2 cabeças de lista

e quero que 1 método me retorne a mais pequena


struct s_lista { char *nome; struct s_lista next; };

typedef struct s_lista lista;

lista *lst1 = NULL;
lista *lst2 = NULL

main()
{
...
      lista* novoElemento = (lista*) malloc (sizeof(lista));
      // preencho o novoElemento com coisas, faz de conta
      ...
      lista** listaMaisPequena = getMaisPequena();
      insereNovo(listaMaisPequena, novoElemento) ;
...
}

void insereNovo(lista** head, lista* elemento)
{
    lista* last;

    if (*head == NULL)
          *head = elemento;
    else
         for (last = *head; last->next != NULL; last=last->next)
            last->next = elemento;
}

lista* getMaisPequena()
{
     if (ListLenght(lst1) <= ListLenght(lst2))
         return &lst1;
    else
         return &lst2;
}

int ListLenght(lista* head)
{
    lista* current = head;
    int count = 0;
   
    while(current != null) {
         count ++;
         current = current->next;
    }
}

Se me poderem ajudar, agradecia. já andei no debug a ver o endereços de memória, mas não consigo resolver isto.[/img]

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1133
HappyHippyHippo

isso da erro de certesa ....

lst* getMaisPequena()
{
     if (ListLenght(lst1) <= ListLenght(lst2))
         return &lst1;
    else
         return &lst2;
}

que tipo de dados é lst ??? não seria lista ???

o return não com o & porque a variavel lst1 e lst2 já são por si ponteiros ...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
f-22    0
f-22

isso da erro de certesa ....

lst* getMaisPequena()
{
     if (ListLenght(lst1) <= ListLenght(lst2))
         return &lst1;
    else
         return &lst2;
}

que tipo de dados é lst ??? não seria lista ???

o return não com o & porque a variavel lst1 e lst2 já são por si ponteiros ...

Obrigado pela resposta rapida.

A mim não me da erro, nem compilacao nem run time, simplesmente ele n deve estar com a colocar nos endereços devidos.

Sim tens razao o return é lista, enganei-me ao escrever aqui, mas no return dizes que é sem o &? vou tentar.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
f-22    0
f-22

isso da erro de certesa ....

lst* getMaisPequena()
{
     if (ListLenght(lst1) <= ListLenght(lst2))
         return &lst1;
    else
         return &lst2;
}

que tipo de dados é lst ??? não seria lista ???

o return não com o & porque a variavel lst1 e lst2 já são por si ponteiros ...

Já testei, se alterar o return de &lst1 para lst, quando chego ao insert na linha if (*head == NULL) dá segmentation fault :S

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1133
HappyHippyHippo

main() {
...
      lista** listaMaisPequena = getMaisPequena();
...
}

lista* getMaisPequena() {
...
}

uma retorna um ponteiro para uma lista mas estas a guardar o resultado em um ponteiro para um ponteiro para uma lista

tens isso a complilar sem erros e/ou warnings ???

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
f-22    0
f-22

main() {
...
      lista** listaMaisPequena = getMaisPequena();
...
}

lista* getMaisPequena() {
...
}

uma retorna um ponteiro para uma lista mas estas a guardar o resultado em um ponteiro para um ponteiro para uma lista

tens isso a complilar sem erros e/ou warnings ???

Tenho alguns warmings sim.

A retornar sem o & e para lista** ou lista*, chego ao if da funcção de insert e dá segmentation fault sempre :S

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1133
HappyHippyHippo

claro que da ... andas a fazer uma complicação do caneco com os tipos de variáveis !!!!

faz post do que tens agora

ps : nunca aceites código com warnings ...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
f-22    0
f-22

Pois, de facto estou a baralhar isto :S.

Supostamente 1 ponteiro sem o * ou seja NOMEVAR dá o endereço de memoria, com o *NOMEVAR dá para onde ele aponta, depois o **NOMEVAR é que anda-me a atrofiar. Corrige-me se estiver errado.

Desde já, obrigado. segue abaixo o codigo actual


struct s_lista {
    char* nome;
    struct s_lista *next;
};
typedef struct s_lista lista;

lista *lista_head_1 = NULL;
lista *lista_head_2 = NULL;

int main(void) {
...
    lista* novoElemento = (lista*) malloc(sizeof (lista));
    novoElemento->nome = "coisas";

    lista** lista = getMaisPequena();

    insert_tail(lista, novoElemento);
...
}

void insert_tail(lista* head, lista* element) {
    lista* last;

    element->next = NULL;
    if (*head == NULL)
        *head = element;
    else {
        for (last = *head; last->next != NULL; last = last->next);
           last->next = element;    
    }
}
lista* remove_head( lista **head )
{
    lista *temp;

    /* Elimina a cabeca */
    if( *head != NULL )
    {
        temp = *head;
        *head = (*head)->next;
    }

    return temp;
}

int ListLength(lista* head) {
    lista* current = head;
    int count = 0;

    while (current != NULL) {
        count++;
        current = current->next;
    }
    return count;
}

lista* getMaisPequena() {
    if (ListLength(lista_head_1) <= ListLength(lista_head_2))
        return lista_head_1;
    else
        return lista_head_2;
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1133
HappyHippyHippo

int i = 10;
int * p = &i;
int ** z = &p;

+-------------------+--------------+

|  Posicao Mem | Valor        |

+-------------------+--------------+

| 0x04                | 10              | (i)

+-------------------+--------------+

| 0x08                | 0x04          | (p)

+-------------------+--------------+

| 0x0F                | 0x08          | (z)

+-------------------+--------------+

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
f-22    0
f-22

int i = 10;
int * p = &i;
int ** z = &p;

+-------------------+--------------+

|  Posicao Mem | Valor        |

+-------------------+--------------+

| 0x04                | 10              | (i)

+-------------------+--------------+

| 0x08                | 0x04          | (p)

+-------------------+--------------+

| 0x0F                | 0x08          | (z)

+-------------------+--------------+

Ok obrigado, acho que já percebi :S. vou rever o código. estava a confundir as coisas. pensava que para passar por referência para 1 função tinha de passar como &p, afinal posso só invocar a função passando p e recebo *p.

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade