fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /* Estrutura de um noh de uma lista de chamadas perdidas */
  5. typedef struct lostcall {
  6. char *phonename;
  7. char *phonenum;
  8. struct lostcall *prox;
  9. } tipoLostcall;
  10.  
  11.  
  12. /* Esta funcao recebe uma string 's' e uma lista encadeada.
  13.  * A funcao devolve o endereço do noh que contem 's'.
  14.  * Se tal noh nao existe, a funcao devolve NULL. */
  15. tipoLostcall *busca(tipoLostcall *lst, char *s) {
  16. tipoLostcall *p;
  17. p = lst->prox;
  18.  
  19. while ( (p != NULL) && strcmp(p->phonename, s) != 0 )
  20. p = p->prox;
  21.  
  22. return p;
  23. }
  24.  
  25.  
  26. /* Percorre a lista (travessia), imprimindo seus elementos */
  27. void imprimir(tipoLostcall *lst) {
  28. tipoLostcall *p;
  29. p = lst->prox;
  30.  
  31. while (p != NULL) {
  32. printf("%s \t %s \n", p->phonename, p->phonenum);
  33. p = p->prox;
  34. }
  35.  
  36. printf("\n");
  37. }
  38.  
  39. /* Funcao para liberar espaco alocado via malloc
  40.  * para cada um dos elementos de uma lista encadeada */
  41. void liberar(tipoLostcall* lst) {
  42. tipoLostcall *f; /* Ponteiro auxiliar */
  43.  
  44. /* Faz a travessia da lista ateh encontrar o ultimo item. */
  45. while (lst != NULL) {
  46. f = lst;
  47. lst = lst->prox;
  48. free(f);
  49. }
  50. }
  51.  
  52. /* Insere noh em uma lista encadeada */
  53. void inserir(tipoLostcall *lst, char *name, char *number) {
  54. tipoLostcall *novo_noh; /* Novo noh */
  55.  
  56. novo_noh = (tipoLostcall*) malloc(sizeof(tipoLostcall)); /* Aloca espaco para novo noh */
  57.  
  58. novo_noh->phonename = name; /* Armazena nome do novo contato */
  59. novo_noh->phonenum = number; /* Armazena numero do novo contato */
  60. novo_noh->prox = lst->prox; /* Ajusta o campo prox do novo noh */
  61. lst->prox = novo_noh; /* Faz o noh antigo apontar para o novo noh */
  62. }
  63.  
  64.  
  65. /* Esta funcao recebe o endereco 'p' de um noh
  66.  * de uma lista encadeada, e remove da
  67.  * lista o noh 'p->prox'. A funcao supoe que
  68.  * p != NULL e p->prox != NULL. */
  69. void remover(tipoLostcall *p) {
  70. tipoLostcall *lixo;
  71.  
  72. lixo = p->prox;
  73. p->prox = lixo->prox;
  74. free(lixo);
  75. }
  76.  
  77.  
  78. /* Funcao principal */
  79. int main()
  80. {
  81. printf("==========================================\n");
  82. printf(" REMOCAO de item em uma lista encadeada \n");
  83. printf("==========================================\n");
  84. printf("\n");
  85.  
  86. /* Declaracao de **ponteiros** para os nohs da lista encadeada */
  87. tipoLostcall *lista, *pt;
  88.  
  89. /* Criacao do noh cabeca */
  90. lista = (tipoLostcall*) malloc(sizeof(tipoLostcall));
  91. lista->prox = NULL;
  92.  
  93. /* Inicializa Lista Encadeada */
  94. inserir(lista, "Lisbela", "99887766");
  95. inserir(lista, "Hildegardo", "99881234");
  96. inserir(lista, "Astrogilda", "98987676");
  97. inserir(lista, "Hermengarda", "99998888");
  98. inserir(lista, "Hermenegildo", "91223344");
  99.  
  100. /* Imprime Lista *ANTES* da insercao */
  101. imprimir(lista);
  102.  
  103. /* Busca chamada de "Astrogilda" */
  104. pt = busca(lista, "Astrogilda");
  105.  
  106. /* Remove chamada de "Hildegardo" (seguinte a "Astrogilda") */
  107. remover(pt);
  108.  
  109. /* Imprime Lista *APOS* insercao */
  110. imprimir(lista);
  111.  
  112. /* Destroi lista encadeada, liberando espaco */
  113. liberar(lista);
  114.  
  115. return 0;
  116. }
Success #stdin #stdout 0s 5432KB
stdin
Standard input is empty
stdout
==========================================
 REMOCAO de item em uma lista encadeada  
==========================================

Hermenegildo 	 91223344 
Hermengarda 	 99998888 
Astrogilda 	 98987676 
Hildegardo 	 99881234 
Lisbela 	 99887766 

Hermenegildo 	 91223344 
Hermengarda 	 99998888 
Astrogilda 	 98987676 
Lisbela 	 99887766