Ir ao conteúdo
  • Cadastre-se

C Exercicio de Lista com Ponteiros


Posts recomendados

Ola Boa tarde a todos,

 

Sou novo aqui no clube e preciso da ajuda de vocês para resolver esse exercicio abaixo, conseguem me ajudar?

 

Como as aulas na universidade estão remotas então estamos tendo pouco contato com professor com isso não estou conseguindo desenvolver este codigo em c.

 

Alguem pode desenvolver para mim, pois ja tentei varios videos mais nenhum explica muito bem como fazer, fico muito grato se alguem me ajudar.

 

Achei esse exercicio na net mais não tinha resolução do mesmo de como foi feito.

 

O exercicio e esse abaixo para desenvolver o codigo em c.

 

Seja L uma lista simplesmente encadeada implementada por meio de ponteiros (apontadores) composta de valores inteiros aleatórios. Escreva um algoritmo que, percorrendo a lista uma única vez, constrói novas listas L’ e L'' que:

 

a- (L') Possui os valores de L em ordem inversa

b-(L'') A nova lista L’'  possui a metade dos nós da lista original, onde o primeiro nó de L’' contém a soma do primeiro nó de L com o último nó de L, o segundo nó de L’' contém a soma do segundo nó de L com o penúltimo nó de L e assim por diante: L''= < L1+Ln, L2+Ln-1, L3+Ln-2, ... , Ln/2 + Ln/2+1>, onde n é sempre par.

  • Confuso 1
  • Triste 1
Link para o comentário
Compartilhar em outros sites

Atente para a garantia de que n é par. Era só o que importava.

 

O enunciado é vago e o problema e o programa são seus, então faça o simples: imagino que já tenha feito ao menos um programa que cria uma lista ligada, certo? Seria difícil de imaginar que o primeiro programa em C envolvendo listas no seu curso peça para criar 3... ;) 

 

Então sua dúvida não pode ser como criar uma lista dessas. Se for, então volte ao primeiro programa que escreveu e estude mais.

 

Escreva seu programa em torno dos dados.

 

Espero que não tenha cometido o erro de programar uma lista ligada como se fosse um nó, porque não é. Uma lista é uma coleção de nós. Um nó não é uma lista, uma lista não é um nó. Dentro de cada nó tem um dado, que pode ser só um número como nos programas para iniciantes, mas também pode ser algo como uma "ficha" que tem um dado. 

Se não declarou assim refaça seu programa anterior desse jeito.


Um exemplo óbvio de lista como container seria uma lista ligada de notas fiscais, onde a "chave" seria o número da nota, mas os dados seriam tudo o que tem na nota.
 

Se fez ao menos um programa desses de lista com ponteiros só para um lado e outro com ponteiros para os dois lados sabe já que ponteiros para um lado são um desperdício: só dá mais trabalho e tudo fica MUITO mais difícil. Então esqueça isso e use a versão com ponteiros para os dois lados.

 

De volta ao problema:

 

Programando em torno dos dados: como a lista é sua mantenha um ponteiro para o início da lista e outro para o final. E o óbvio contador de tamanho. Já tem a garantia de que vai usar um número par de nós :) . Se for impar na hora de criar as listas novas apenas esqueça o último nesse processo.

 

Para criar a lista inversa é trivial: apenas navegue para trás a partir do início inserindo na nova lista. Nada mais.

 

Para criar a lista com a soma dos nós também é trivial: Tem n dados, tem o ponteiro para o início da lista e para o final da lista. Sabe dividir por 2. Então:

  • declare dois ponteiros, um para o inicio e outro para o final da lista
  • divida n por 2 e terá o total de pares
  • some o valor apontado por cada um dos dois ponteiros e
    • insira um nó com esse valor na terceira lista
    • avance um retroceda o outro ponteiro até o valor calculado de nós.

Só isso.

 

Um exemplo de estrutura que já postei aqui com programas e resultado no ano passado (pode pesquisar no conteúdo que eu postei neste forum)
 

Exemplo

 

struct no
{
    void*      item;
    struct no* proxima;
    struct no* anterior;
};  // no
typedef struct no Node;

struct a_propria_lista
{
    char*     nome;
    unsigned  quantos;
    unsigned  maximo;
    Node*     inicio;
    Node*     fim;
};
typedef struct a_propria_lista Lista;

Lista*      apagar(Lista*);
Lista*      criar(const char*);
int         define_maximo(Lista* l, const unsigned);
Lista*      inserir_na_ordem(void*, Lista*, int(*)(void*, void*));
Lista*      inserir_no_inicio(void*, Lista*);
Lista*      inserir_no_final(void*, Lista*);
int         listar(Lista*);
int         listar_do_seu_jeito(Lista*, int(*)(void*));
int         maximo(Lista*);
Node*       primeiro(Lista*);
Lista*      remover(void*, Lista*);
int         tamanho(Lista*);
Node*       ultimo(Lista*);
int         vazia(Lista*);

//fim lista.h

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Boa tarde Galera, tudo bem?

 

Fiz esse programa, esta rodando mais não esta execultando tudo que o exercicio pede, onde acrescento mais? e como ficaria o codigo correto.

 

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

#define TAM 10

typedef struct celula *pcelula;
typedef struct celula{
    int valor;
    pcelula prox;
    

} celula;

    int main(int argc,char *argv[]){
    int i,j,B;
    B=TAM;
    pcelula aux,aux1,aux2,aux3;
    celula lista1,lista2,lista3;
    printf("ListaL\n");
    aux=&lista1;
    for(i=0;i<TAM;i++){
    aux->valor=i;
    aux->prox=(pcelula)malloc(sizeof(celula));
    aux=aux->    prox;
    aux->prox=NULL;
    
    }
    aux=&lista1;
    while(aux->prox!=NULL){
    printf("%d\n",aux->valor);
    aux=aux->prox;
    }    
    printf("Lista L'\n");
    aux2=&lista2;
    aux1=&lista1;
    for(i=0;i<TAM;i++){
    for(j=0;j<B;j++){
        aux1=aux1->prox;
    
    }
    aux2->valor=aux1->valor;
    aux2->prox=(pcelula)malloc(sizeof(celula));
    aux2=aux2->prox;
    aux2->prox=NULL;
    B--;
    
    }
    while(aux2->prox!=NULL){
    printf("%d\n",aux2->valor);
    aux2=aux2->prox;
    }
    printf("Lista L''\n");
    aux3=&lista3;
    aux2=&lista2;
    aux1=&lista1;
    for(i=0;i<TAM/2;i++){
        aux3->valor=aux2->valor+aux1->valor;
        aux3->prox=(pcelula)malloc(sizeof(celula));
        aux3=aux3->prox;
        aux2=aux2->prox;
        aux1=aux1->prox;
    }
        aux3=&lista3;
        while(aux3->prox!=NULL){
        printf("%d\n",aux3->valor);
        aux3=aux3->prox;
        }
        
    }

Link para o comentário
Compartilhar em outros sites

18 horas atrás, arfneto disse:

Espero que não tenha cometido o erro de programar uma lista ligada como se fosse um nó, porque não é. Uma lista é uma coleção de nós. Um nó não é uma lista, uma lista não é um nó. Dentro de cada nó tem um dado, que pode ser só um número como nos programas para iniciantes, mas também pode ser algo como uma "ficha" que tem um dado. 

 

Imagino que não tenha concordado com o que eu disse...

 

Você só vai ter muito mais trabalho escrevendo desse jeito. Recomendo muito fazer como eu disse. Até deixei uma estrutura de exemplo... Um nó nunca vai ser uma lista.

 

Ainda sobre isso
 

typedef struct celula *pcelula;
typedef struct celula{
    int valor;
    pcelula prox;

 

Não crie typedefs para ponteiros. Nada acrescentam. Só vai ficar mais díficil de ler seu programa. Em C está há muito estabelecido que se
 

	Celula		uma;

 

Então uma é Celula. E assim

 

	Celula*		pCelula;

 

pCelula é um ponteiro para Celula e seu tipo é Celula*. O asterisco indica isso na declaração. Em especial se deixar o asterisco junto ao tipo, já que está declarando pCelula. Não há razão para outro typedef.

 

Compare com isso:
 


typedef struct _cel
{
    int         valor;
    struct _cel prox;

}   Celula;

Celula		uma;
Celula		outra[200];
Celula*		pCelula = NULL;

 

Uma convenção comum é reservar nomes com a primeira letra em maiúscula para structs e typedefs. É comum também em java, javascript, C++ etc.

 

Compare com o modo como escreveu e tire suas conclusões.

 

19 horas atrás, arfneto disse:

Se fez ao menos um programa desses de lista com ponteiros só para um lado e outro com ponteiros para os dois lados sabe já que ponteiros para um lado são um desperdício: só dá mais trabalho e tudo fica MUITO mais difícil. Então esqueça isso e use a versão com ponteiros para os dois lados.

 

Imagino que mais uma vez não tenha concordado com o que eu disse...

 

Você só vai ter muito mais trabalho escrevendo desse jeito.

 

Crie e mantenha um ponteiro para o fim da lista. Mantenha um parâmetro tamanho --- size --- com o óbvio tamanho da lista. DENTRO da lista.

 

O modo como expliquei acima resolve seu problema em meia hora. Simplesmente escreva em torno dos dados e use os ponteiros. 

Ponteiros para um lado só são em geral um desastre e só complicam tudo. Em especial no seu caso.

Pense bem: qual a dificuldade de inverter a lista se tiver ponteiros para os dois lados e um ponteiro para o fim da lista já na estrutura? E um contador atualizado de itens... Dificuldade zero. Está tudo lá.

Para criar a terceira lista se sabe que sua lista tem, digamos 14 elementos? Mínima. Um for de 0 a 6 criando a nova lista percorrendo a original usando o ponteiro para o inicio na direção do fim e o ponteiro para o fim na direção do início, e somando os pares. Só isso...

 

Claro, vai conseguir do modo como está fazendo...

 

 

Link para o comentário
Compartilhar em outros sites

@Fagner Alves Rosa Não faz muito sentido alguém ter que baixar algo para então tentar te ajudar, e do jeito que falou está praticamente pedindo para que façamos seu trabalho de graça 😕

E não é sobre uma "forma correta", a discussão aqui trata de outra forma de fazer que é mais fácil, não é?

Link para o comentário
Compartilhar em outros sites

poste o programa aqui... 

Porque alguém que quer te ajudar vai ter que clicar em um ícone, baixar um arquivo, rodar um programa, salvar o arquivo e depois abrir no computador, se poderia fazer isso em um passo só aqui mesmo?

 

Sabe escrever funções? É importante nesse caso... Entenda que vai fazer a mesma coisa com todas as listas. Não acha que precisa mesmo repetir isso em vários lugares do seu programa, certo?

 

Para isso existem funções e estruturas de dados como listas, que são chamadas não por acaso de containers em C++ e coleções em java...

 

Seu programa vai criar e manter 3 listas diferentes. Deve ser a mesma coisa, 3 vezes. 

Link para o comentário
Compartilhar em outros sites

Lucca entendo seu ponto de vista,mais se tivesse olhado num post mais acima teria visto que fiz um codigo porém o mesmo esta rodando parcial ok.

 

Se eu quiser que alguem faça o trabalho pra mim primeiro eu vou pagar e depois a pessoa desenvolve para mim, porém tenho Consciência  que se eu não desenvolver não vou aprender certo.

 

Preciso de respostas mais claras e diretas, sobre o codigo tipo: tire isso e coloque isso no lugar, ou remova isso pois esta errado entendi.

 

textos e colunas de textos não resolve o problema preciso de clareza direto no codigo que esta sendo desenvolvido.

 

Mais obrigado pela atenção de vocês principalmente você arfneto me ajudou bastante. Obrigado vou procurar solucionar sozinho mesmo.

  • Haha 1
Link para o comentário
Compartilhar em outros sites

7 minutos atrás, Fagner Alves Rosa disse:

Se eu quiser que alguem faça o trabalho pra mim primeiro eu vou pagar e depois a pessoa desenvolve para mim, porém tenho Consciência  que se eu não desenvolver não vou aprender certo.

🤔

Em 22/01/2021 às 13:15, Fagner Alves Rosa disse:

Alguem pode desenvolver para mim, pois ja tentei varios videos mais nenhum explica muito bem como fazer, fico muito grato se alguem me ajudar.

🤣

  • Haha 1
Link para o comentário
Compartilhar em outros sites

5 minutos atrás, Fagner Alves Rosa disse:

Preciso de respostas mais claras e diretas, sobre o codigo tipo: tire isso e coloque isso no lugar, ou remova isso pois esta errado entendi

 

Eu te descrevi claramente o roteiro para montar as 3 listas.
 

image.png.46f117e861f2c924aa5b3658ab5a50a6.png

 

Isso qui ao lado...

 

E te disse o que NÃO fazer. Que foi o que você fez no seu programa.

 

E te expliquei porque vai dar m3rd@ se fizer como todo mundo: uma lista não é um nó. E é ingênuo ter ponteiros para um lado só a menos que precise realmente economizar os 4 ou 8 bytes de um ponteiro em uma lista de milhões de itens.
 

8 minutos atrás, Fagner Alves Rosa disse:

Preciso de respostas mais claras e diretas, sobre o codigo tipo: tire isso e coloque isso no lugar, ou remova isso pois esta errado entendi

 

Sobre claro e direto, lembre do que eu te disse para não fazer, quando for "solucionar sozinho mesmo".

 

9 minutos atrás, Fagner Alves Rosa disse:

textos e colunas de textos não resolve o problema preciso de clareza direto no código que esta sendo desenvolvido

 

Recomendo "começar sozinho" a partir de uma estrutura como a que te mostrei, que está pronta e funciona perfeitamente. Note que já postei programas aqui completos e com resultados usando essa mesma estrutura, de modo que pode, como eu te disse, pesquisar aqui no próprio catálogo do forum nas coisas que eu postei e baixar um ou mais programas que funcionam, em C ou C++. Não tenho um link agora.

 

 

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

 

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!