Menu
Coddy logo textTech

Kenar Kaldır

Coddy'nin Graflar - Veri Yapıları Serisi #9 kursunda ders 8 / 14.

Bir kenarı kaldırmak, bir kenar eklemenin ayna görüntüsüdür: bağlantı her iki yönde de saklandığı için her iki tarafı da geri almamız gerekir. v'yi u'nun komşu listesinden çıkarın ve u'yu v'ninkinden çıkarın.

Uç durumlar konusunda dikkatli olun. Eğer u veya v grafikte hiç yoksa veya kenar hiç eklenmemişse, metot sessizce hiçbir şey yapmamalıdır. Köşeleri değil, kenarı kaldırıyoruz: köşelerin kendileri (sahip oldukları diğer kenarlarla birlikte) grafikte kalır.

challenge icon

Görev

Kolay

Graph sınıfına bir removeEdge metodu ekleyin.

Bu metot iki tam sayı (u ve v) alır ve aralarındaki kenarı kaldırır:

  • Eğer u, vertices içindeyse, v'yi onun komşu listesinden kaldırın.
  • Eğer v, vertices içindeyse, u'yu onun komşu listesinden kaldırın.
  • Eğer bir köşe veya kenar mevcut değilse, hiçbir şey yapmayın. Köşelerin kendileri grafikte kalır.

Kendin dene

#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;
}

Graflar - Veri Yapıları Serisi #9 bölümündeki tüm dersler