Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

viciado

Lista Duplamente Encadeada

Recommended Posts

Estou tentando fazer lista duplamente encadeada em c, só que não entendi muito bem a teoria. O código está assim:

 

typedef struct lista
{
	int dado;
	struct lista *ant;
	struct lista *prox;
} LISTA;

void inserir_posterior(LISTA *L, int n)
{
	LISTA *aux;
	
	aux = (LISTA *) malloc(sizeof(LISTA));
	aux->dado = n;
	aux->prox = L->prox;
	aux->ant = *L;
	L->prox = *aux;
}

Eu sei que não está correto, quais os meus erros na parte teoria de listas e na parte da linguagem ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma lista duplamente encadeada possui elementos com ponteiros p/ o elemento anterior e p/ o próximo. Só isso.

Se L = { int a = 3; ant = 0x038385; prox = 0x07fa82}, o teu aux = { n = -10; prox = 0x07fa82; ant = (conteudo do endereco de L) } e L->prox = (conteudo de aux).

O certo é, se L é o ultimo elemento da lista:

 

aux->prox = NULL;

aux->ant = L;

L->prox = aux;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma lista duplamente encadeada possui elementos com ponteiros p/ o elemento anterior e p/ o próximo. Só isso.

Se L = { int a = 3; ant = 0x038385; prox = 0x07fa82}, o teu aux = { n = -10; prox = 0x07fa82; ant = (conteudo do endereco de L) } e L->prox = (conteudo de aux).

O certo é, se L é o ultimo elemento da lista:

 

aux->prox = NULL;

aux->ant = L;

L->prox = aux;

 

Tentei assim:

#include <stdio.h>

typedef struct lista
{
        int dado;
        struct lista *ant;
        struct lista *prox;
} LISTA;

void cria_lista(LISTA *L)
{
	L = NULL;
}

void inserir_posterior(LISTA *L, int n)
{
        LISTA *aux;
        
        aux = (LISTA *) malloc(sizeof(LISTA));
        aux->dado = n;
        aux->prox = NULL;
		aux->ant = L;
		L->prox = aux;
}

void imprime(LISTA *L)
{
	while(L->prox != NULL)
		{
			printf("%d \n",L->dado);
			L = L->prox;
		}
}

int main()
{
	LISTA l;
	cria_lista(&l);
	inserir_posterior(&l,10);
	inserir_posterior(&l,20);
	inserir_posterior(&l,30);
	imprime(&l);
	return 0;
}

O programa não deu erro, porém exibiu a seguinte mensagem:

4200336

Compartilhar este post


Link para o post
Compartilhar em outros sites

gcc é um compilador. Você precisa do gdb.

Se estiver no netbeans ou no eclipse, eles tem um modo de depuração.

Compartilhar este post


Link para o post
Compartilhar em outros sites

gcc é um compilador. Você precisa do gdb.

Se estiver no netbeans ou no eclipse, eles tem um modo de depuração.

 

Eu não sei o que é depuração. Mais o código está correto ? Pq está estranho o q o programa está imprimindo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é desculpa. Depuração é usado independente do assunto que você está estudando.

A primeira pessoa que deve possuir condições de verificar os erros do código é o autor do mesmo.

Você continua se batendo com ponteiros e sequer pára p/ aprender a usar um depurador porque é mais rápido e fácil postar o código e esperar que algum trouxa do fórum entregue a resposta completa, como acontece com vários que postam no fórum. E não importa o quanto falem p/ ler mensagens de compilador, colem links ou criem tópicos ensinando como usar uma ferramenta de desenvolvimento, como o Victor já fez com o GCC.

Se você quer virar programador, já deveria ter mudado o comportamento faz tempo e demonstrado algum interesse e iniciativa em ir atrás das coisas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é desculpa. Depuração é usado independente do assunto que você está estudando.

A primeira pessoa que deve possuir condições de verificar os erros do código é o autor do mesmo.

Você continua se batendo com ponteiros e sequer pára p/ aprender a usar um depurador porque é mais rápido e fácil postar o código e esperar que algum trouxa do fórum entregue a resposta completa, como acontece com vários que postam no fórum. E não importa o quanto falem p/ ler mensagens de compilador, colem links ou criem tópicos ensinando como usar uma ferramenta de desenvolvimento, como o Vitor já fez com o GCC.

Se você quer virar programador, já deveria ter mudado o comportamento faz tempo e demonstrado algum interesse e iniciativa em ir atrás das coisas.

 

O que essa mensagem tem a ver como lista duplamente encadeada ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo. Tem a ver com lista duplamente encadeada, com hashtable, com raw sockets, com exploit return-to-libc, buffer overflow, heap corruption, IPC, threads, escalonamento de processos...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo. Tem a ver com lista duplamente encadeada, com hashtable, com raw sockets, com exploit return-to-libc, buffer overflow, heap corruption, IPC, threads, escalonamento de processos...

 

Na boa, não quer ajudar não responde

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tentei assim:

 

#include <stdio.h>

struct no
{
	int info;
	struct no *ant, *prox;
};

typedef struct no *LISTA;

LISTA criar(LISTA L)
{
	L = NULL;
	return L;
}

LISTA aloque(LISTA L)
{
	L = (LISTA) malloc(sizeof(struct no));
	return L;
}

void ins_posterior(LISTA L, int num)
{
	LISTA aux, temp;
	aloque(aux);
	aloque(temp);
	if(L==NULL)
	{
		aux->info = num;
		aux = L->prox;
		aux->ant = L;
	}
	else
	{
		temp = L->prox;
		L->prox = aux;
		aux->ant = L;
		aux->prox = temp;
		temp->ant = aux;
	}
}

void display(LISTA L)
{
	LISTA aux;
	aux = L;
	printf("\n LINKED LIST \n");
	while(aux!=NULL)
	{
		printf("%d \n",aux->info);
		aux = aux->prox;
	}
}

int main()
{
	LISTA l;
	criar(l);
	ins_posterior(l,10);
	ins_posterior(l,20);
	ins_posterior(l,30);
	display(l);
	return 0;
}

Ao executar o programa aparece a mensagem do windows:

A instrução no "0x00401321" fez referência à memória no "0x77bf2850". A memória não pôde ser "written"

 

No gdb aparece a seguinte mensagem:

Program received signal SIGSEGV, Segmentation fault.

0x0040134f in ins_posterior <L=0x241378, num=10> at lista.c:38

38 aux->ant = L;

Compartilhar este post


Link para o post
Compartilhar em outros sites
Na boa, não quer ajudar não responde

Não tá a fim de aprender a programar, não tente.

Agora que magicamente você sabe o que é o gdb e um depurador, a mensagem é bem explicativa: não se pode acessar o endereço de memória p/ escrita.

Foi na linha 38 ver o que está acontecendo? Criou breakpoint p/ ver o estado das variáveis?

O gdb tem o comando help. Reveja a função de inserção inteira.

E atente para o fato comum de que argumentos de função são desempilhados qdo a função termina de executar e retornar algo para o nada não faz nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na boa, não quer ajudar não responde

Não tá a fim de aprender a programar, não tente.

Agora que magicamente você sabe o que é o gdb e um depurador, a mensagem é bem explicativa: não se pode acessar o endereço de memória p/ escrita.

Foi na linha 38 ver o que está acontecendo? Criou breakpoint p/ ver o estado das variáveis?

O gdb tem o comando help. Reveja a função de inserção inteira.

E atente para o fato comum de que argumentos de função são desempilhados qdo a função termina de executar e retornar algo para o nada não faz nada.

 

Sim não pode acessar o endereço para escrita, só não sei pq nao pode.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Sim não pode acessar o endereço para escrita, só não sei pq nao pode.

Então use o depurador e descubra. É p/ isso que serve.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim não pode acessar o endereço para escrita, só não sei pq nao pode.

Então use o depurador e descubra. É p/ isso que serve.

 

Tentei esse outro programa que eu já tinha no pc, também aparece essa mensagem de erro do windows

 

#include <stdio.h>

struct no
{
	int info;
	struct no *prox;
};

typedef struct no *lista;

void inic(lista *l)
{
	*l = NULL;
}

void ins_fim(lista *l, int num)
{
	if(*l==NULL)
	{
		*l = (lista)malloc(sizeof(struct no));
		if(*l==NULL)
			exit(1);
		(*l)->info = num;
		(*l)->prox = NULL;
	}
	else
		ins_fim(&(*l)->prox, num);
}

void ins_inicio(lista *l, int num)
{
	lista aux;
	aux = (lista)malloc(sizeof(struct no));
	if(aux==NULL)
		exit(2);
	aux->info = num;
	aux->prox = *l;
	*l = aux;
}

void exibir(lista l)
{
	if(l=NULL)
	{
		puts("Lista vazia");
		exit(3);
	}
	else
	{
		printf("%d \n",l->info);
		exibir(l->prox);
	}
}

int main()
{
	lista L;
	inic(&L);
	ins_fim(&L,10);
	ins_inicio(&L,20);
	ins_inicio(&L,30);
	ins_fim(&L,40);
	exibir(L);
	return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

P/ você usar o depurador, tem que compilar o fonte com -g.

você define breakpoint usando b <NUM_LINHA>, lista o fonte com l [<NUM_LINHA>], executa usando r, prossegue 1 passo com s, avança até o próximo breakpoint com c e exibe as variáveis com display ou print.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.