Podział listy źródłowej na cztery mniejsze

0

Czesc,
mam do napisania program ktory wczytuje z pliku tekstowego do jednokierunkowej listy troche rekordów. Przykladowe 6 rekordow:

1	1	2018-02-10.17:20:22	25
2	2	2018-02-10.17:20:27	24.44
3	3	2018-02-10.17:20:30	25.56
4	4	2018-02-10.17:20:36	24.06
5	1	2018-02-10.17:25:13	25.31
6	2	2018-02-10.17:25:16	25.37

nr pomiaru,nr czujnika wykonującego pomiar,data i godzina pomiaru i pomiar temperatury.
Po wczytaniu wszystkich rekordów do listy muszę rozdzielić elementy owej listy na cztery listy jednokierunkowe,po jednej liście dla każdego z czujników(czujników jest 4). I tu własnie mam problem bo nie mogę dojść do tego rozdzielić te elementy,na razie udało mi się tylko zaincjalizować poprawnie cztery nowe głowy. Wiem ze kod nie jest piękny ale na razie skupiam się tylko żeby program działa,potem będę refrakturyzował :) Będę bardzo wdzięczny za jakieś wskazówki

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

struct pomiar {
	unsigned int nr_pomiaru;
	unsigned int nr_czujnika;
	char data_i_czas[20];
	double temp;
	struct pomiar *nast;
};

int main()
{
	struct pomiar *glowa = NULL, *glowa1 = NULL, *glowa2 = NULL, *glowa3 = NULL, *glowa4 = NULL;
	struct pomiar *biezacy;
	FILE *fp;
	unsigned int nr_pomiaru;
	unsigned int nr_czujnika;
	char data_i_czas[20];
	double temp;
	char nazwa_pliku[20];
	printf("Podaj nazwe pliku z danymi:\n");
	scanf("%s", nazwa_pliku);
	strcat(nazwa_pliku, ".txt");
	if ((fp = fopen(nazwa_pliku, "r")) == NULL)
	{
		printf("Nie otwarto pliku");
		exit(0);
	}
	else
		printf("Otwarto plik\n");

	fscanf(fp, "%d %d %s %lf", &nr_pomiaru, &nr_czujnika, data_i_czas, &temp);
	while (!feof(fp))
	{
		if (glowa == NULL)
			glowa = biezacy = malloc(sizeof(struct pomiar));
		else
		{
			biezacy->nast = malloc(sizeof(struct pomiar));
			biezacy = biezacy->nast;
		}
		biezacy->nr_pomiaru = nr_pomiaru;
		biezacy->nr_czujnika = nr_czujnika;
		strcpy(biezacy->data_i_czas, data_i_czas);
		biezacy->temp = temp;
		biezacy->nast = NULL;
		fscanf(fp, "%d %d %s %lf", &nr_pomiaru, &nr_czujnika, data_i_czas, &temp);
	}
	fclose(fp);
	biezacy = glowa;

	while (biezacy != NULL)
	{
		if (biezacy->nr_czujnika == 1)
		{
			if (glowa1 == NULL)
				glowa1 =biezacy;
			else
				biezacy = biezacy->nast;
			
		}
		
		if (biezacy->nr_czujnika == 2)
		{
			if (glowa2 == NULL)
				glowa2 = biezacy;
			else
				biezacy = biezacy->nast;
			
		}

		if (biezacy->nr_czujnika == 3)
		{
			if (glowa3 == NULL)
				glowa3 = biezacy;
			else
				biezacy = biezacy->nast;
		}
		
		if (biezacy->nr_czujnika == 4)
		{
			if (glowa4 == NULL)
				glowa4 = biezacy;
			else
				biezacy = biezacy->nast;
		}
		
	}
	biezacy->nast = NULL;
	
	
	return 0;

}
2

To:

biezacy = biezacy->nast;

można spokojnie wyrzucić z else i umieścić pod tymi ifami, bo i tak musimy przejść do kolejnego elementu listy.

Zauważ że dla pierwszej listy masz 2 zmienne glowa (pierwszy element listy) oraz biezacy (obecny element listy) - to samo musisz mieć dla pozostałych 4 list aby wiedzieć gdzie się zaczyna oraz gdzie dodać kolejny element:

if (biezacy->nr_czujnika == 1)
{
	if (glowa1 == NULL)
		biezacy1 = glowa1 = biezacy;
	else
	{
		biezacy1->nast = biezacy;
		biezacy1 = biezacy1->nast;
	}
}

To samo dla pozostałych czujników.

Po skończonej pętli while, wszystkie 4 wskaźniki biezacyX wskazują na ostatni element dodany do listy, jednakże ostatni element nadal może zawierać wskaźnik na następny element w oryginalnej liście, musisz więc ustawić nast na NULL.

I tak całość prezentuje się w ten sposób:

while (biezacy != NULL)
{
	if (biezacy->nr_czujnika == 1)
	{
		if (glowa1 == NULL)
			biezacy1 = glowa1 = biezacy;
		else
		{
			biezacy1->nast = biezacy;
			biezacy1 = biezacy1->nast;
		}
	}

	if (biezacy->nr_czujnika == 2)
	{
		if (glowa2 == NULL)
			biezacy2 = glowa2 = biezacy;
		else
		{
			biezacy2->nast = biezacy;
			biezacy2 = biezacy2->nast;
		}
	}

	if (biezacy->nr_czujnika == 3)
	{
		if (glowa3 == NULL)
			biezacy3 = glowa3 = biezacy;
		else
		{
			biezacy3->nast = biezacy;
			biezacy3 = biezacy3->nast;
		}
	}

	if (biezacy->nr_czujnika == 4)
	{
		if (glowa4 == NULL)
			biezacy4 = glowa4 = biezacy;
		else
		{
			biezacy4->nast = biezacy;
			biezacy4 = biezacy4->nast;
		}
	}

	biezacy = biezacy->nast;
}

biezacy1->nast = NULL;
biezacy2->nast = NULL;
biezacy3->nast = NULL;
biezacy4->nast = NULL;

Napisałem dodatkową funkcję w celu testowania czy wszystko gra:

void print_list(struct pomiar *biezacy)
{
	printf("\nPomiar z czujnika:\n");
	while (biezacy)
	{
		printf("Pomiar: %u\nCzujnik: %u\nDiC: %s\nTemp: %lf\n\n", biezacy->nr_pomiaru, biezacy->nr_czujnika, biezacy->data_i_czas, biezacy->temp);
		biezacy = biezacy->nast;
	}
}

Po wywołaniu tego dla każdej głowy:

print_list(glowa1);
print_list(glowa2);
print_list(glowa3);
print_list(glowa4);

Wynik to:

Pomiar z czujnika:
Pomiar: 1
Czujnik: 1
DiC: 2018-02-10.17:20:22
Temp: 25.000000

Pomiar: 5
Czujnik: 1
DiC: 2018-02-10.17:25:13
Temp: 25.310000


Pomiar z czujnika:
Pomiar: 2
Czujnik: 2
DiC: 2018-02-10.17:20:27
Temp: 24.440000

Pomiar: 6
Czujnik: 2
DiC: 2018-02-10.17:25:16
Temp: 25.370000


Pomiar z czujnika:
Pomiar: 3
Czujnik: 3
DiC: 2018-02-10.17:20:30
Temp: 25.560000


Pomiar z czujnika:
Pomiar: 4
Czujnik: 4
DiC: 2018-02-10.17:20:36
Temp: 24.060000

Pozostawię Tobie upiększenie tego kodu, ważne byś wiedział co, jak i dlaczego ;)

Przy okazji - używasz złego formatu dla unsigned int - powinno być %u, nie %d.
Jeżeli jeszcze tego nie robisz do polecam kompilować z flagami -Wall -pedantic. Kompilator jest wtedy bardziej czujny i upierdliwy :D

0

Wow,nie spodziewałem się aż takiej odpowiedzi <3 Dzięki wielkie za pomoc kolego

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