Ir ao conteúdo
  • Cadastre-se

Problemas com lista ligada em c


tiago89

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

  • 6 meses depois...

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);

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
Compartilhar em outros sites

Arquivado

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

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!