Ir ao conteúdo
  • Cadastre-se
tiago89

Problemas com lista ligada em c

Recommended Posts

Olá pessoal beleza?

sou novo aqui no fórum.estou apanhando um pouco com esse negócio de estrutura de dados.bom o que eu quero faze é criar uma lista ligada com n inteiros obtidos de forma aleatória,só que a medida que o inteiro é obtido devo localizar a sua posição correta na lista.

aqui vai a definição das structs

typedef struct no No;
//struct para definir a lista
typedef struct{
int m;
No *head;
}llist_t;

//struct que define os nós
struct no{
int d;//o dado
No *q;//endereço para o próximo elemento
};

aí tenho uma função para criar a lista e uma função para inserir que recebe o ponteiro para a lista,o endereço do nó anterior e o dado a ser inserido.

meu problema está na função que deve localizar o endereço para que possa inserir.

:(

No *localizapontoinsercao(llist_t *p,int n)
{
int x=1;
int y;
No *aux;
y=p->m;
aux=p->head;
while(aux!=NULL)
{
if(n<aux->d)
break;
aux=aux->q;
}
return(aux);


}

esta função deve retornar um endereço que é passado para a função abaixo,só que retorna sempre zero e a inserção ocorre no mesmo ponto.

void geralistaordenada(llist_t *p,int n)
{
No *ponto;
int x,num=rand()%10;
ponto=p->head;
for(x=0;x<n;x++){
inserir(p,ponto,num);
num=rand()%10;
ponto=localizapontoinsercao(p,num);
printf("%d\n",ponto);

}

}

já tentei de tudo,peço a ajuda de vocês pois ainda tenho dificuldade em manipular ponteiros.acho que deve ter um pequeno erro na função localizapontoinsercao que eu não consigo encontrar.:wacko:

valeu

abraço a todos

Editado por Goliathvv
Utilize a tag [code] para destacar o trecho de código e tornar o texto mais legível. Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

e ae tiago beleza? sou novo por aqui tb mas espero te ajudar essa é minha struct

typedef struct noh NOH;
//struct q define o nó
struct noh {
int dado;
NOH *prox;
};

typedef struct {
int m;
NOH * head;
} llist;//Struct q define a lista

C eu entendi direito você qr q va inserindo valores em ordem crescente né???

essa sao as minhas funcoes ...

NOH *localizaPosicaoInsertCrescente(int d, llist *p) // onde d é o numero a ser inserido e *p a referencia da lista
{
NOH *pivo;
NOH *aux;

aux = NULL;
pivo = p ->head;//pivo referenciando o inico da lista
if(p->head == NULL)// se a lista for vazia retorna o inicio da lista
{
return(pivo);
}

while(pivo != NULL){

if(pivo -> dado > d)
{
break;
}
else
{
aux = pivo;
pivo = aux -> prox;
}
}
return (aux); //aqui esta retornando o noh anterio onde você qr q seja inserido o valor
}

void gerarListaCrescente(llist *p) {
int i;
int n;
NOH *pos;
srand(time(NULL));

for (i = 0; i < 10; i++)
{
n = rand() % 10;
pos = localizaPosicaoInsertCrescente(n, p);// aqui é onde a posiçao q você encontro vai ser retornada
llist_insert(n, pos, p);// e aqui insere na posiçao em ordem crescente
}
}

agora comentando do seu codigo eu mudaria algumas coisas ... mas nao sei c vai funcionar porque precisaria do codigo inteiro para entender ... mas tenta mudar isso:

na funçao localizapontoinsercao mude:

No *localizapontoinsercao(llist_t *p,int n)
{
int x=1;
int y;
No *aux;
No *pivo; // pivo é o nó anterior a posiçao q você quer inserir, q guarda a referencia do seu q
y=p->m;
pivo = NULL;
aux=p->head;
while(aux!=NULL)
{
if(aux -> d > n)
break;
else
pivo = aux
aux= pivo -> q;
}
return(pivo);//se eu retornasse o aux eu estaria retornando o valor maior q o valor q sera inserido

}

e na sua funçao de geralistaordenada

eu faria a chamada de inserção depois da funçao q localiza assim:

num=rand()%10;
ponto=localizapontoinsercao(p,num);
inserir(p,ponto,num);
printf("%d\n",ponto);

Editado por Goliathvv
Utilize a tag [code] para destacar o trecho de código e tornar o texto mais legível. Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Além do que nosso amigo acima já disse, diria a você para checar a inicialização dos atributos da sua estrutura.Dependendo da IDE que você estiver usando, tente utilizar a ferramenta de debug para checar possíveis invasões de espaço não autorizado.Abraços.

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

×