Menu
Coddy logo textTech

Kante entfernen

Lektion 8 von 14 im Kurs Graphen - Datenstrukturen-Serie #9 von Coddy.

Das Entfernen einer Kante ist das Spiegelbild zum Hinzufügen einer Kante: Da die Verbindung in beide Richtungen gespeichert wird, müssen wir beide Seiten rückgängig machen. Entfernen Sie v aus der Nachbarliste von u und entfernen Sie u aus der von v.

Seien Sie vorsichtig mit den Grenzfällen. Wenn u oder v überhaupt nicht im Graphen vorhanden sind oder wenn die Kante nie hinzugefügt wurde, sollte die Methode stillschweigend nichts unternehmen. Wir entfernen die Kante, nicht die Knoten: Die Knoten selbst bleiben im Graphen (mit allen anderen Kanten, die sie noch haben).

challenge icon

Aufgabe

Einfach

Fügen Sie der Klasse Graph eine Methode removeEdge hinzu.

Sie nimmt zwei Ganzzahlen u und v entgegen und entfernt die Kante zwischen ihnen:

  • Wenn u in vertices vorhanden ist, entfernen Sie v aus seiner Nachbarliste.
  • Wenn v in vertices vorhanden ist, entfernen Sie u aus seiner Nachbarliste.
  • Wenn ein Knoten oder die Kante nicht existiert, tun Sie nichts. Die Knoten selbst bleiben im Graphen erhalten.

Probier es selbst

#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)); }
    }
    return 0;
}

Alle Lektionen in Graphen - Datenstrukturen-Serie #9