• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Graf transponowany

Aruba Cloud - Virtual Private Server VPS
0 głosów
288 wizyt
pytanie zadane 3 czerwca 2017 w C i C++ przez teusiek Początkujący (280 p.)

Witam! Jestem na matmie ale jednym z moich przedmiotów jest także programowanie ale nie ukrywam, że nie najlepiej sobie z nim radze, więc proszę o cierpliwość. laugh

Mam za zadanie napisać program, który stworzy graf transponowany z grafu wczytanego z pliku oraz wyświetli listy sąsiedztwa grafu transponowanego.

plik graf.txt zawiera:

5
0 1
0 2
0 4
1 2
2 3
1 3
3 3
3 4
4 2


Zamieszczam co tam wyskorobałem i z góry dziękuję za pomoc!

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

typedef struct ElemListy {
    int nr;
    struct ElemListy *next;
} ElemListy;

typedef struct {
    int n; // ilosc wierzcholkow grafu
    ElemListy* ls[MAX]; // ls[k] jest wskaznikiem do pierwszego elementu listy sasiedztwa wierzcholka nr k
} Graf;

void WczytajTransponowany(char* nazwa_pliku, Graf* gT)
{
    int i;

    FILE* f = fopen(nazwa_pliku, "r");
    if (f == NULL) {
        printf("Blad otwierania pliku %s.\n", nazwa_pliku);
        return;
    }

    gT->n = 0;
    if (fscanf(f, "%d", &(gT->n)) == 0) {
        printf("Zly format danych dla grafu.\n");
        fclose(f);
        return; // zly format pliku danych wejsciowych
    }

    for (i = 0; i < gT->n; i++)
        gT->ls[i] = NULL;

    while (!feof(f)) {
        int u, v;
        if (fscanf(f, "%d%d", &v, &u) == 2) {
            // mamy krawedz z v do u

            if (v >= gT->n || u >= gT->n) {
                printf("Nie poprawne dane grafu.\n");
                fclose(f);
                return;
            }

            ElemListy* wsk = (ElemListy*) malloc(sizeof(ElemListy));
            wsk->nr = u;
            wsk->next = gT->ls[v];
            gT->ls[v] = wsk;
        }
    }

    fclose(f);
}

void WczytajGraf(char* nazwa_pliku, Graf* g)
// nazwa_pliku jest parametrem wejsciowy
// g jest parametrem wyjsciowym
{
    int i;

    FILE* f = fopen(nazwa_pliku, "r");
    if (f == NULL) {
        printf("Blad otwierania pliku %s.\n", nazwa_pliku);
        return;
    }

    g->n = 0;
    if (fscanf(f, "%d", &(g->n)) == 0) {
        printf("Zly format danych dla grafu.\n");
        fclose(f);
        return; // zly format pliku danych wejsciowych
    }

    for (i = 0; i < g->n; i++)
        g->ls[i] = NULL;

    while (!feof(f)) {
        int u, v;
        if (fscanf(f, "%d%d", &u, &v) == 2) {
            // mamy krawedz z u do v

            if (u >= g->n || v >= g->n) {
                printf("Nie poprawne dane grafu.\n");
                fclose(f);
                return;
            }

            ElemListy* wsk = (ElemListy*) malloc(sizeof(ElemListy));
            wsk->nr = v;
            wsk->next = g->ls[u];
            g->ls[u] = wsk;
        }
    }

    fclose(f);
}

void WyswietlTransponowany(Graf* gT)
{
    int i;

    printf("Ilosc wierzcholkow: %d.\n", gT->n);

    for (i = 0; i < gT->n; i++) {
        printf("Lista sasiedztwa wierzcholka nr %d: ", i);
        ElemListy* wsk = gT->ls[i];
        while (wsk != NULL) {
            printf("%d ", wsk->nr);
            wsk = wsk->next;
        }
        printf("\n");
    }
}

void WyswietlGraf(Graf* g)
{
    int i;

    printf("Ilosc wierzcholkow: %d.\n", g->n);

    for (i = 0; i < g->n; i++) {
        printf("Lista sasiedztwa wierzcholka nr %d: ", i);
        ElemListy* wsk = g->ls[i];
        while (wsk != NULL) {
            printf("%d ", wsk->nr);
            wsk = wsk->next;
        }
        printf("\n");
    }
}

int main()
{
    char nazwa_pliku[80];
    printf("Podaj nazwe pliku zawierajacego dane grafu: ");
    scanf("%s", nazwa_pliku);

    printf("Graf g\n");
    Graf g;
    WczytajGraf(nazwa_pliku, &g);
    WyswietlGraf(&g);

    printf("\n");

    printf("Graf gT\n");
    Graf gT;
    WczytajTransponowany(nazwa_pliku, &gT);
    WyswietlTransponowany(&gT);

    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 4 czerwca 2017 przez racmo Obywatel (1,320 p.)
wybrane 4 czerwca 2017 przez teusiek
 
Najlepsza

W funkcji WczytajTransponowany (linia 37) powinno być:

if (fscanf(f, "%d%d", &u, &v) == 2)

Ponieważ, dalej w tej funkcji zapisujesz odwrotnie niż w funkcji WczytajGraf to nie możesz też odwrotnie wczytywać danych z pliku do zmiennych. Mam nadzieję, że to co napisałam jest zrozumiałe.
Nie wiem czy Twójemu nauczycielowi chodziło o takie rozwiązanie, ale ważne że działa :D

 

komentarz 4 czerwca 2017 przez teusiek Początkujący (280 p.)
Dziękuje bardzo, przeoczyłem te dwie literki :p

Podobne pytania

0 głosów
0 odpowiedzi 603 wizyt
pytanie zadane 23 kwietnia 2021 w C i C++ przez Mavimix Dyskutant (8,420 p.)
0 głosów
0 odpowiedzi 549 wizyt
pytanie zadane 24 września 2019 w C i C++ przez jjanickij Użytkownik (510 p.)
0 głosów
0 odpowiedzi 113 wizyt
pytanie zadane 14 listopada 2022 w HTML i CSS przez MacGyver Nowicjusz (120 p.)

93,327 zapytań

142,325 odpowiedzi

322,396 komentarzy

62,657 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...