الحصول على الجيران
الدرس 7 من 14 في دورة المخططات - سلسلة هياكل البيانات #9 على Coddy.
خوارزميات مثل BFS و DFS وأقصر مسار لا تنظر إلى الخريطة الخام: بل تسأل "ما هم جيران هذا الرأس؟" وتتتبع الإجابة. توفر طريقة getNeighbors الخاصة بنا ذلك.
إذا كان الرأس موجوداً في المخطط، فقم بإرجاع قائمة جيرانه. أعد نسخة إذا كنت تريد من المستدعين تعديل النتيجة دون تخريب المخطط (هذه عادة جيدة). إذا كان الرأس غير موجود، فقم بإرجاع قائمة فارغة بدلاً من الانهيار. هذا يحافظ على بساطة كود العميل: حيث يمكنه دائماً تكرار النتيجة.
التحدي
سهلأضف طريقة getNeighbors إلى فئة Graph.
تأخذ هذه الطريقة عدداً صحيحاً key وتعيد قائمة بجيرانه:
- إذا كان
keyموجوداً فيvertices، فقم بإعادة قائمة جيرانه (نسخة منها تفي بالغرض). - إذا كان
keyغير موجود في الرسم البياني (graph)، فقم بإعادة قائمة فارغة.
جرّب بنفسك
#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
2مشروع الـ Graph
فئة الـ Graphإضافة رأس (Vertex)إضافة حافة (Edge)هل توجد حافةالحصول على الجيرانحذف حافةالحجم