fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <string.h>
  5.  
  6. typedef struct str {
  7. char* child;
  8. struct str* next;
  9. } NO;
  10.  
  11. typedef struct {
  12. NO* head;
  13. } LIST;
  14.  
  15.  
  16.  
  17. int SizeList(LIST *l) {
  18. NO* p = l->head->next;
  19. int tam = 0;
  20. while (p != l->head)
  21. {
  22. tam++;
  23. p = p->next;
  24. }
  25. return(tam);
  26. }
  27.  
  28. void showList(LIST *l) {
  29. NO* p = l->head;
  30. printf("head->");
  31. while(p->next != l->head)
  32. {
  33. p = p->next;
  34. printf("%s->", p->child);
  35. }
  36. if(p->next == l->head) printf("head \n");
  37. printf("\n\n");
  38. }
  39.  
  40. void IniList(LIST* l) {
  41. l->head = (NO*)malloc(sizeof(NO));
  42. l->head->next = l->head;
  43.  
  44. //assim mesmo que imprima o valor do head não estara a aceder a uma zona de memoria invalida
  45. l->head->child = malloc(sizeof(char));
  46. *(l->head->child) = '\0';
  47. }
  48.  
  49. NO* nChild(LIST *l, int n, NO** bef) {
  50. NO* p = l->head->next;
  51. *bef = l->head;//iniciliazação que estava em falta de bef
  52. int i = 0;
  53. while ((p != l->head) && (i < n)) //aqui de n-1 para n
  54. {
  55. *bef = p;
  56. p = p->next;
  57. i++;
  58. }
  59.  
  60. return i >= SizeList(l) ? NULL : p; //troquei if para ternario assim como condição
  61. }
  62.  
  63. NO* LastChild(LIST *l) {
  64. NO* p = l->head->next;
  65. if(p == l->head) return l->head;
  66. while(p->next != l->head)
  67. {
  68. p = p->next;
  69. }
  70. return p;
  71. }
  72.  
  73. void insChild(LIST* l, char name[]) { //simplifiquei bastante o código
  74. NO* p = LastChild(l);
  75. NO* newnode = (NO*)malloc(sizeof(NO)); //conjuguei declaração com atribuição
  76. newnode->child = malloc((strlen(name)+1)*sizeof(char));
  77. strcpy(newnode->child, name);
  78. newnode->next = l->head;
  79. p->next = newnode;
  80. }
  81.  
  82. void DelChild (LIST* l)
  83. {
  84. int slist = SizeList(l);
  85. if (slist == 1 )
  86. {
  87. NO* p = l->head->next;
  88. printf("\nCriança Vencedora: %s\n", p->child);
  89. return;
  90. }
  91. else
  92. {
  93. int del = rand() % slist; //de slist-1 para slist
  94. printf("RANDOM: %d\n", del);
  95.  
  96. NO* bef;
  97. NO* p = nChild(l, del, &bef);
  98. if (p)//retirei o if(!p) return; que assim fica mais simples
  99. {
  100. bef->next = p->next;
  101. free(p);
  102. }
  103. }
  104. }
  105.  
  106. int main() {
  107. LIST l;
  108. IniList(&l);
  109. int op = 0;
  110.  
  111. while (op != 3)
  112. {
  113. printf("\nDigite o numero a operacao desejada:\n");
  114. printf("\n\n1.Inserir Crianca \t\t2.Remover Crianca \t\t3.Exit\n\n");
  115. scanf("%d", &op);
  116.  
  117. char name[100];
  118. switch(op)
  119. {
  120.  
  121. case 1:
  122. printf("\nDigite o nome a inserir:\n");
  123. scanf("%s", name);
  124. insChild(&l, name);
  125. showList(&l);
  126. break;
  127.  
  128. case 2:
  129. DelChild(&l);
  130. showList(&l);
  131. break;
  132. case 3:
  133. break;
  134. default:
  135. printf("Digite uma opção válida!\n");
  136. }
  137. }
  138.  
  139. return 0;
  140. }
  141.  
Success #stdin #stdout 0s 9432KB
stdin
1
joao
1
marta
1
serafim
1
sofia
2
2
2
2
3
stdout
Digite o numero a operacao desejada:


1.Inserir Crianca 		2.Remover Crianca 		3.Exit


Digite o nome a inserir:
head->joao->head 



Digite o numero a operacao desejada:


1.Inserir Crianca 		2.Remover Crianca 		3.Exit


Digite o nome a inserir:
head->joao->marta->head 



Digite o numero a operacao desejada:


1.Inserir Crianca 		2.Remover Crianca 		3.Exit


Digite o nome a inserir:
head->joao->marta->serafim->head 



Digite o numero a operacao desejada:


1.Inserir Crianca 		2.Remover Crianca 		3.Exit


Digite o nome a inserir:
head->joao->marta->serafim->sofia->head 



Digite o numero a operacao desejada:


1.Inserir Crianca 		2.Remover Crianca 		3.Exit

RANDOM: 3
head->joao->marta->serafim->head 



Digite o numero a operacao desejada:


1.Inserir Crianca 		2.Remover Crianca 		3.Exit

RANDOM: 1
head->joao->serafim->head 



Digite o numero a operacao desejada:


1.Inserir Crianca 		2.Remover Crianca 		3.Exit

RANDOM: 1
head->joao->head 



Digite o numero a operacao desejada:


1.Inserir Crianca 		2.Remover Crianca 		3.Exit


Criança Vencedora: joao
head->joao->head 



Digite o numero a operacao desejada:


1.Inserir Crianca 		2.Remover Crianca 		3.Exit