File: Stare vježbe/vjezbe11/71c__vezane_liste.c

  1. /*
  2.   71c__vezane_liste.c
  3.   -----
  4.   Program ucitava imena i stavlja ih u vezanu listu tako da imena u listi
  5.   uvijek budu sortirana.
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <malloc.h>
  11. #include <string.h>
  12.  
  13. typedef struct __node {
  14. char *ime;
  15. struct __node *next;
  16. } node;
  17.  
  18. int main ( void )
  19. {
  20. node *glava, *pomocni, *prethodnik, *trenutni;
  21. char temp[100];
  22.  
  23. /* inicijalizacija liste */
  24. glava=NULL;
  25.  
  26. /* ucitavamo imena sve dok se ne ucita 0 */
  27. while (1)
  28. {
  29. printf ("Unesi ime (0 za kraj): ");
  30. scanf ("%s", temp);
  31.  
  32. if (!strcmp(temp, "0")) break;
  33.  
  34. pomocni=(node *) malloc(sizeof(node));
  35. pomocni->ime=(char *) malloc(sizeof(char)*(strlen(temp)+1));
  36. strcpy (pomocni->ime, temp);
  37.  
  38. /* sad treba pronaci mjesto u listi gdje treba staviti ucitano ime */
  39. trenutni=glava; prethodnik=NULL;
  40. while (trenutni!=NULL && strcmp(trenutni->ime, pomocni->ime) < 0)
  41. {
  42. /* uocimo da nas tzv. lijeno izvrednjavanje uvjeta u while petlji
  43.   "spasava" od mogucnosti dereferenciranja NULL pointer-a */
  44. prethodnik=trenutni; trenutni=trenutni->next;
  45. }
  46.  
  47. if (prethodnik==NULL)
  48. {
  49. /* treba dodati na pocetak liste (koja je mozda i prazna) */
  50. pomocni->next=glava; glava=pomocni;
  51. }
  52. else
  53. {
  54. /* treba ubaciti iza prethodnik-a, a ispred trenutni (koji je
  55.   mozda NULL */
  56. pomocni->next=trenutni;
  57. prethodnik->next=pomocni;
  58. }
  59. }
  60.  
  61. /* ispisujemo listu cvor po cvor */
  62. printf ("Sortirana lista: ");
  63. for (pomocni=glava; pomocni!=NULL; pomocni=pomocni->next)
  64. printf ("%s ", pomocni->ime);
  65.  
  66. /* oslobadjanje memorije */
  67. while (glava!=NULL)
  68. {
  69. pomocni=glava; glava=glava->next;
  70. free (pomocni->ime); free (pomocni);
  71. }
  72.  
  73. return 0;
  74. }
  75.