refresh
This commit is contained in:
parent
33be425a21
commit
2ac7427108
110
du5/a_program.c
110
du5/a_program.c
@ -1,20 +1,5 @@
|
||||
#include <stdio.h>
|
||||
#include "stdlib.h"
|
||||
#include <string.h>
|
||||
#define SIZE 100
|
||||
#include "a_station.h"
|
||||
|
||||
struct station {
|
||||
struct car** tracks;
|
||||
int track_count;
|
||||
};
|
||||
|
||||
struct car {
|
||||
int capacity;
|
||||
char value[SIZE];
|
||||
struct car* next;
|
||||
};
|
||||
|
||||
struct station* create_station() {
|
||||
struct station* s = calloc(1, sizeof(struct station));
|
||||
s->tracks = calloc(STATION_SIZE, sizeof(struct car*));
|
||||
@ -23,33 +8,122 @@ struct station* create_station() {
|
||||
}
|
||||
|
||||
int select_track(struct station* s, const char* target) {
|
||||
unsigned long hash = 5381; //5381 это алгоритм DJB2
|
||||
int c;
|
||||
|
||||
while ((c = *target++)) { // не забываем ++ чтобы идти по строке
|
||||
hash = ((hash << 5) + hash) + c; //hash << 5 сдвигает все биты числа hash на 5 позиций влево. Это тоже самое, что умножить на 2 в пятой степени
|
||||
}
|
||||
|
||||
return (int)(hash % s->track_count);
|
||||
}
|
||||
|
||||
void add_target_capacity(struct station* s, const char* target, int capacity) {
|
||||
if (!s || !target) {
|
||||
return;
|
||||
}
|
||||
|
||||
int index = select_track(s, target);
|
||||
struct car* current = s->tracks[index];
|
||||
|
||||
if (current == NULL) { //Этот кусок кода создаёт “поезд” на пустой колее.
|
||||
struct car* new_car = calloc(1, sizeof(struct car));
|
||||
strcpy(new_car->value, target);
|
||||
new_car->capacity = capacity;
|
||||
new_car->next = NULL;
|
||||
s->tracks[index] = new_car;
|
||||
return;
|
||||
}
|
||||
|
||||
struct car* prev = NULL; //создаём указатель prev, который будет хранить предыдущий элемент списка
|
||||
while (current != NULL) {
|
||||
if (strcmp(current->value, target) == 0) {
|
||||
current->capacity += capacity;
|
||||
return;
|
||||
}
|
||||
prev = current;
|
||||
current = current->next;
|
||||
}
|
||||
|
||||
struct car* new_car = calloc(1, sizeof(struct car));
|
||||
strcpy(new_car->value, target);
|
||||
new_car->capacity = capacity;
|
||||
new_car->next = NULL;
|
||||
prev->next = new_car;
|
||||
}
|
||||
|
||||
struct car* find_target(struct station* s, const char* target) {
|
||||
if (!s || !target) return NULL;
|
||||
|
||||
int index = select_track(s, target);
|
||||
struct car* current = s->tracks[index];
|
||||
|
||||
while (current != NULL) {
|
||||
if (strcmp(current->value, target) == 0) {
|
||||
return current;
|
||||
}
|
||||
current = current->next;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int get_total_targets(struct station* s) {
|
||||
if (!s) return 0;
|
||||
|
||||
int count = 0;
|
||||
for (int i = 0; i < s->track_count; i++) {
|
||||
struct car* current = s->tracks[i];
|
||||
while (current != NULL) {
|
||||
count++;
|
||||
current = current->next;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
int get_total_capacity(struct station* s) {
|
||||
if (!s) return 0;
|
||||
|
||||
int total = 0;
|
||||
for (int i = 0; i < s->track_count; i++) {
|
||||
struct car* current = s->tracks[i];
|
||||
while (current != NULL) {
|
||||
total += current->capacity;
|
||||
current = current->next;
|
||||
}
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
void print_station(struct station* s) {
|
||||
if (!s) return;
|
||||
|
||||
printf("station>>>\n");
|
||||
for (int i = 0; i < s->track_count; i++) {
|
||||
struct car* current = s->tracks[i];
|
||||
printf("[%d]: ", i);
|
||||
while (current != NULL) {
|
||||
printf("%s (%d) -> ", current->value, current->capacity);
|
||||
current = current->next;
|
||||
}
|
||||
printf("NULL\n");
|
||||
}
|
||||
printf("<<<station\n");
|
||||
}
|
||||
|
||||
void destroy_station(struct station* s) {
|
||||
if (!s) return;
|
||||
|
||||
for (int i = 0; i < s->track_count; i++) {
|
||||
struct car* current = s->tracks[i];
|
||||
while (current != NULL) {
|
||||
struct car* to_delete = current;
|
||||
current = current->next;
|
||||
free(to_delete);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
free(s->tracks);
|
||||
free(s);
|
||||
}
|
||||
|
||||
34
du5/a_station.c
Normal file
34
du5/a_station.c
Normal file
@ -0,0 +1,34 @@
|
||||
#include <stdio.h>
|
||||
#include "a_station.h"
|
||||
|
||||
int main() {
|
||||
|
||||
struct station* s = create_station();
|
||||
|
||||
|
||||
add_target_capacity(s, "Kosice", 120);
|
||||
add_target_capacity(s, "Presov", 60);
|
||||
add_target_capacity(s, "Kosice", 30);
|
||||
add_target_capacity(s, "Bratislava", 200);
|
||||
add_target_capacity(s, "Zilina", 90);
|
||||
|
||||
|
||||
print_station(s);
|
||||
|
||||
|
||||
struct car* found = find_target(s, "Presov");
|
||||
if (found) {
|
||||
printf("Nájdená stanica: %s, kapacita: %d\n", found->value, found->capacity);
|
||||
} else {
|
||||
printf("Stanica 'Presov' sa nenašla.\n");
|
||||
}
|
||||
|
||||
|
||||
printf("Počet staníc: %d\n", get_total_targets(s));
|
||||
printf("Celkova kapacita: %d\n", get_total_capacity(s));
|
||||
|
||||
|
||||
destroy_station(s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
BIN
du5/station.exe
Normal file
BIN
du5/station.exe
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user