الحجم
الدرس 9 من 14 في دورة المخططات - سلسلة هياكل البيانات #9 على Coddy.
آخر شيء يحتاجه الرسم البياني (Graph) هو طريقة سريعة لإخبارنا بعدد الرؤوس (vertices) التي يحتوي عليها. بما أن vertices عبارة عن خريطة (map) مفتاحها هو مفتاح الرأس، فإن الإجابة هي ببساطة حجم تلك الخريطة.
لاحظ أن هذا يحسب الرؤوس، وليس الحواف. استدعاء addEdge(1, 2) على رسم بياني فارغ يضيف رأسين وحافة واحدة، لذا يصبح الحجم 2. إزالة الحافة لاحقاً لا يغير الحجم: تظل الرؤوس موجودة حتى يتم حذفها صراحةً.
التحدي
سهلأضف طريقة size إلى فئة Graph.
لا تأخذ هذه الطريقة أي مدخلات وتعيد عدد الرؤوس الموجودة حالياً في الرسم البياني (عدد الإدخالات في vertices).
جرّب بنفسك
#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");
}
}
if (strcmp(cmd, "removeEdge") == 0) { char* a1 = strtok(NULL, " \t"); char* a2 = strtok(NULL, " \t"); if (a1 && a2) Graph_removeEdge(&g, atoi(a1), atoi(a2)); }
if (strcmp(cmd, "size") == 0) { printf("%d\n", Graph_size(&g)); }
}
return 0;
}