Jump to content

Problema com listas ligadas


Tiago Andrade

Recommended Posts

Olá,

Estou aqui com um problema de segmentation fault, que antes não acontecia.

O que eu queria era o programa gruardar nós novos no fim da lista.

Já tinha escrito esta parte e funcionava. Mas agora, depois de ter reiniciado o PC, e de ter voltado para o projecto, agora esta a dar este erro..

O que poderá ser.

void equipa_inserir(char* nome, char* cidade, int pontos, Equipa p) //recebe os parametros e a lista.
{
Equipa aux, ult;
ult=p; //iguala um ponteiro ao outro para se poder movimentar.
aux = (Equipa) malloc (sizeof(Equipa_lista));
aux->nome = nome;
aux->cidade = cidade;
aux->pontos = pontos;
aux->next = NULL;
if (ult != NULL)
{
	while(ult->next != NULL) //a minha intensão é fazer com que o ponteiro avance ate ao ultimo nó.
	{
		ult = ult->next;  //O erro está aqui! Onde aparece Segmentation fault.
	}
	ult->next=aux;
}
}

Será que alguem me pode ajudar?

Obrigado

Link to comment
Share on other sites

Podes mostrar como é que é feita a chamada à função, com os restantes dados associados?

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

Este é um bocado do main onde depois faço a chamada a função

Equipa iniciar_eq(void){
   Equipa p = (Equipa) malloc (sizeof(Equipa_lista));
   FILE *fp = fopen("listaequipas.txt", "r");
   char line[MAX];
   while (fgets(line, MAX, fp) != NULL) {
    char* nome = (char*) malloc (MAX * sizeof(char));
    char* cidade = (char*) malloc (MAX * sizeof(char));
    int pontos;
    sscanf(line,"%[^-]-%[^-]-%d", nome, cidade, &pontos);
    equipa_inserir(nome, cidade, pontos, p);
   }
   fclose(fp);
   return p;
}
Link to comment
Share on other sites

Eu diria para fazeres um clean and build. Tirando o facto de o primeiro nó da lista não conter informação, o resto parece estar bem.

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Link to comment
Share on other sites

Quando entra na função p tem os valores que o malloc atribuiu.

acabaste de me dar informação suficiente para saber onde está o problema ... o problema que é também tens informação necessária para saber onde está o problema

o malloc não atribui nada ao bloco de memória alocada.

isto implica que o valor do parâmetro "next" da estrutura alocada "p" tem lixo, isto implica normalmente que é um valor sem significado diferente de 0.

quando na função "equipa_inserir" executas o seguinte código:

if (ult != NULL) { // ult é um ponteiro que terá o valor de "p"
   while(ult->next != NULL) { // o valor de utl->next é lixo, um valor número sem significado
       ult = ult->next;  // o valor ult terá o valor do lixo
   }
   // o ciclo por ventura acabará quando o lixo terá o valor de 0
   ult->next=aux; // o segmentation fault acontece aqui !!! estás a fazer uma atribuição numa posição de memória que (normalmente) é reservada
}

para resolver o teu problema basta que faças um memset ou em vez de malloc, chames um calloc.

nota : passo não obrigatório mas de boa programação = inicialização das variáveis

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.