Ir ao conteúdo
  • Cadastre-se
Aislan Silva Costa

C Passagem de Struct como Parametro

Posts recomendados

Boas a todos!

 

Estou estudando sobre listas duplamente encadeadas, surgiu a necessidade de passar uma struct para dentro de outra struct, para dentro de mais outra.

Eu já consegui fazer uma, porém, ao invés de usar uma struct livro, usava apenas um int id dentro do struct nó.

 

O que preciso e fazer a correta passagem da struct livro, para dentro da struct no, que por sua fez esta dentro da struct lista;

 

Com int livro_id dentro do próprio nó;

typedef struct no
{
        in livro_id;
	    struct livro *livro;

}no;

 

Agora tenho uma struct livro separada do nó:

 

typedef struct livro
{
	int id;


}livro;

typedef struct no
{

	    struct livro *livro;

}no;

typedef struct lista
{
	no *primeiro;

}lista;

Qual o erro desse código?

obs: lembrando que é apenas um código genérico para implementação:

 

#include<stdlib.h>
#include<stdio.h>

typedef struct livro
{
	int id;


}livro;

typedef struct no
{

	    struct livro *livro;

}no;

typedef struct lista
{
	no *primeiro;

}lista;

void iniciarLista(lista *lista)
{
	lista->primeiro = NULL;
}

void inserir(lista *lista, livro *livro)
{
	no *new = (no*)malloc(sizeof(no));
	new->livro = livro;
	lista->primeiro = new;

}

void imprime(lista *lista)
{
	printf("%d", lista->primeiro->livro->id);

}


int main()
{
lista *lista;
livro livro;
livro.id= 10;

iniciarLista(lista);
inserir(lista, &livro);
imprime(lista);


}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você diz que existe uma estrutura de dados e essa estrutura é uma lista composta de n-nós em que cada nó tem uma estrutura chamada livro?

/* Estrutura Livro */
struct Livro
{	int id;
	char nome[30];
};

/* Estrutura nó */
struct No
{	struct Livro livro;
	struct No* nprox;
	struct No* nant;
};

/* Estrutura Lista */
struct Lista
{	int quantidade;
	struct No* primeiro;
};

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde @AnsiC, como vai?

 

Sim, numa forma genérica, tudo bem? Sem se importar por enquanto com a lista duplamente encadeada.

Pegando seu código, tenho então três struct, farei uma função para inciar a lista, uma função que insere dados numa lista, recebendo como parametro uma struct livro e uma lista, dentro dessa função criarei um novo no, e passarei a struc do parametro para dentro da struct livro do nó, tudo bem?

 

O código então, não funciona, não da erro, mas a função imprime não mostra nada na tela.

 

#include<stdlib.h>
#include<stdio.h>

/* Estrutura Livro */
typedef struct Livro
{	int id;
  //retirei o char para facilitar meu entendimento
}livro;

/* Estrutura nó */
typedef struct No
{	livro *livro;
	struct No* nproximo;
}no;

/* Estrutura Lista */
typedef struct Lista
{	int quantidade;
	no *primeiro;
}lista;

void iniciarLista(lista *lista)
{
	lista->primeiro = NULL;
	lista->quantidade = 0;
}

void inserir(lista *lista, livro *livro)
{
	no *new = (no*)malloc(sizeof(no));

	new->livro = livro;
	lista->primeiro = new;
	lista->quantidade++;

}

void imprime(lista *lista)
{
	printf("no livro id e: %d\n", lista->primeiro->livro->id);

}


int main()
{
lista *lista;
livro livro;
livro.id= 10;


iniciarLista(lista);
inserir(lista, &livro);
imprime(lista);


}

O mais curioso e que esse código funciona:

 

#include<stdlib.h>
#include<stdio.h>

/* Estrutura Livro */
typedef struct Livro
{	int id;
  //retirei o char para facilitar meu entendimento
}livro;

/* Estrutura nó */
typedef struct No
{
	int valor;
	livro *livro;
	struct No* nproximo;
}no;

/* Estrutura Lista */
typedef struct Lista
{	int quantidade;
	no *primeiro;
}lista;

void iniciarLista(lista *lista)
{
	lista->primeiro = NULL;
	lista->quantidade = 0;
}

void inserir(lista *lista, livro *livro, int valor)
{
	no *new = (no*)malloc(sizeof(no));
    new->valor = valor;
	new->livro = livro;
	lista->primeiro = new;
	lista->quantidade++;

}

void imprime(lista *lista)
{
	printf("no livro id e: %d\n", lista->primeiro->livro->id);
	printf("no valor e: %d\n", lista->primeiro->valor);


}


int main()
{
lista *lista;
livro livro;
livro.id= 10;

int dado = 100;

iniciarLista(lista);
inserir(lista, &livro, dado);
imprime(lista);


}

Saída:

 

no livro id e: 10
no valor e: 100

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Aislan Silva Costa disse:

void inserir(lista *lista, livro *livro)
{	if ((NULL == lista) || (NULL == livro)) return;
 
 	no *new= malloc(sizeof(no));
	if (NULL == new) return;
 
	new->livro= (*livro);
	new->nproximo= ?;
 
 	lista->quantidade++;
	if (NULL == lista->primeiro) lista->primeiro= new;
 	else
	{	no* index= lista->primeiro;
		while (NULL != index->nproximo) index= index->nproximo;
     
		index->nproximo= ?;
	}
}

 

@Aislan Silva Costa Nesse contra exemplo: Substitua a interrogação pelo que você acha certo.

adicionado 5 minutos depois

Editado: new->nproximo= ?;

adicionado 11 minutos depois

Uma observação aqui no->livro não é um ponteiro e sim um dado.

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 minuto atrás, AnsiC disse:

o *

@AnsiC , conseguiria elaborar pra mim um código, no formato com as três struct's para a passagem delas?

 

Ou seja, struct livro, struct no, e struct lista, no qual na função inserir, recebe uma lista e um livro, cria um novo no, coloca o livro recebido dentro desse nó, e o nó por sua vez entra na lista. Sem necessitar de incluir lista, focar apenas na passagem das structs, no caso essa lista tem um unico elemento, apenas para teste?

 

Minha duvida não e com lista encadeada, mas com  a passagem da struct.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Aislan Silva Costa disse:

no caso essa lista tem um unico elemento, apenas para teste?

Sim, a lista tem apenas o primeiro nó. Quando for necessário acessar o último nó; deverá pegar o ponteiro primeiro que dará acesso ao próximo livro e depois o próximo e assim em diante através dos nós.

adicionado 16 minutos depois
2 horas atrás, Aislan Silva Costa disse:

conseguiria elaborar pra mim um código, no formato com as três struct's para e a passagem delas?

#include <stdlib.h>
#include <stdio.h>

typedef struct Livro
{   int id;
} livro;

typedef struct No
{   livro lv;
    struct No* nproximo;
} no;

typedef  struct Lista
{   int quantidade;
    no* primeiro;
} lista;

void add(lista* lt, livro* lv);

int main(void)
{	livro lv= {.id= 2332};
	lista lt= {.quantidade= 0, NULL};

   	add(&lt, &lv);

   	printf("O primeiro livro da lista tem id= %d\n", lt.primeiro->lv.id);
   	return EXIT_SUCCESS;
}

void add(lista* lt, livro* lv)
{	if ((NULL == lt) || (NULL == lv)) return;
 
 	no *novo= malloc(sizeof(no));
	if (NULL == novo) return;
 
	novo->lv= (*lv);
	novo->nproximo= NULL;
 
 	lt->quantidade++;
	if (NULL == (lt->primeiro)) lt->primeiro= novo;
 	else
	{	no* index= lt->primeiro;
		while (NULL != (index->nproximo)) index= index->nproximo;
     
		index->nproximo= novo;
	}
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!