Ok, jadę dalej i mam tak:
#include <stdio.h>
#include <stdlib.h>
#define ROZMIAR_TABLICY 4
struct lista
{
float odleglosc;
int numer1;
int numer2;
struct lista* dalej;
};
typedef struct lista* Lista;
// FUNKCJA PRZERZUCAJACA Z TABLICY NA LISTE (tablica, lista incydencji):
void PrzerzucTablicaLista(float tablica[ROZMIAR_TABLICY][ROZMIAR_TABLICY], Lista* list)
{
int i,j;
for(i=0; i<ROZMIAR_TABLICY; i++)
{
for(j=0; j<ROZMIAR_TABLICY; j++)
{
// Jesli i == j nie ma sensu probowac wprowadzac wartosci, nie wprowadzamy rowniez jesli komorka tablicy 2D ma wartosc -1
if (i != j && tablica[i][j] != -1)
{
Lista temp = (Lista) malloc(sizeof(struct lista)); // malloc rezerwuje miejsce w pamieci o rozmiarze struktury lista
temp -> odleglosc = tablica[i][j];
temp -> numer1 = i;
temp -> numer2 = j;
temp -> dalej = *list; // do dalej zapisujemy wskaznik na nastepny element
*list = temp;
}
}
}
}
// FUNKCJA PRZERZUCAJACA Z LISTY NA TABLICE (lista incydencji, tablica):
void PrzerzucListaTablica(Lista lista, float (*tablica)[ROZMIAR_TABLICY])
{
// Deklarujemy tablice do sprawdzania czy jest zapisana odleglosc dla poszczegolnych komorek tablicy 2D
int tab_spr[ROZMIAR_TABLICY][ROZMIAR_TABLICY];
while (lista != NULL) // Dopoki nie natrafimy na wskaznik na NULL/nic
{
tablica[lista -> numer1][lista -> numer2] = lista -> odleglosc;
tab_spr[lista -> numer1][lista -> numer2] = 1; // Jest zapisana odleglosc
lista = lista -> dalej; // Zapisujemy do lista wskaznik na nastepny element
}
// Sprawdzamy czy dla poszczegolnych komorek tablicy 2D jest zapisana odleglosc, jesli nie, wstawiamy wartosc-1
int i,j;
for(i=0; i<ROZMIAR_TABLICY; i++)
{
for(j=0; j<ROZMIAR_TABLICY; j++)
{
if (tab_spr[i][j] != 1)
{
tablica[i][j] = -1;
}
}
}
}
void wczytaj(float tablica[ROZMIAR_TABLICY][ROZMIAR_TABLICY])
{
int i,j;
for(i=0; i<ROZMIAR_TABLICY; i++)
{
for(j=0; j<ROZMIAR_TABLICY; j++)
{
if (i != j)
{
printf("Podaj odleglosc od %d do %d: ", i,j);
scanf("%f", &tablica[i][j]);
}
}
}
}
void drukListy(Lista lista[10000])
{
int i;
for (i=0; i<ROZMIAR_TABLICY; i++)
{
printf("Lista dla %d", i);
while (lista[i] != NULL) // dopoki nie natrafimy na wskaznik na null/nic
{
printf("odleglosc z %d do %d: %f\n", lista[i] -> numer1, lista[i] -> numer2, lista[i] -> odleglosc);
lista[i] = lista[i] -> dalej; // zapisujemy do lista wskaznik na nastepny element
}
}
}
void drukTablicy(float tablica[ROZMIAR_TABLICY][ROZMIAR_TABLICY])
{
int i,j;
for (i=0; i<ROZMIAR_TABLICY; i++)
{
for (j=0; j<ROZMIAR_TABLICY; j++)
{
if (i != j)
{
printf("%6.2f", tablica[i][j]);
}
else
{
printf(" X ");
}
}
printf("\n");
}
}
int main()
{
float tablica[ROZMIAR_TABLICY][ROZMIAR_TABLICY] = {{-1,11,6,-1},{12,-1,-1,9},{-1,-1,-1,15},{-1,8,-1,-1}};
// float tablica[ROZMIAR_TABLICY][ROZMIAR_TABLICY]; // Tu beda dane wczytane z klawiatury
// float tablica2[ROZMIAR_TABLICY][ROZMIAR_TABLICY]; // Tu po przejsciu z tablicy na liste i z powrotem na tablice
Lista tab[10000];
// printf("PODAJ ODLEGOSCI (-1 gdy nie ma polaczenia):\n");
// wczytaj(tablica);
PrzerzucTablicaLista(tablica, &(*tab));
// PrzerzucListaTablica(lista, tablica2);
printf("\n\nLISTA:\n");
drukListy(tab);
printf("\n\nTABLICA:\n");
// drukTablicy(tablica2);
return 0;
}
Nie wiem tylko jak zmodyfikować funkcję PrzerzucTablicaLista() by jak zmieni się i zapisywała już do nowej tablicy. Myślałem by dodać kwadratowe nawiasy:
temp -> dalej = *list[i]; // do dalej zapisujemy wskaznik na nastepny element
*list[i] = temp;
Wtedy dostaję błąd:
poltab.c: error: incompatible types in assignment
poltab.c: error: incompatible types in assignment
Więc dodaję do argumentu funkcji nawiasy kwadratowe:
void PrzerzucTablicaLista(float tablica[ROZMIAR_TABLICY][ROZMIAR_TABLICY], Lista* list[10000])
To z kolei daje błąd:
poltab.c: warning: passing arg 2 of
PrzerzucTablicaLista' from incompatible pointer type`
I nie wiem jak modyfikować tą linijkę:
PrzerzucTablicaLista(tablica, &(*tab));
By to jednak działało... proszę o pomoc ;]