Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.02 KB | None | 0 0
  1.  
  2. #include "stdafx.h"
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include "STOS.h"
  7. #include "DANE.h"
  8.  
  9. #pragma warning (disable : 4996)
  10.  
  11. extern int StringSize;
  12. static STOS *ostatni = NULL; //wskaznik do pierwszego elementu w kolejce
  13. FreeData wsk_free_dane; //Deklaracja wskaznika do funkcji typu FreeData
  14.  
  15. int licznik = 0;
  16.  
  17. Zwolnij ptrZwolnij;
  18. Push ptrPush;
  19. Druk ptrDruk;
  20. Spr ptrSpr;
  21. Zap ptrZap;
  22. Czyt ptrCzyt;
  23.  
  24.  
  25. void STOS_Init(FreeData pFreeDat, Zwolnij pZwolnij, Push pPush, Druk pDruk, Spr pSpr, Zap pZap, Czyt pCzyt) {
  26. ostatni = NULL;
  27.  
  28. wsk_free_dane = pFreeDat;
  29. ptrZwolnij = pZwolnij;
  30. ptrPush = pPush;
  31. ptrDruk = pDruk;
  32. ptrSpr = pSpr;
  33. ptrZap = pZap;
  34. ptrCzyt = pCzyt;
  35. }
  36.  
  37. void STOS_Free() {
  38. //Zwalniamy caly stos
  39. //Ustaliamy wskaznik p do ostatni
  40. STOS *p = ostatni, *ptempo = NULL;
  41.  
  42. //pobieramy obiekty
  43. while (p) {
  44. //Zwalniamy dane dla biezacego elementu stosu, do ktorego wskazuje wskaznik p
  45. (*wsk_free_dane)(p->pData);
  46.  
  47. //Przypisujemy adres biezacego elementu do pomocniczej zmiennej ptempo
  48. ptempo = p;
  49.  
  50. //przestawiamy wskaznik p do nastepnego elementu stosu
  51. p = p->poprzedni;
  52.  
  53. //zwalniamy biezacy element stosu
  54. free(ptempo);
  55. }
  56.  
  57. ostatni = NULL;
  58. }
  59.  
  60. STOS * STOS_Push(void *pdat) {
  61. //alokujemy pamiec dla nowego elementu stosu
  62. STOS *aktualny = (STOS *)malloc(sizeof(STOS));
  63. if (aktualny == NULL)
  64. return NULL;
  65.  
  66. if (!ostatni)
  67. aktualny->poprzedni = NULL;
  68. //jeśli nie istnieje ostatni to aktualny jest jedynym elementem
  69. //czyli nie istnieje poprzedni element
  70. else
  71. aktualny->poprzedni = ostatni;
  72. //jeśli istnieje ostatni, to aktualny nie jest jedynym elementem
  73. //czyli przypisujemy do aktualny->poprzedni adres poprzedniego elementu
  74.  
  75. //Ustawiamy pData
  76. aktualny->pData = pdat;
  77.  
  78. ostatni = aktualny;
  79. licznik = licznik + 1;
  80.  
  81. return ostatni;
  82. }
  83.  
  84. STOS STOS_Pop() {
  85. STOS tempo;
  86. if (!ostatni) {
  87. //stos jest pusty
  88. tempo.pData = NULL;
  89. tempo.poprzedni = NULL;
  90. }
  91. else {
  92. //Pobieramy pierwszy element
  93. //poprzedni element powinien byc ostatni. Pobieramy jego adres.
  94. STOS *poprzedni = ostatni->poprzedni;
  95.  
  96. //Pobieramy dane dla elementu ostatni.
  97. tempo.pData = ostatni->pData;
  98.  
  99. //Nie jest to obowjazkowe
  100. tempo.poprzedni = NULL;
  101.  
  102. //zwalniamy pamiec dla elementu ostatni
  103. free(ostatni);
  104.  
  105. //przestawiamy ostatni do nastepnego elementu
  106. ostatni = poprzedni;
  107. }
  108. licznik = licznik - 1;
  109.  
  110. return tempo;
  111. }
  112.  
  113. void STOS_Search(void *pSearchDat, int krt) {
  114.  
  115. static STOS *p;
  116.  
  117. for (p = ostatni; p != NULL;) {
  118. //SF zadnego STUDENT_SPR w KONTENERZE byc nie powinno! Moga byc tylko wskazniki do funkcji, przez ktrore wywolamy
  119. //funkcji z obslugi danych
  120. if ((*ptrSpr)(p->pData, pSearchDat, krt) == 1) {
  121. (*ptrDruk)((STUDENT*)p->pData); //SFD a to najlepiej wywolac z obslugi DANYCH lub z interfejsu.
  122. }
  123. p = p->poprzedni;
  124. }
  125.  
  126. }
  127.  
  128. FILE * OTWIERANIE_PLIKU_DO_ZAPISU(char *NAZWA_PLIKU) {
  129. return fopen(NAZWA_PLIKU, "wb");
  130. }
  131.  
  132. FILE * OTWIERANIE_PLIKU_DO_ODCZYTU(char *NAZWA_PLIKU) {
  133. return fopen(NAZWA_PLIKU, "rb");
  134. }
  135.  
  136. void STOS_ZAPIS_DO_PLIKU(char *NAZWA_PLIKU) {
  137.  
  138.  
  139. STOS *tempo = ostatni;
  140. FILE *PLIK = OTWIERANIE_PLIKU_DO_ZAPISU(NAZWA_PLIKU);
  141. fwrite(&licznik, sizeof(int), 1, PLIK);
  142.  
  143. while (tempo != NULL) {
  144. //SF to samo
  145. (*ptrZap)((STUDENT*)tempo->pData, PLIK);
  146. tempo = tempo->poprzedni;
  147. }
  148. fclose(PLIK);
  149. }
  150.  
  151.  
  152.  
  153. void *STOS_ODCZYT_Z_PLIKU(char *NAZWA_PLIKU) {
  154. int LicznikPozycji = sizeof(int);
  155. int it = 0;
  156.  
  157. FILE *PLIK = OTWIERANIE_PLIKU_DO_ODCZYTU(NAZWA_PLIKU);
  158. fread(&it, sizeof(int), 1, PLIK);
  159. void *ptr = NULL;
  160. for (int i = 0; i < it; i++)
  161. STOS_Push(ptr);
  162.  
  163.  
  164. STOS *tmpWSK = ostatni;
  165.  
  166.  
  167. const int STALA = sizeof(int) + sizeof(KIERUNEK_STUDIOW);
  168. //SF to samo
  169. while (STUDENT *WSK = (STUDENT*)(*ptrCzyt)(PLIK, LicznikPozycji)) {
  170. if (WSK != NULL) {
  171. tmpWSK->pData = WSK;
  172. tmpWSK = tmpWSK->poprzedni;
  173. LicznikPozycji += (StringSize + STALA);
  174. }
  175. }
  176.  
  177. fclose(PLIK);
  178.  
  179. if (LicznikPozycji)
  180. return ostatni;
  181. else
  182. return NULL;
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement