Advertisement
Guest User

Untitled

a guest
Nov 11th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.90 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct{
  5. long matricula;
  6. char nome[51];
  7. float CR;
  8.  
  9. }DADOS_ALUNO;
  10.  
  11.  
  12. typedef struct {
  13.  
  14. DADOS_ALUNO dados; //Dados do aluno
  15. void* pProximoAluno; //Ponteiro para o próximo aluno
  16. void* pAlunoAnterior; //Ponteiro para aluno anterior
  17.  
  18. }ELEMENTO;
  19.  
  20.  
  21. ELEMENTO* criaLista(){
  22. return NULL;
  23. }
  24.  
  25.  
  26. ELEMENTO* cadastraAlunos(ELEMENTO* lista, DADOS_ALUNO novo_aluno){
  27.  
  28. ELEMENTO* novo = (ELEMENTO*)malloc(sizeof(ELEMENTO));
  29.  
  30. //Inicialmente os ponteiros ini e fim apontam para NULL
  31. ELEMENTO* ini = lista;
  32. ELEMENTO* fim = lista;
  33.  
  34. if(novo == NULL){
  35. printf("Memoria insuficiente\n");
  36. exit(1);
  37.  
  38. } else if(lista == NULL){ //Se a lista estiver vazia, insere o primeiro nó
  39.  
  40. novo->dados = novo_aluno;
  41. novo->pProximoAluno = fim;
  42. novo->pAlunoAnterior = ini;
  43.  
  44. fim = ini = novo;
  45.  
  46. return ini;
  47.  
  48. } else { //Caso a lista tenha pelo menos um nó
  49.  
  50. novo->dados = novo_aluno;
  51. novo->pProximoAluno = fim;
  52. novo->pAlunoAnterior = NULL;
  53. fim->pAlunoAnterior = novo;
  54. ini = novo;
  55.  
  56. return ini;
  57.  
  58. }
  59.  
  60. }
  61.  
  62. //a)Retornar a quantidade de alunos com coeficiente de rendimento maior ou igual a 7.
  63. int numAlunosCrAlto(ELEMENTO* pLista){
  64.  
  65. int quantidade = 0;
  66.  
  67. ELEMENTO* p = pLista; //Ponteiro que aponta para o início da lista para percorrê-lo
  68.  
  69.  
  70. if(pLista == NULL){
  71. printf("Lista vazia\n");
  72. exit(1);
  73.  
  74. } else {
  75.  
  76. while(p != NULL){
  77.  
  78. if(p->dados.CR >= 7){
  79. quantidade++;
  80. }
  81.  
  82. p = p->pProximoAluno;
  83. }
  84.  
  85. return quantidade;
  86. }
  87. }
  88.  
  89. void imprimeAluno(ELEMENTO* lista){
  90.  
  91. ELEMENTO* p = lista;
  92.  
  93. if(lista == NULL){
  94. printf("Lista vazia\n");
  95. exit(1);
  96.  
  97. } else {
  98.  
  99. for(; p != NULL; p = p->pProximoAluno){
  100. printf("Matricula: %ld - Nome: %s - CR: %.2f\n", p->dados.matricula, p->dados.nome, p->dados.CR);
  101. }
  102.  
  103. printf("\n\n");
  104.  
  105. }
  106. }
  107.  
  108.  
  109. //b)Excluir da lista todos os alunos com coeficiente de rendimento menor que 5.
  110. void excluirAlunosCrBaixo(ELEMENTO* pLista){
  111.  
  112. ELEMENTO* p = pLista; //Ponteiro que aponta para o primeiro nó da lista para percorrê-la
  113. ELEMENTO* ant = NULL; //Ponteiro para guardar o nó antecessor ao que será excluído
  114.  
  115. if(pLista == NULL){
  116. printf("Lista vazia\n");
  117. exit(1);
  118.  
  119. } else {
  120.  
  121. while(p != NULL){
  122.  
  123. if(p->dados.CR < 5 && p->pAlunoAnterior == NULL){ //Se for primeiro da lista
  124.  
  125. if(p->pProximoAluno == NULL){ //Se não houver mais elementos na lista, a mesma fica vazia
  126.  
  127. ant = p; /*Usando o ponteiro ant para apontar ao p e chamar o free() sobre ele para
  128. não perder a referência de p, pois este será utilizado para percorrer a lista*/
  129.  
  130. pLista = ant->pProximoAluno; //A cabeça da lista aponta para NULL, indicando que está vazia
  131. free(ant);
  132.  
  133. } else { //Caso ainda exista mais elementos na lista, o segundo elemento passa a ser o primeiro
  134.  
  135. ant = p;
  136. p = p->pProximoAluno;
  137. free(ant);
  138. p->pAlunoAnterior = NULL;
  139. }
  140.  
  141.  
  142. } else if(p->dados.CR < 5 && p->pAlunoAnterior != NULL && p->pProximoAluno != NULL){ //Se o elemento estiver no meio da lista
  143.  
  144. ELEMENTO* aux; //Ponteiro que irá apontar para o nó antecessor ao nó que será excluído
  145. ant = p;
  146. aux = ant->pAlunoAnterior;
  147. p = p->pProximoAluno;
  148. p->pAlunoAnterior = aux;
  149. aux->pProximoAluno = p;
  150. free(ant);
  151.  
  152. } else if(p->dados.CR < 5 && p->pProximoAluno == NULL){ //Se for o último da lista
  153.  
  154.  
  155. ant = p->pAlunoAnterior;
  156. ant->pProximoAluno = NULL;
  157. free(p);
  158.  
  159. }
  160.  
  161. p = p->pProximoAluno;
  162. }
  163. }
  164. }
  165.  
  166.  
  167. int main(int argc, char *argv[]) {
  168.  
  169.  
  170. ELEMENTO* Lista = (ELEMENTO*)malloc(sizeof(ELEMENTO));
  171.  
  172. if(Lista == NULL){
  173. printf("Memoria insuficiente\n");
  174. exit(1);
  175.  
  176. } else {
  177.  
  178. Lista = criaLista();
  179.  
  180. // DADOS_ALUNO a1 = {201311, "Teste 01", 8.5};
  181. // DADOS_ALUNO a2 = {201412, "Teste 02", 6.3};
  182. // DADOS_ALUNO a3 = {201211, "Teste 03", 6.2};
  183. DADOS_ALUNO a4 = {201511, "Teste 04", 1.0};
  184.  
  185. // Lista = cadastraAlunos(Lista, a1);
  186. // Lista = cadastraAlunos(Lista, a2);
  187. // Lista = cadastraAlunos(Lista, a3);
  188. Lista = cadastraAlunos(Lista, a4);
  189.  
  190. imprimeAluno(Lista);
  191.  
  192. excluirAlunosCrBaixo(Lista);
  193.  
  194. imprimeAluno(Lista);
  195.  
  196. printf("Total de alunos com CR maior ou igual a 7: %d", numAlunosCrAlto(Lista));
  197.  
  198. }
  199.  
  200. return 0;
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement