• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nitrous

problema a eliminar 1º elemento de uma lista ligada

3 mensagens neste tópico

Boas,

o problema com que me deparei neste momento foi de eliminar o 1º elemento da lista ligada.

E o seguinte:

seja qual for o elemento que quiser eliminar (excepto o 1º) apos o eliminar ja nao aparece quando faço a listagem.. mas caso queira eliminar o 1º.. quando vou a fazer a listagem no lugar onde estava o 1º elemento aparece como se o elemento tivesse informaçao "corrompida" :dontgetit:

Eis o codigo:

fichaCurso.h

#ifndef FICHACURSO_H
#define FICHACURSO_H
#define MAX_NOME 100
#define MAX_DESCRICAO 300

typedef struct TFichaCurso
{
    char nomeCurso[MAX_NOME+1];
    char descricaoCurso[MAX_DESCRICAO+1];
    unsigned short cicloCurso;
    struct TFichaCurso *fichaSeguinte;
} Elemento, *Ficha;

Ficha inserirCurso(Ficha fichaCurso);
void listarCursos(Ficha fichaCurso);
Ficha removerCurso(Ficha fichaCurso, char nome[]);
Ficha pesquisaCurso(Ficha fichaCurso, char nome[]);
#endif

fichaCurso.c

Ficha removerCurso(Ficha fichaCurso, char nome[])
{
    Ficha fichaEliminar;
    if(fichaCurso)
    {
        fichaEliminar = pesquisaCurso(fichaCurso, nome);
        if(fichaEliminar!=fichaCurso)
        {
            for(;fichaCurso->fichaSeguinte != fichaEliminar; fichaCurso = fichaCurso->fichaSeguinte);
            fichaCurso->fichaSeguinte = fichaEliminar->fichaSeguinte;
            free(fichaEliminar);                
            return fichaCurso;
        }
        else if(fichaEliminar == fichaCurso){
             fichaCurso = fichaEliminar->fichaSeguinte;
             free(fichaEliminar);
             return fichaCurso;}
        else
            printf("Nao existem cursos com o nome pretendido.\n");
    }
    else
    {
        fprintf(stderr, "Nao existem cursos.\n");
        system("pause");
        system("cls");
    }
}

Ficha pesquisaCurso(Ficha fichaCurso, char nome[])
{
      Ficha fichaPesquisa;
      for(fichaPesquisa=fichaCurso;fichaPesquisa;fichaPesquisa = fichaPesquisa->fichaSeguinte)
       if(strcmp(fichaPesquisa->nomeCurso,nome)==0)
           return fichaPesquisa;
}

Espero que me possam dar umas "luzes" :(

Obrigado pela atençao.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Entre vários problemas que tens no código, como por exemplo não ter um return em todas as execuções possíveis de pesquisarCurso, na função main (ou onde chamares a função removerCurso) tens que afectar a Ficha que passas como parâmetro com o resultado da função, senão vai ficar a apontar para a Ficha que apagaste.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ja consegui resolver o problema.. :-[

Nao estava a guardar a lista que a funçao removerCurso devolvia :-[, ou seja, ao chamar a funçao no menu tinha:

removerCurso(cursos,nome)

em vez de ter

cursos = removerCurso(cursos,nome)

  :(

Obrigado pela ajuda :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora