Guest User

Untitled

a guest
Aug 17th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.51 KB | None | 0 0
  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4.  
  5.  
  6. struct wezel
  7. {
  8. int klucz;
  9. wezel *nastepnik;
  10. };
  11.  
  12. wezel *glowa=(wezel*)calloc(1,sizeof(wezel)); // inicjalizacja pustej listy, glowy
  13.  
  14.  
  15.  
  16. //------------------FUNKCJE------------------------------------------------------------
  17.  
  18.  
  19. void dodaj(struct wezel* glowa, int a)
  20. {
  21. wezel *nowy, *poprzednik;
  22. nowy=(wezel*)calloc(1,sizeof(wezel));
  23. poprzednik=(wezel*)calloc(1,sizeof(wezel));
  24. nowy->klucz=a;
  25. nowy->nastepnik=NULL;
  26. if(glowa->nastepnik==NULL)
  27. {
  28. glowa->nastepnik=nowy;
  29. }
  30. else
  31. {
  32. poprzednik=glowa->nastepnik;
  33. while(poprzednik->nastepnik!=NULL)
  34. {
  35. poprzednik=poprzednik->nastepnik;
  36.  
  37. }
  38. poprzednik->nastepnik=nowy;
  39. }
  40. }
  41.  
  42.  
  43.  
  44.  
  45. void wypisz(struct wezel* glowa)
  46. {
  47. wezel *temp=(wezel*)malloc(sizeof(wezel));
  48. temp=glowa;
  49. printf("Adres glowy: %p\t\tKlucz: %i\n\nLista:\n", temp,temp->klucz);
  50. while(temp->nastepnik!=NULL)
  51. {
  52. temp=temp->nastepnik;
  53. printf("Adres: %p\t\tKlucz: %i\n", temp,temp->klucz);
  54. }
  55.  
  56. }
  57.  
  58. wezel* wyszukaj_pierwszy(struct wezel *glowa, int a) // wyszukuje pierwsze wystapienie zadanego klucza i zwraca adres
  59. {
  60. wezel *temp=(wezel*)malloc(sizeof(wezel));
  61. temp=glowa;
  62.  
  63. while(temp->klucz!=a)
  64. {
  65.  
  66. if(temp->nastepnik==NULL)
  67. {
  68. temp=temp->nastepnik;
  69. break;
  70. }
  71. temp=temp->nastepnik;
  72. }
  73.  
  74. return temp;
  75. }
  76.  
  77. int wyszukaj_ile(struct wezel *glowa, int a) // wyszukuje ilosc wystapien zadanego klucza
  78. {
  79. wezel *temp=(wezel*)malloc(sizeof(wezel));
  80. temp=glowa->nastepnik;
  81. if(temp==NULL) return 0; // jezeli lista jest pusta (istnieje tylko glowa) to zwraca 0
  82. int ile=0;
  83. while(temp->nastepnik!=NULL)
  84. {
  85. if(temp->klucz==a) ile++;
  86. temp=temp->nastepnik;
  87. }
  88. if(glowa->nastepnik->nastepnik==NULL) // kiedy jest tylko jeden wezel
  89. if(glowa->nastepnik->klucz==a) ile++; // kiedy jest tylko jeden wezel
  90. if(temp->nastepnik==NULL && temp->klucz==a) ile++; //sprawdzenie ostatniego klucza
  91. //free(temp);
  92. return ile;
  93. }
  94.  
  95. void kasowanie(struct wezel *glowa, int a) //kasuje wezly o zadanej wartosci klucza
  96. {
  97. int ile=wyszukaj_ile(glowa,a); // wyszukuje liczbe wystapien
  98. wezel *poprzedni=(wezel*)malloc(sizeof(wezel));
  99. wezel *temp=(wezel*)malloc(sizeof(wezel));
  100. wezel *nastepny=(wezel*)malloc(sizeof(wezel));
  101. if(ile) // petla do skasowania wszystkich wystapien
  102. {
  103. for(int i=0;i<ile;i++)
  104. {
  105. temp=glowa;
  106. while(temp->klucz!=a)
  107. {
  108.  
  109. if(temp->nastepnik==NULL)
  110. {
  111. temp=temp->nastepnik;
  112. break;
  113. }
  114. poprzedni=temp;
  115. temp=temp->nastepnik;
  116. }
  117.  
  118. nastepny=temp->nastepnik;
  119. poprzedni->nastepnik=nastepny;
  120. free(temp); // skasowanie wezla
  121. if(i<ile-1) wezel *temp=(wezel*)malloc(sizeof(wezel)); // ponowna alokacja wskaznika dla obslugi kolejnego wystapienia
  122. }
  123. }
  124. else printf("\nbrak zadanego klucza\n");
  125.  
  126. }
  127.  
  128. //-------------------------------------------------------------------------------------
  129.  
  130. void main()
  131. {
  132. wezel *temp=(wezel*)malloc(sizeof(wezel));
  133. int liczba;
  134. srand(time(NULL));
  135. int i = rand()%16;
  136. printf("\nDlugosc listy: %i\n\n",i);
  137.  
  138. for(i;i>0;i--)
  139. {
  140.  
  141. dodaj(glowa,rand()%6);
  142. }
  143. wypisz(glowa);
  144.  
  145.  
  146. printf("Podaj liczbe do wyszukania:\n");
  147. scanf("%i",&liczba);
  148.  
  149. temp=wyszukaj_pierwszy(glowa,liczba);
  150.  
  151.  
  152. if(temp==NULL) printf("brak klucza\n\n");
  153. else
  154. {
  155. printf("\n\nAdres wezla: %p\t\t",temp);
  156. printf("Klucz: %i\n\n", temp->klucz);
  157. }
  158.  
  159. printf("Ilosc wystapien klucza: %i, %i razy\n\n",liczba, wyszukaj_ile(glowa,liczba));
  160.  
  161. printf("Wstawiam wezel, podaj wartosc klucza:\n");
  162. scanf("%i",&liczba);
  163. wyszukaj_ile(glowa,liczba);
  164. //if(wyszukaj_ile(glowa,liczba)) printf("\nTaki klucz juz jest!\n");
  165. //else
  166. //{
  167. dodaj(glowa,liczba);
  168. wypisz(glowa);
  169. //}
  170.  
  171. kasowanie(glowa,50);
  172. wypisz(glowa);
  173. }
Add Comment
Please, Sign In to add comment