Witam wszystkich!
Aktualnie robię program na zaliczenie z C który obsługuje bazę danych zawartą w pliku xxx.txt.
Struktura z której korzystam to lista jednokierunkowa w której są dwa wskaźniki wskazujące na dwie pozostałe listy.
Struktury wyglądają następująco:
typedef struct dyskografia {
char nazwa[ROZT];
char rok[ROZT];
struct dyskografia * nast;
};
typedef struct czlonkowie {
char imie[ROZT];
char nazwisko[ROZT];
char funkcja[ROZT];
struct czlonkowie * nast;
};
typedef struct zespol {
char tytul[ROZT];
char gatunek[ROZT];
char rok[ROZT];
struct zespol * nast;
struct czlonkowie * czlonkowie;
struct dyskografia * dyskografia;
};
gdzie ROZT jest stała równą 45 - na końcu ogarnę sensowne liczby(ewentualne rady co do tej stałej mile widziane).
Aktualnie piszę funkcję czytającą dane z pliku i wpisującą te dane do list. Potrzebuję porady jak napisać kod, ażeby wynikowo można było poruszać się po całej liście posiadając jedną głowę wskazującą początek listy zespol o ile tak się da - wszelkie rady mile widziane.
Moja struktura obrazowo powinna wyglądać tak:
http://www24.speedyshare.com/pf3vX/download/20130925684.jpg
1.Kod funkcji nadrzednej:
/*Funkcja zapisujaca plik txt z baza danych do listy*/
struct zespol * AddAllToList()
{
FILE *wp;
char slowa[45];
char slowo[45];
struct zespol * glowny = NULL;
struct zespol * biezacy;
int j=1;
/* ustawianie wskaznika do pliku */
if ((wp = fopen("nofwy.txt","a+")) == NULL)
{
printf("Nie moge otworzyc pliku");
exit(1);
}
/* petla czytajaca linie pliku do zmiennej tablicowej */
while (fgets(slowa,70,wp) != NULL)
{
/* Przydzielanie rekordowi pamięci */
if (j == 1) biezacy = (struct zespol *) malloc(sizeof(struct zespol));
if (glowny == NULL)
glowny = biezacy;
else
biezacy->nast = NULL;
if (j==1) //odczytanie linijki z nazwa zespolu
{strcpy(biezacy->tytul,slowa);
printf("tytul: %s",biezacy->tytul);
}
if (j==2) //odczytanie linijki z rokiem zalozenia
{strcpy(biezacy->rok,slowa);
printf("rok: %s",biezacy->rok);}
if (j==3){ //odczytanie linijki z gatunkiem
strcpy(biezacy->gatunek,slowa);
printf("gatunek: %s",biezacy->gatunek);
fgets(slowa,70,wp); // pozbywamy się linijki Sklad:
printf("TU BYLA LINIJKA SKLAD\n");
j++; // j++ - przechodzimy do kolejnego warunku w ktorym sa clzonkowie
}
if (j == 4) j = ReadMembers(biezacy,slowo, wp, j);
if (j == 5) ReadDiscographs(biezacy,slowo, wp, j);
j++;
if (j == 6) j=1;
if (j == 1)biezacy = biezacy->nast;
if (j == 1) fgets(slowa,70,wp); //warunek czytajacy puste cos po zqakonczeniu czytania 1 rekordu
}
if (fclose(wp) != 0) printf("Blad przy zamykaniu pliku. \n");
printf("1:%s\n",glowny->tytul);
printf("2:%s\n",glowny->rok);
printf("3:%s\n",glowny->gatunek);
return glowny; //zwracanie glowy do listy zespol
}
2.Kod pierwszej funkcji podrzędnej
/* Pętla do sterowania wczytywaniem czlonkow do listy */
int ReadMembers(struct zespol * biezacy, char slowo[], FILE *wp, int j)
{
struct czlonkowie * glowny2 = NULL;
struct czlonkowie * biezacy2;
int i = 1;
while (strcmp("Dyskografia:",slowo) != 0) //wykonuj czynnosci dopoki
//nie napotkasz linijki: Dyskografia:
{
fscanf(wp,"%s", slowo); //warunek sczytujacy slowa
if (strcmp("Dyskografia:",slowo) != 0) //warunek sprawdzania czy slowo == nie jest dyskografia:
{
if (i != 3)
{
if (i == 1) biezacy2 = (struct czlonkowie *) malloc(sizeof(struct czlonkowie));
if (j == 4) biezacy->czlonkowie = biezacy2; //TEST podczepienia glowy
}
if (i == 1) {strcpy(biezacy2->imie,slowo); printf("imie: %s\n",biezacy2->imie);} //imie
if (i == 2) {strcpy(biezacy2->nazwisko,slowo); printf("nazwisko: %s\n",biezacy2->nazwisko);} //nazwisko
if (i == 4) {strcpy(biezacy2->funkcja,slowo); printf("funkcja: %s\n",biezacy2->funkcja);} //funkcja
i++;
if (i == 5) i=1;
if (i == 1) biezacy2=biezacy2->nast;
j = 0;
}
}
j=4;
return j;
}
3.Kod drugiej funkcji podrzędnej
/* Pętla do sterowania wczytywaniem dyskografii do listy */
int ReadDiscographs(struct zespol * biezacy, char slowo[], FILE *wp, int j)
{
struct dyskografia * glowny3 = NULL;
struct dyskografia * biezacy3;
int i = 1;
while (strcmp("dupa",slowo) != 0) // zamienic na pusta linie
{
fscanf(wp,"%s", slowo);
if (strcmp("dupa",slowo) != 0) //warunek sprawdzania czy slowo == nie jest dyskografia:
{
if (i == 1) biezacy3 = (struct dyskografia *) malloc(sizeof(struct dyskografia));
if (j == 5) biezacy->dyskografia = biezacy3; //TEST
if (i==1) {strcpy(biezacy3->nazwa,slowo); printf("album: %s\n",biezacy3->nazwa);}
if (i==3) {strcpy(biezacy3->rok,slowo); printf("rok: %s\n",biezacy3->rok);}
i++;
if (i==4) i=1;
if (i == 1) biezacy3 = biezacy3->nast;
j=0;
}
}
printf("\n");
j=5;
return 0;
}
PS programowania dopiero się uczę, także proszę o wyrozumiałość. Z góry dzięki za wszelką pomoc.
PS2 Przepraszam za wszelkie niejasności wynikające z kody, ale tak właściwie to jest mój pierwszy program w C.
PS3 korzystam z Microsoft Visual Studio 2010
PS4 wszystkie komendy printf("xxx") są komendami testowymi