Menu
Coddy logo textTech

קבלת שכנים

שיעור 7 מתוך 14 בקורס גרפים – סדרת מבני נתונים מס' 9 של Coddy.

אלגוריתמים כמו BFS, DFS ומסלול קצר ביותר אינם בוחנים את המפה הגולמית: הם שואלים "מי הם השכנים של הקודקוד הזה?" ופועלים לפי התשובה. המתודה getNeighbors שלנו חושפת את המידע הזה.

אם הקודקוד נמצא בגרף, החזר את רשימת השכנים שלו. החזר עותק אם ברצונך שהקוראים יוכלו לשנות את התוצאה בלי לפגוע בגרף (זהו הרגל טוב). אם הקודקוד לא קיים, החזר רשימה ריקה במקום לגרום לקריסה. כך הקוד שמשתמש במתודה נשאר פשוט: תמיד אפשר לעבור על התוצאה.

challenge icon

אתגר

קל

הוסף מתודה getNeighbors למחלקה Graph.

היא מקבלת מספר שלם key ומחזירה רשימה של השכנים שלו:

  • אם key נמצא ב-vertices, החזר את רשימת השכנים שלו (אפשר להחזיר עותק).
  • אם key לא נמצא בגרף, החזר רשימה ריקה.

נסו בעצמכם

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "graph.h"

static int _cmp_int(const void* a, const void* b) {
    int ai = *(const int*)a, bi = *(const int*)b;
    return (ai > bi) - (ai < bi);
}

int main() {
    Graph g;
    Graph_init(&g);
    char line[1024];
    while (fgets(line, sizeof(line), stdin)) {
        line[strcspn(line, "\r\n")] = '\0';
        char* cmd = strtok(line, " \t");
        if (!cmd) continue;
        if (strcmp(cmd, "verticesEmpty") == 0) { printf("%s\n", g.vertexCount == 0 ? "true" : "false"); }
        if (strcmp(cmd, "hasVertex") == 0) { char* arg = strtok(NULL, " \t"); if (arg) printf("%s\n", Graph_indexOf(&g, atoi(arg)) != -1 ? "true" : "false"); }
        if (strcmp(cmd, "addVertex") == 0) { char* arg = strtok(NULL, " \t"); if (arg) Graph_addVertex(&g, atoi(arg)); }
        if (strcmp(cmd, "addEdge") == 0) { char* a1 = strtok(NULL, " \t"); char* a2 = strtok(NULL, " \t"); if (a1 && a2) Graph_addEdge(&g, atoi(a1), atoi(a2)); }
        if (strcmp(cmd, "degree") == 0) {
            char* arg = strtok(NULL, " \t");
            if (arg) {
                int k = atoi(arg);
                int ki = Graph_indexOf(&g, k);
                printf("%d\n", ki == -1 ? 0 : g.vertices[ki].n);
            }
        }
        if (strcmp(cmd, "hasEdge") == 0) { char* a1 = strtok(NULL, " \t"); char* a2 = strtok(NULL, " \t"); if (a1 && a2) printf("%s\n", Graph_hasEdge(&g, atoi(a1), atoi(a2)) ? "true" : "false"); }
        if (strcmp(cmd, "neighbors") == 0) {
            char* arg = strtok(NULL, " \t");
            if (arg) {
                int buf[MAX_NEIGHBORS];
                int n = Graph_getNeighbors(&g, atoi(arg), buf);
                qsort(buf, n, sizeof(int), _cmp_int);
                for (int i = 0; i < n; i++) {
                    if (i > 0) printf(" ");
                    printf("%d", buf[i]);
                }
                printf("\n");
            }
        }
    }
    return 0;
}

כל השיעורים ביחידה גרפים – סדרת מבני נתונים מס' 9

תרגלו בעצמכם: קומפיילר C אונליין