Ir ao conteúdo
  • Cadastre-se

C Problema de alocação de endereco de lista encadeada


smfraga

Posts recomendados

Estou com uma dúvida sobre a correta alocação de memoria em meu codigo. Quando vejo o print dos enderecos dos proximos nós, aparece o mesmo valor. Eu quero encadear a lista para armazenar uma sequencia de inteiros, sendo o int inserido pelo usuario sendo destinado ao final da lista. Tentei seguir alguns manuais de lista encadeada, mas me perdi nessa parte. Onde estaria(m) o(s) erro(s)? Segue o codigo:

#include <stdlib.h>
#include <stdio.h>
typedef struct noh noh;
struct noh
{
    int elem;
    noh*prox;
};

int main ()
{
    noh *p,
        *inicio=NULL,
        *q;
    int n, i, a;


    //inicio->elem=22;
    //inicio->prox=p;

    inicio = (noh*)malloc(sizeof(noh));
    p = (noh*)malloc(sizeof(noh));
    q = (noh*)malloc(sizeof(noh));
    p=inicio;
    q=inicio->prox;

    printf("Quantos elementos serao inseridos para serem reordenados?");
    scanf ("  %d", &n);

    for (i=0; i<n; i++)
    {
        if(p==NULL || q==NULL)///teste de alocacao de memoria
        {
            printf("Falha na alocacao de memoria!\n");
            system("pause");
            exit(1);
        }
        if(i==0)
        {
            printf ("Digite o primeiro elemento: ");
            scanf("  %d", &inicio->elem);
            printf (" inicio -> prox  %d\n", inicio->prox);
            q=inicio->prox;
        }

        else
        {
            p=(noh*)malloc(sizeof(noh));
            q=(noh*)malloc(sizeof(noh));
            printf ("\nDigite o %d-esimo numero: ", i+1);
            scanf ("  %d", &q->elem);
            printf("q->prox   %d\n", q->prox);
            p=q;
            q=q->prox;
        }

    }
    q->prox=NULL;
    p=inicio->prox;
    while(p->prox != NULL)
    {
        printf("%d\n", p->elem);
        p = p->prox;
    }
    system ("pause");
    return 0;

Link para o comentário
Compartilhar em outros sites

@smfraga Olá. Um bom material q posso te passar com respeito a listas encadeadas seria esse:

ListaEncadeada - Cap10.pdf

Espero q ajude!

Obs: Pelo q entendi do enunciado do exercício você quer cada novo elemento do tipo int q o usuário digitar seja inserido no final da lista? Se é isso mesmo uma das formas p se fazer isso seria essa:

#include <stdlib.h>
#include <stdio.h>

struct noh
{
    int elem;
    struct noh *prox;
};

typedef struct noh noh;

noh *inserir_ordenado(noh *n, int elem) {

    noh *novo = malloc(sizeof(noh));
    noh *ant = NULL;
    noh *p = n;

    novo->elem = elem;

    while (p != NULL) {
        ant = p;
        p = p->prox;
    }

    if (ant == NULL) {
        novo->prox = n;
        n = novo;
    } else {
        novo->prox = ant->prox;
        ant->prox = novo;
    }

    return n;
}

void imprimir(noh *n) {

    printf("\n");

    noh *p = n; // para percorrer a lista

    do {
        printf("%d ", p->elem);
        p = p->prox;
    } while (p != NULL);

    printf("\n\n");
}

int vazia(noh *n) {
    return (n == NULL);
}

void liberar(noh *n) {

    if (!vazia(n)) { // se a lista não está vazia...
        liberar(n->prox); // libera primeiro as sub-listas
        free(n); // libera a lista
    }
}

int main () {

    noh *noh = NULL;
    int valor, n;
    int i;

    printf("Quantos elementos serao inseridos para serem reordenados?: ");
    scanf ("%d", &n);

    for (i = 0; i < n; i++) {
        if (i == 0) {
            printf ("\nDigite o primeiro elemento: ");
            scanf("%d", &valor);
            noh = inserir_ordenado(noh, valor);
        } else {
            printf ("\nDigite o %d-esimo numero: ", i + 1);
            scanf ("%d", &valor);
            noh = inserir_ordenado(noh, valor);
        }
    }

    if (!vazia(noh)) // se a lista não está vazia imprime os elementos
        imprimir(noh);
    else
        printf("\nA lista esta vazia!\n\n");

    liberar(noh); // libera a memória alocada para a lista

    system ("pause");

    return 0;
}

Se estou correto na maneira como entendi o enunciado ok. Já se não é isso seria preciso você explicar melhor exatamente o q deseja fazer, ok?

Se houver dúvidas com relação a esse código q postei basta olhar o material q estou te passando e vai entender bem o q está sendo feito em cada função

Link para o comentário
Compartilhar em outros sites

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