Jump to content

Ligar duas listas ligadas


Knot

Recommended Posts

Boas!

Estou a ter alguma dificuldade em ligar duas listas simplesmente ligadas.

A ideia é ter uma lista disciplinas (já criada e a funcionar bem) e depois de cada nó disciplina sai uma nova lista ligada Turno.

Estruturas da lista disciplina

typedef struct Disciplina
{
char codigo_dis[5];
char nome_disciplina[16];
int numero_alunos;
} *DISCIPLINA;

typedef struct Nodo
{
DISCIPLINA inf;
struct Nodo *seguinte;
LISTA_TURNO_T apontador1;
LISTA_TURNO_PL apontador2;
LISTA_TURNO_TP apontador3;
}*NODO;

typedef struct Lista_Disciplina
{
int nelementos;
NODO inicio;
} *LISTA_DISCIPLINA;

Depois as funções que criam a lista:

LISTA_DISCIPLINA criar_lista_disciplina()
{
LISTA_DISCIPLINA D;
D = (LISTA_DISCIPLINA)malloc(sizeof(struct Lista_Disciplina));
D->inicio = NULL;
D->nelementos = 0;
return D;
}

NODO criar_disciplina()
{
NODO D = (NODO) malloc(sizeof(struct Nodo));
D->inf = (DISCIPLINA) malloc(sizeof(struct Disciplina));
D->seguinte = NULL;
return D;
}

Estruturas do turno:

typedef struct Turno
{
char numero_turno[5];
char dia_da_semana[11];
char hora_inicio[6];
char duracao[6];
char sala[3];
char docente[MAX_DOCENTE];
int capacidade;
int numero_inscritos;
} *TURNO;

typedef struct Nodo_Turno
{
TURNO inf;
struct Nodo_Turno *seguinte;
} *NODO_TURNO;


typedef struct lista_turno_t
{
int nelementos;
NODO_TURNO inicio;
} *LISTA_TURNO_T;

Penso que agora tenho que usar o apontador LISTA_TURNO_T apontador1 da estrutura NODO para criar a lista turno, mas não estou a conseguir.

Isto é para funcionar do seguinte modo: Após criadas as disciplinas, vamos supor que criamos 3 disciplinas, no menu vamos inserir turno e é pedido "Qual a disciplina que quer inserir o turno?", o utilizador introduz a identificação da disciplina, é pesquisada se a disciplina existe e se existir introduz aí a lista turno correspondente.

Edited by Knot
Link to comment
Share on other sites

eu nem sei como isso compila ...

typedef
struct Nodo {
DISCIPLINA inf;
struct Nodo *seguinte;
LISTA_TURNO_T apontador1;
LISTA_TURNO_PL apontador2; // que tipo de dados é este ?? porque é diferente de LISTA_TURNO_T ??
LISTA_TURNO_TP apontador3; // que tipo de dados é este ?? porque é diferente de LISTA_TURNO_T ??
} *NODO;

no geral acho que a tua estrutura de dados esta demasiado rebuscada. não conheço o problema mas não parece bem ...

podes fazer post do problema ??

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

Podes ver aqui o enunciado completo.

http://tvdospobres.com/TrabPrat_ED_EI2012.pdf

Eu já criei as disciplinas, e funciona bem a lista das disciplinas, criar, remover, pesquisar.

Agora quero criar turnos, que ficam ligados às disciplinas. Por exemplo a Disciplina Sistemas Operativos vai ter um lista com os turnos teorios 1 e 2, outra lista com os turnos TP 1,2,3,4 e outra lista com os turnos PL 1,2,3,4.

É esta parte que pretendo fazer:

Opção 3.6 Inserir Turno Permite adicionar um novo turno a uma disciplina (deve pedir o código da disciplna previamente).

Link to comment
Share on other sites

o enunciado falta referenciar que alem da disciplina, necessitas de perguntar que tipo de turno vais inserir

Sim isso mesmo. Só que não estou a ver mt bem como fazer isso...Pedir a disciplina e turno é simples com uns printfs e uns scanfs, mas depois ligar o turno criado à respectiva disciplina é que já não sei...

Link to comment
Share on other sites

podes criar um menu dinâmico do género:

LISTA_DISCIPLINA * iter = ...
char op = 'a';

// ciclo de apresentação do menu dinâmico de disciplinas
while (iter != NULL) {
 printf("%c - %d\n", op, iter->nome); // apresenta a disciplina
 op++;
}

depois só necessitas de validar a opção escolhida

tomando 'a' como valor da primeira opção do menu dinâmico, tens o limite como

'a' + n_disciplinas

depois disso, necessitas de mais um menu a perguntar que tipo de turno

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

Não é a mesma coisa, nas disciplinas é uma única lista com vários nodos ligados, agora são várias listas ligadas de turnos, que por sua vez têm de estar ligadas ao respectivo nó da disciplina. Não posso simplesmente criar turnos como criei as disciplinas.

LISTA_TURNO_PL criar_lista_turno_pl()
{
   LISTA_TURNO_PL PL;
   PL = (LISTA_TURNO_PL)malloc(sizeof(struct lista_turno_pl));
   PL->inicio = NULL;
   PL->nelementos = 0;
   return PL;
}

NODO_TURNO criar_turno()
{
   NODO_TURNO T = (NODO_TURNO) malloc(sizeof(struct Nodo_Turno));
   T->inf = (TURNO) malloc(sizeof(struct Turno));
   T->seguinte = NULL;
   return T;
}

Eu tenho estas duas funções, mas não posso agora simplesmente chegar ao main e fazer como fiz nas disciplinas, não posso ter:

                    case '6':
                      //Aqui falta prints e scans para perguntar qual disciplina e turno
                       T=criar_turno();
                       inserir_dados_turno(T);
                       inserir_turno_ordenado(listaturnot,T);
                   break;
Link to comment
Share on other sites

mas podes :

case '6':
 NODO disciplina;
 LISTA_TURNO turno;
 // escolher a disciplina
 disciplina = ...;
 // escolher turno
 turno = disciplina.xxxx;
 // adicionar turno
 ...
 break;

é óbvio que a declaração das variáveis tem de ser fora do switch ... é só para exemplo

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

As estruturas que tenho para disciplinas e turnos estão de acordo com o leccionado nas aulas:

typedef struct Turno
{
char numero_turno[5];
char dia_da_semana[11];
//DATA data;
char hora_inicio[6];
char duracao[6];
char sala[3];
char docente[MAX_DOCENTE];
int capacidade;
int numero_inscritos;
} *TURNO;

typedef struct Nodo_Turno
{
TURNO inf;
struct Nodo_Turno *seguinte;
} *NODO_TURNO;

typedef struct lista_turno
{
int nelementos;
NODO_TURNO inicio;
} *LISTA_TURNO;

typedef struct Disciplina
{
char codigo_dis[5];
char nome_disciplina[16];
int numero_alunos;
} *DISCIPLINA;

typedef struct Nodo
{
DISCIPLINA inf;
struct Nodo *seguinte;
LISTA_TURNO apontador1;
LISTA_TURNO apontador2;
LISTA_TURNO apontador3;
}*NODO;

typedef struct Lista_Disciplina
{
int nelementos;
NODO inicio;
} *LISTA_DISCIPLINA;

Falta colocar um campo ou outro, como por exemplo char tipo_turno, ou int tipo_turno, mas não é isso que vai fazer diferença para testar o funcionamento básico.

Edited by Knot
Link to comment
Share on other sites

Eu estou a usar estas funções:

LISTA_TURNO criar_lista_turno()
{
LISTA_TURNO T;
T = (LISTA_TURNO)malloc(sizeof(struct lista_turno));
T->inicio = NULL;
T->nelementos = 0;
return T;
}

NODO_TURNO criar_turno()
{
NODO_TURNO T = (NODO_TURNO) malloc(sizeof(struct Nodo_Turno));
T->inf = (TURNO) malloc(sizeof(struct Turno));
T->seguinte = NULL;
return T;
}

Depois na main

defini:

NODO D;

NODO_TURNO T;

Depois no respectivo case tentei:

D->apontador1=criar_turno();

inserir_dados_turno(D->apontador1);

inserir_turno_ordenado(listaturno,D->apontador1);

Mas dá sempre o erro que indiquei em cima.

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.