Odwracanie listy jednokierunkowej nie działa prawidłowo

0

Hej,
mam do napisania programik który wczytuje z pliku tekstowego 5 rekordów(1 rekord to nr indeksu nazwisko i ocena studenta) do jednokierunkowej listy przy okazji wyświetlająć obecnie dodawany rekord,po czym odwrócenie kolejności listy i odczytanie jej z nowym porzadkiem,czyli cos jak:
1 2 3 4 5 -> 5 4 3 2 1
Problem mam taki ze lista niby sie odwraca bo odczytuje ostatni rekord listy przed odwróceniem ale odczytuje go 5 razy czyli mam:
1 2 3 4 5-> 5 5 5 5 5 i zbytnio nie wiem czemu nie odczytuje reszty rekordow ;/
algorytm od odwracania listy zerżnąłem z internetu i w sumie to średnio go dalej rozumiem ale niby dziala xd
Dostane jakieś tipy? ;/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>


struct student {
	int nr_indeksu;
	char nazwisko[30];
	float ocena;
	struct student *nast;
};

typedef struct student LIST;

int main()
{

	LIST *glowa = NULL, *poprz, *biezacy, *nast;
	
	char nazwisko[30];
	float ocena;
	int nr_indeksu;
	FILE* fp;
	if ((fp = fopen("dane.txt", "r")) == NULL)
		exit(1);
	
	while (!feof(fp))
	{
		fscanf(fp, "%d %s %f", &nr_indeksu, nazwisko, &ocena);
		biezacy = (LIST*)malloc(sizeof(LIST));
		if (glowa == NULL)
			glowa = biezacy;
		else
			poprz->nast = biezacy;
		biezacy->nast = NULL;
		biezacy->nr_indeksu = nr_indeksu;
		strcpy(biezacy->nazwisko, nazwisko);
		biezacy->ocena = ocena;
		printf("Teraz wczytuje...\n");
		Sleep(1000);
		printf("Indeks: %d Student:%s Ocena:%0.1f\n", biezacy->nr_indeksu, biezacy->nazwisko, biezacy->ocena);
		poprz = biezacy;

	}
	fclose(fp);
	printf("\n\n\n");
	LIST *tmp, *pom;
	if (glowa == NULL)
	{
		printf("brak elementow\n");
	}
	else
	{
		tmp = glowa;
		while (tmp->nast != NULL)
		{
			pom = tmp->nast;
			tmp->nast = pom->nast;
			pom->nast = glowa;
			glowa = pom;
		}
	}
	while (glowa!=NULL)
	{
		printf("Indeks: %d Student:%s Ocena:%0.1f\n", biezacy->nr_indeksu, biezacy->nazwisko, biezacy->ocena);
		glowa = glowa->nast;
	}

	


	return 0;

1

Podziel ten kod na mniejsze fragmenty, bo straszny w nim bałagan. Tak więc rozłóż główny blok kodu na kilka czytelnych funkcji – o wiele łatwiej będzie go analizować. Jak już to zrobisz to zastanowimy się nad samym mechanizmem odwracania listy.

Na zachętę – wyświetlenie listy jednokierunkowej od końca bez problemu można wykonać za pomocą funkcji rekurencyjnej. Jeśli nie potrzebujesz fizycznie odwrócić listy (np. po to, aby ją później zapisać do pliku) to niczego nie odwracaj. Żeby móc to zrobić, potrzeba mieć wskazania na poprzednie węzły, czego lista jednokierunkowa nie oferuje (tu też rekurencja miałaby zastosowanie).

0

No wlasnie chodzi zeby po tym zapisac ją do pliku tekstowego ale o tym juz nie pisalem bo nie uznalem to za wazne :P
Podziele na funkcje i wrzuce kod jeszcze raz jutro :)

2
Radi175 napisał(a):
	while (glowa!=NULL)
	{
		printf("Indeks: %d Student:%s Ocena:%0.1f\n", biezacy->nr_indeksu, biezacy->nazwisko, biezacy->ocena);
		glowa = glowa->nast;
	}

	


	return 0;

Iterujesz po wskaźniku glowa, ale wypisujesz wskaźnik biezacy, który nie ulega zmianie.

0

:O faktycznie,juz wszystko śmiga jak mialo,dziena nalik

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