refresh
This commit is contained in:
parent
33be425a21
commit
2ac7427108
114
du5/a_program.c
114
du5/a_program.c
@ -1,20 +1,5 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include "stdlib.h"
|
|
||||||
#include <string.h>
|
|
||||||
#define SIZE 100
|
|
||||||
#include "a_station.h"
|
#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* create_station() {
|
||||||
struct station* s = calloc(1, sizeof(struct station));
|
struct station* s = calloc(1, sizeof(struct station));
|
||||||
s->tracks = calloc(STATION_SIZE, sizeof(struct car*));
|
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) {
|
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) {
|
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) {
|
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) {
|
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) {
|
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) {
|
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) {
|
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