C - Baza danych, implementacja list.

0

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

0

już sobie poradziłem - do zamknięcia

1 użytkowników online, w tym zalogowanych: 0, gości: 1