Ir ao conteúdo

Posts recomendados

Postado

estou fazendo um codigo para somar 2 listas encadeadas de numeros inteiros, porém sempre fica dando "signal: segmentation fault(core dumped)" no repl.it e "runtime error" no compilador da propria faculdade. Com a entrada "12 21" sai o resultado parcial:

"O valor é: 2 

12

1

1634545454
signal: segmentation fault(core dumped)"

Além disso, a funçao "libera" e "retira" também dão o mesmo erro. Isso, porque eu fiz literalmente igual ao codigo exemplo da professora. 

/* Programa: Exercício 4

Autor: Lucas Praxedes Fischer de Mattos (RA 156697)

Turma: IB

Concluída em: 16/11/2021*/



#include <stdio.h>

#include <stdlib.h>

#include <string.h>



#define MAX 100



typedef struct lista{

int digt;

struct lista *prox;

} reglista;

typedef reglista *pont;



pont alocacao(pont lista, int val){

pont novo=(pont)malloc(sizeof(reglista));

novo->digt= val;

novo->prox= lista;

return novo;

}



pont retira(pont lista, int val){

pont ant= NULL, busca;

for(busca=lista; busca!=NULL && busca->digt!=val; busca=busca->prox)

ant= busca;

if(busca==NULL)

return lista;

if(ant==NULL)

lista=busca->prox;

else

ant->prox=busca->prox;

return lista;

}



void libera(pont lista){

  pont paux=lista, paux2;

while(paux!=NULL){

paux2=paux->prox;

free(paux);

paux=paux2;

}

}



void imprime (pont lista) {

pont paux;

for (paux = lista; paux != NULL; paux = paux->prox)

printf ("%d\n", paux->digt);

}



pont soma(pont lista1, pont lista2){

pont paux;

int val= lista1->digt + lista2->digt;



while(lista1->prox != NULL && lista2->prox != NULL){

if(val>9){

paux->prox->digt=1;

paux->digt=val-10;

}

else

paux->digt=+val;



lista1=lista1->prox;

lista2=lista2->prox;

paux=paux->prox;

val=lista1->digt+lista2->digt;

}



return paux;

}



int main(){

pont lista1, lista2, lista3;

char string1[MAX], string2[MAX];

int i=0;



scanf("%s", string1);

scanf("%s", string2);



while(i<strlen(string1)){

lista1=alocacao(lista1,atoi(&string1[i]));

i++;

}

i=0;

while(i<strlen(string2)){

lista2=alocacao(lista2,atoi(&string2[i]));

i++;

}

 

printf("O valor é: ");

imprime(lista1);

 

return 0;

}

Postado
Em 16/11/2021 às 19:16, lucas.praxedes disse:

Além disso, a funçao "libera" e "retira" também dão o mesmo erro. Isso, porque eu fiz literalmente igual ao codigo exemplo da professora. 

 

Talvez sua professora não tenha escrito assim um exemplo muito bom. Talvez até de propósito.

 

typedef struct lista
{
    int           digt;
    struct lista* prox;
} reglista;
typedef reglista* pont;

 

Essa acima é a sua definição dos dados. E não está nada boa. Vai ter um trabalho do infer no para conseguir algo com essa estrutura. E está ruim de ler.

 

Entenda que uma lista é um container. Uma lista de coisas. Essas coisas ficam em nós --- muitas vezes se escreve Nodes mesmo em português. Cada nó tem ou preferencialmente aponta para um dado, que pode ser qualquer coisa.

 

No seu caso é um int, mas podia ser uma letrinha, uma ficha complicada com dados de paciente, uma playlist com músicas, os tais livros da biblioteca, os exemplos clássicos que deve ter na sua lista :) 

 

Em geral também se espera algum tipo de ordem na lista e aí precisa de uma maneira de comparar dois nós. No seu caso é fácil: basta a popular aritmética. Se não tem ordem a única ordem possível é de entrada, e você deve escolher se os novos caras entram no fim ou no início da fila de nós.

 

Mas entenda: uma lista não é um nó. Um nó não é uma lista. Um nó não é o dado. Pode até programar assim mas só vai ter trabalho.

 

Contra-indicação :) 

 

Nunca escreva isso:

 

    typedef reglista* pont;

 

Não crie nomes que são ponteiros. Isso foi resolvido em C nos anos 70. Se Lista é uma estrutura então Lista* é o tipo de um ponteiro para Lista. Só esta criando problemas porque ao ver o nome vai ter que lembrar que é o ponteiro e não progrediu nadinha.

 

EXEMPLOS

 

    Lista lista; // a lista
    Lista* pL; // sim, pL é Lista* um ponteiro para Lista.
    
    pL = &lista; // & pega o endereco, pL é um ponteiro.

    Lista** pp = NULL; // ponteiro para um ponteiro

    pp = &pL; // ok, pp é Lista**

 

Uma convenção comum em C é reservar a primeira letra maiúscula para nomes definidos no programa e TODAS maiúsculas para constantes criadas por #define

 

EXEMPLO

 

Compare:

 

typedef int Dado;

typedef struct st_no
{
    Dado*         d;
    struct st_no* prox;
}   No;

typedef strcuct
{
    size_t size;
    No*    inicio;
}   Lista;

 

Isso é a sua Lista. E se chama Lista. E tem nós que são No. E eles tem um dado que é Dado. E que aqui é só um int.

 

Entende a diferença?

 

Você criou isso, talvez como sua professora

 

    pont              alocacao(pont lista, int val)

 

Mas podia ser

 

    Lista* cria_l();

 

Simples como

 

Lista* cria_l()
{
    Lista* nova = (Lista*)malloc(sizeof(Lista));
    nova->size  = 0;
    nova->inicio = NULL;
    return nova;
}

 

E assim podia declarar suas listas escrevendo o simples

 

    Lista* uma = cria_l();
    Lista* outra = cria_l();

 

Inserir em uma lista é inserir um dado em um nó e colocar o nó na lista, certo? Então não seria simples escrever
 

int    insere_l(Dado* d, Lista* L);

 

E se inserir ok a função retorna 0?

Note que dentro da Lista tem a coleção de nós mas tem também o tamanho. Não precisa controlar mais nada. 

 

E somar seria o que? Retornar uma lista com a soma. Se os tamanhos forem diferentes soma o que der, então a lista resultante terá tantos nós quanto a lista mais comprida das duas que for somar. Não deveria ser apenas

 

    Lista* soma_l(Lista* uma, Lista* outra);

 

Deveria. Sugiro escrever assim.

 

 

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!