parte 5 – gestão dinâmica de memória (listas ligadas a listas ligadas)
O caso de uma lista de disciplinas que tem alunos inscritos.. :) as disciplinas é uma lista ligada e os alunos inscritos também o são.. vamos ver como corre
//listas de listas (listas ligadas) #include <stdio.h> #include <stdlib.h> #define TAM 3 #define TAMNOME 10 typedef struct pessoa aluno, *paluno; typedef struct disciplina aUC, *pUC; struct pessoa{s int nif; char nome[TAMNOME]; paluno pseguinte; }; struct disciplina{ int numeroUC; char nomeUC[TAMNOME]; pUC pUCseguinte; paluno lista; }; int lista_vazia(paluno p, pUC puc); int menu(); pUC adicionaUC(int *auxTUC, pUC p); void listaUCs(pUC p, int totalUC); pUC removerUC(int *auxTUC, pUC p); paluno adicionaAluno(paluno pA, pUC pU); int lista_vazia(paluno p, pUC puc){ if(p==NULL && puc == NULL){ return 1; }else{ return 0; } } int menu(){ int i; //printf("total UCs: %d", totalUCs) puts("1 - adiciona UC"); puts("2 - remove UC"); //last puts("3 - lista UCs"); puts("4 - adiciona aluno a UC"); puts("5 - remove aluno a UC"); //last puts("6 - lista UC de aluno"); puts("7 - "); puts("8 - terminar"); puts("Escolha uma opcao: "); do{ scanf(" %d", &i); }while(i <0 || i >8); return i; } pUC removerUC(int *auxTUC, pUC p){ int retirarUC; pUC atual, anterior=NULL; atual = p; if(p==NULL){ printf("\nerro: nao existe nada para remover"); return p; }else{ printf("\nqual o nif da UC a remover?\n"); scanf("%d", &retirarUC); while(atual != NULL && atual->numeroUC != retirarUC){ anterior = atual; atual= atual->pUCseguinte; } if(anterior == NULL){ p = atual->pUCseguinte; (*auxTUC)--; }else{ anterior->pUCseguinte = atual->pUCseguinte; (*auxTUC)--; } } free(atual); return p; } paluno adicionaAluno(paluno pA, pUC pU){ return pA; } pUC adicionaUC(int *auxTUC, pUC p){ int auxiliar; pUC novo, cursor; novo = malloc(sizeof(aUC)); if(novo == NULL){ printf("erro: nao e possivel alocar memoria para a UC"); return p; }else{ if(*auxTUC >= TAM){ printf("erro: nao e possivel adicionar mais UC\n"); free(novo); return p; }else{ printf("Qual o numero da nova UC?\n"); scanf("%d", &novo->numeroUC); printf("Qual o nome da nova UC?\n"); scanf(" %99[^\n]", novo->nomeUC); novo->pUCseguinte = NULL; novo->lista = NULL; if(p==NULL){ p=novo; (*auxTUC)++; return p; }else{ cursor=p; while(cursor->pUCseguinte != NULL){ cursor=cursor->pUCseguinte; } cursor->pUCseguinte = novo; (*auxTUC)++; return p; } } } free(novo); } void listaUCs(pUC p, int totalUC){ if(p==NULL){ printf("\nerro: nao tem nada para listar de UCs"); }else{ printf("\nlistagem das %d UCs:\n", totalUC); while(p!=NULL){ printf("%d\t%s\n", p->numeroUC, p->nomeUC); p=p->pUCseguinte; } } } int main() { int escolha, totalUC=0; paluno listaA=NULL; pUC listaUC=NULL; if(lista_vazia(listaA, listaUC)==1){ do{ escolha = menu(); switch(escolha){ case 1: listaUC=adicionaUC(&totalUC, listaUC); break; case 2: listaUC=removerUC(&totalUC, listaUC); break; case 3: listaUCs(listaUC, totalUC); case 4: listaA=adicionaAluno( listaA, listaUC);break; case 5: break; case 6: break; case 7: break; case 8: break; } }while(escolha != 8); }else{ printf("nao foi possivel inicializar!"); } return 0; }
e ficou incompleto..
ajudas:
LINK1
Tags : C, Learn C, linguagem C
0 thoughts on “parte 5 – gestão dinâmica de memória (listas ligadas a listas ligadas)”