Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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






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

×