Ir ao conteúdo
  • Cadastre-se

C Soma de valores usando Lista Duplamente Encadeada em C.


Posts recomendados

Olá, estou criando um programa para uma matéria da  Universidade onde esse programa recebe dois strings de números decimais gigantes inserido pelo usuário  e mostra a soma desses números em uma terceira lista( as outras duas estão recebendo os valores) em uma Lista Duplamente Encadeada em C. Portanto estou com  uma grande dificuldade de fazer algumas funções desse programa como a Generate ( onde gera uma lista a partir de uma string de números decimais como citado anteriormente, e que recebe um parâmetro Char para esses números) , Sum ( função na qual recebe esses valores e faz a soma deles) e a função Destroy( que faz a destruição  de uma lista ou mais ).

 

LDouble.h

#ifndef DUPLAMENTE_LISTA
#define DUPLAMENTE_LISTA

typedef struct double_linked TDList;
typedef struct no TNo;

TDList* TDList_create();
void TDList_destroy(TDList*);
TDList* TDList_generate(char*);
/**
 * Gera uma lista a partir de uma string de numeros decimais. 
 * Retorna uma lista duplamente encadeada representando a sequencia. 
 * @return: TDList*
 * @param: char* o numero como uma cadeia de caracteres. Ex.: "1234567897987987"
 **/

TDList* TDList_sum(TDList*, TDList*);
/**
 * Toma duas listas duplamente como parametro, representando inteiros gigantes e gera uma terceira lista
 * sendo um outro numero possivelmente gigante representando a soma. 
 * @param: ponteiros para listas duplamente encadeada representando dois numeros inteiros positivos possivelmente gigantes.
 * @return: retorna o ponteiro para uma lista duplamente encadeada representando outro numero possivelmente gigante 
 * (resultado da soma dos dois numeros de parametro)
 **/

void TDList_print(TDList*);
/*
 * Imprime a lista duplamente encadeada como sendo um numero inteiro gigante.
 * Os numeros deverao ser impressos um ao lado do outro sem espaco e com um \n no final da lista.
 * @param: ponteiro para lista duplamente encadeada que representa um numero inteiro positivo.
 */

#endif

 

LDouble.c

#include <stdlib.h>
#include <stdio.h>
#include "LDouble.h"
  
struct no{
  int info;
  struct no *prox, *ant;
};

struct no* TNo_createnfill(int info){
  struct no* novo = (struct no*) malloc(sizeof(struct no));
  if(novo){
    novo->info = info;
    novo->prox = NULL;
    novo->ant = NULL;
  }
  return novo;
}
struct double_linked{
  struct no *inicio;
  struct no *fim;
};

TDList* TDList_create(){
  TDList* nova = (TDList*) malloc(sizeof(TDList));
  if(nova){
    nova->inicio = NULL;
    nova->fim = NULL;
  }
  return nova;
}
TDList* TDList_sum(TDList* list){
  //Função com dificuldade para fezar.
}

TDList* TDList_generate(char*){
  //Função com dificuldade para fezar.
}

void TDList_destroy(TDList* list){
  //Função com dificuldade para fezar.
  
}

void TDList_print(TDList* list){
  if(list){
    struct no* aux = list->inicio;
    while(aux){
      printf("%d", aux->info);
      aux = aux->prox;
    }
    puts("");
  }
}

 

main.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "LDouble.h"
/**
 * Problema: representacao de inteiros gigantes usando lista duplamente encadeada.
 * Para testar: ./a.out 123123123 123123123123121
*/

int main(int argc, char* argv[]){
  if(argc>2){
    TDList* num1 = TDList_generate(argv[1]);
    TDList* num2 = TDList_generate(argv[2]);
    TDList* sum = TDList_sum(num1, num2);
    TDList_print(sum);
    TDList_destroy(num1);
    TDList_destroy(num1);
    TDList_destroy(sum);
  }
  return 0;
}

 

A seguir a questão, caso estejam com alguma dúvida relacionado ao que falei acima.

1412841122_questoemDuvida.png.6820c1ca4d4da36c6d56087dd830e805.png

 

E agradeço muito a ajuda de quem me ajudar.

Link para o post
Compartilhar em outros sites


Acho que sua primeira preocupação deve ser separar o lance da lista ligada do resto do problema, do fato de que nesse caso está usando a lista para somar dois números. A lista é apenas um container e manter as coisas separadas vai fazer seu programa ficar muito mais fácil.

 

Escreva (e teste) separadamente

  • Curtir 2
Link para o post
Compartilhar em outros sites

Uma vez resolvida a parte da lista, a soma usa o algoritmo do ensino fundamental (primário): alinha os valores pela direita e soma. Passou de 10 "vai um" e tal. Nada mais.

 

Como o simples é somar a partir das unidades use os ponteiros a partir do fim da lista. E seja esperto e GUARDE na lista esses ponteiros....

 

Veja esse exemplo
 


typedef struct no_
{
    void*      item;
    struct no_* proxima;
    struct no_* anterior;

}   Node;  // um no

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

}   Lista;

 

A lista é uma lista de Node, mas tem um total de nós e um ponteiro para o início e para o fim. É disso que você precisa. A menos que queira ficar guardando ponteiros pra todo lado na hora de somar. Em item estariam os dígitos dos números, claro. E pode trocar o void* item por char digito

 

Há muitos exemplos de lista aqui no forum. Eu por exemplo já postei muitos e pode pesquisar no conteúdo

  • Curtir 1
Link para o post
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...

Aprenda a ler resistores e capacitores

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!