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ść.
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; }