Knot Posted June 9, 2012 at 09:25 AM Report Share #461598 Posted June 9, 2012 at 09:25 AM (edited) 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 June 9, 2012 at 09:27 AM by Knot Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 9, 2012 at 09:48 AM Report Share #461601 Posted June 9, 2012 at 09:48 AM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Knot Posted June 9, 2012 at 10:04 AM Author Report Share #461603 Posted June 9, 2012 at 10:04 AM É diferente pq tenho turnos teoricos, teorico-praticos e praticoo-laboratoriais. Fica aqui dado um exemplo das estruturas dado pelo professor, é a parte de baixo que para já me interessa. http://img7.imageshack.us/img7/4416/efsef.jpg Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 9, 2012 at 10:11 AM Report Share #461605 Posted June 9, 2012 at 10:11 AM o que eu vejo na imagem é que são do mesmo tipo ... são ponteiros diferentes mas não tipos diferentes IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Knot Posted June 9, 2012 at 10:16 AM Author Report Share #461606 Posted June 9, 2012 at 10:16 AM Sim tens razão, até pq depois para o nó dos turnos utilizei apenas uma estrutura NODO_TURNO, visto serem todos iguais. Mas tirando essa parte não tens uma ideia de como posso ligar as listas? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 9, 2012 at 10:23 AM Report Share #461609 Posted June 9, 2012 at 10:23 AM eu não percebo a tua questão ... o que pretendes dizer com ligar listas ??? já agora . .podes por a imagem completa ?? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Knot Posted June 9, 2012 at 10:42 AM Author Report Share #461612 Posted June 9, 2012 at 10:42 AM 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 More sharing options...
HappyHippyHippo Posted June 9, 2012 at 11:10 AM Report Share #461617 Posted June 9, 2012 at 11:10 AM o enunciado falta referenciar que alem da disciplina, necessitas de perguntar que tipo de turno vais inserir IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Knot Posted June 9, 2012 at 01:34 PM Author Report Share #461640 Posted June 9, 2012 at 01:34 PM 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 More sharing options...
HappyHippyHippo Posted June 9, 2012 at 03:39 PM Report Share #461651 Posted June 9, 2012 at 03:39 PM (edited) 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 June 9, 2012 at 03:40 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Knot Posted June 10, 2012 at 03:25 PM Author Report Share #461776 Posted June 10, 2012 at 03:25 PM Sim mas isso de perguntar o turno e a disciplina eu sei fazer. Mas e depois criar a lista de turnos ligado à disciplina? Essa parte é que não sei... Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 10, 2012 at 03:28 PM Report Share #461777 Posted June 10, 2012 at 03:28 PM qual é exactamente a tua dúvida ? disseste que tinhas o manuseamento das outras listas já feito, para esta é a mesma coisa ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Knot Posted June 10, 2012 at 03:49 PM Author Report Share #461783 Posted June 10, 2012 at 03:49 PM 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 More sharing options...
HappyHippyHippo Posted June 10, 2012 at 03:56 PM Report Share #461786 Posted June 10, 2012 at 03:56 PM (edited) 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 June 10, 2012 at 03:57 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Knot Posted June 10, 2012 at 04:23 PM Author Report Share #461789 Posted June 10, 2012 at 04:23 PM Sim eu declarei fora do switch, mas assim em "turno = criar_turno();" dá erro de a value type of NODO_TURNO cannot be assigned to an entity of type LISTA_TURNO Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 10, 2012 at 05:09 PM Report Share #461796 Posted June 10, 2012 at 05:09 PM novamente isso parece um problema de má estruturação de dados ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Knot Posted June 10, 2012 at 05:56 PM Author Report Share #461807 Posted June 10, 2012 at 05:56 PM (edited) 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 June 10, 2012 at 06:00 PM by Knot Link to comment Share on other sites More sharing options...
Knot Posted June 10, 2012 at 09:06 PM Author Report Share #461833 Posted June 10, 2012 at 09:06 PM 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 More sharing options...
HappyHippyHippo Posted June 10, 2012 at 09:13 PM Report Share #461834 Posted June 10, 2012 at 09:13 PM se são de tipos diferentes é claro que a atribuição não pode ser realizada ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Knot Posted June 10, 2012 at 09:15 PM Author Report Share #461837 Posted June 10, 2012 at 09:15 PM Pois... Mas como posso resolver isto? Alguma ideia? Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now