Ir ao conteúdo

Posts recomendados

Postado

Estou com dúvida na inicialização e criação da lista.Vi uma definição de criar uma lista e eu não entendi o "if( lista != NULL)", pois a lista já não vai começar sem nada ? Ela não seria = NULL ?

typedef struct no_ NO;

struct no_{
	ITEM item;
	NO *proximo;
};

struct lista_{
	NO *inicio;
}

/* Criação e inicialização da lista */

LISTA* lista_criar(void){
	LISTA *lista = (LISTA*) malloc(sizeof(LISTA));
	if(lista != NULL){
		lista->inicio = NULL;
	}
	return(lista);
}

 

Postado

Numa lista encadeada, deve sempre existir, ao menos, o primeiro elemento. Então a lista não pode ser de todo vazia. E ele é criado na função lista_cria:

LISTA *lista = (LISTA*) malloc(sizeof(LISTA));

o "if( lista != NULL)" serve para verificar se realmente o elemento inicial da lista foi criado e alocado na memória de fato.

 

  • Obrigado 1
Postado
33 minutos atrás, blvsman disse:

Estou com dúvida na inicialização e criação da lista.Vi uma definição de criar uma lista e eu não entendi o "if( lista != NULL)", pois a lista já não vai começar sem nada ? Ela não seria = NULL ?

 

Isso não tem a ver com Lista e sim o fato de lista ser um ponteiro.
 

LISTA*             lista = NULL;
int*               umInt = NULL;
CADASTRO*          cad = NULL;
char**             argv = NULL;

 

Um ponteiro para qualquer coisa é só um container: pode apontar para algo de um certo tipo, como um outro ponteiro. Quando você coloca NULL lá é como um seguro de que não vai apontar para algo a olho na memória. Ele nunca está "vazio", já que ele próprio tem um endereço e lá tem alguma coisa.

E como tem alguma coisa você pode escrever *umInt e ver o valor do int que está naquele endereço. Só que se ele não se referir a algo alocado em seu programa e você ler vai ler algo que não tem nenhum sentido prático. E se tentar gravar lá vai cancelar seu programa. A diferença entre a gíria "mostrar lixo de memória" e o erro de segmentação

 

Em relação a LISTA, é critério do programa achar que uma lista não iniciada está vazia. Vazia está.

 

15 minutos atrás, Flávio Pedroza disse:

Numa lista encadeada, deve sempre existir, ao menos, o primeiro elemento. Então a lista não pode ser de todo vazia

 

Bem... Não exatamente. Uma lista não é um nó. Se usar como tal só  vai ter mais trabalho. Essas estruturas tipo containers, como eu disse no outro post, tem dados dentro. E tem um suporte. Vamos chamar de metadados e payload:

 

Exemplo
 


struct no
{
    void*      item;
    struct no* next;
    struct no* prev;
};  // no
typedef struct no Node;

struct a_propria_lista
{
    char*     nome;
    unsigned  quantos;
    unsigned  maximo;
    Node*     inicio;
    Node*     fim;
};
typedef struct a_propria_lista Lista;

 

  • payload aqui é o item, um ponteiro para void. Assim a lista pode conter qualquer coisa e para usar em um novo programa não precisa nem compilar, dependendo do modo como construiu: basta o #include para compilar e um arquivo tipo lib ou DLL com o código compilado na última versão, Como faz em C++ se quer usar list:
    #include <list>
  • metadados aqui são o resto: nome, quantos, máximo e os ponteiros

E assim uma lista vazia não tem nenhum nó. Criar uma lista não envolve nós e pode ser algo como
 

Lista* criar(const char* nome)
{
    Lista* nova = (Lista*)malloc(sizeof(Lista));
    nova->nome = (char*)malloc(1 + strlen(nome));
    strcpy(nova->nome, nome);
    nova->quantos = 0;
    nova->maximo = 0;
    nova->inicio = NULL;
    nova->fim = NULL;
    return nova;
};  // criar()

 

E você cria uma chamando apenas
 

	Lista* teste = criar("Primeira Lista");

 

 

 

Postado
Em 28/09/2020 às 10:23, blvsman disse:

Estou com dúvida na inicialização e criação da lista.Vi uma definição de criar uma lista e eu não entendi o "if( lista != NULL)", pois a lista já não vai começar sem nada ? Ela não seria = NULL ?

 

Em geral, os primeiros passos que nós alunos/professores entregamos de estruturas de dados é esse exemplo, mais que elementar; lista é variável de estrutura ou somente o ponteiro para primeiro nó.

"

 

— Quando se trada do modelo tradicional,

Certamente se diz que ...

Em 28/09/2020 às 10:50, Flávio Pedroza disse:

Numa lista encadeada, deve sempre existir, ao menos, o primeiro elemento. Então a lista não pode ser de todo vazia. E ele é criado na função lista_cria:

 

... A Cabeça da lista (head cell) é um célula (NO) de conteúdo ignorado que se usa em uma lista encadeada como um marcador de início.

 

C'11

NO *lista_de_afazeres_domesticos= NULL;
lista_de_afazeres_domesticos= malloc (sizeof (NO));
/* ... */
if (lista_de_afazeres_domesticos != NULL) {
	lista_de_afazeres_domesticos->prox= NULL;
}

"

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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...