[c] problem ze stworzeniem listy

ptaaq
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 23 sty 2015, o 23:58
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz

[c] problem ze stworzeniem listy

Post autor: ptaaq »

Witam, mam problem ze stworzeniem listy, która będzie wczytywać dane z pliku,które są w formacie

nazwa wiersza,dane liczbowe, dane liczbowe...

stworzyłem funkcje, która zlicza ilość kolumn i wierszy z danymi, wczytuje stringa i dane liczbowe ale nie wiem jak to teraz połączyć, zeby wykorzystac ten wiersz next

Kod: Zaznacz cały

typedef struct Dane
{
    struct wiersz* pierwszy;
}Dane;

typedef struct wiersz
{   
    double* dane; // dane liczbowe z pliku
    char** nazwa;
    struct wiersz*next;
}wiersz;

I chciałem się zapytać w jaki sposob połączyć nazwe i dane w jedność, czy struktura wiersz next od razu będzie zawierała obie zmienne?
Gouranga
Użytkownik
Użytkownik
Posty: 1584
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

[c] problem ze stworzeniem listy

Post autor: Gouranga »

nic, co jest gołym wskaźnikiem nie istnieje w pamięci, trzeba ją alokować i zwalniać w kodzie
do tego nie wiem po co ci daleki wskaźnik na char, zwykły wskaźnik do napisu się stosuje

poza tym nie wiem do czego ma służyć struktura Dane, masz zrobić listę tak?
pytanie czy listę wierszy z tablicami liczb, czy tablicę wierszy z listami liczb? a może listę wierszy a w niej listę liczb?
ptaaq
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 23 sty 2015, o 23:58
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz

[c] problem ze stworzeniem listy

Post autor: ptaaq »

W strukturze dane chciałem zrobić pierwszy wiersz, w którym znajdują się same nazwy kolumn.
I chciałbym zrobić listę z tablicami liczb. Pamięć alokowałem w taki sposób ale nie wiem czy dobrze

Kod: Zaznacz cały

e->nazwa=(char**)malloc(sizeof(char*)*(d->ile_w-1));     
        for(j=0; j<d->ile_w-1; j++)
            {
                e->nazwa[j]=(char*)malloc(sizeof(char)*100);
            }
        e->dane=((double*)malloc(sizeof(double)*((d->ile_k-1));  
gdzie ile_w i ile_k do odpowiednio ilość wyliczonych wierszy i kolumn w pliku z danymi
Gouranga
Użytkownik
Użytkownik
Posty: 1584
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

[c] problem ze stworzeniem listy

Post autor: Gouranga »

idea dobra ale cały bajer w listach polega na tym, że nie jest ci potrzebne ile_w
poza tym wiersz z nazwami kolumn nie może być strukturą tego samego typu co wiersze z liczbami

spróbuj czegoś takiego:
-struktura Header (nagłówek) niech zawiera tablicę z nazwami kolumn (dynamiczną) i licznik kolumn, na starcie 0, przy wczytywaniu nazw kolumn go zwiększaj (spełni rolę twojego ile_k)
-struktura Row (wiersz) niech spełnia rolę listy, niech zawiera string z nazwą wiersza, tablicę liczb (jej pamięć możesz zaalokować w jednym rzucie bo wiesz ile będzie kolumn, masz to w Header->counter) i wskaźnik na następny wiersz
-struktura Data (dane) niech zawiera jeden wskaźnik na Header (nagłówek z nazwami kolumn i licznikiem) i wskaźnik na pierwszy wiersz liczb (początkowo null)

czyli na starcie same nulle i licznik na 0, wczytując nazwy kolumn liczysz je i kolejno alokujesz pamięć na ten header
potem wczytując wiersz alokujesz pamięć na jedną strukturę Row, w niej na jeden string z nazwą i na Header->counter liczb a tej nowo zaalokowanej struktury Row wskaźnik *next ustawiasz na null

jak dojdziesz do końca linii w pliku i nie jest EOF to znowu alokujesz tego nexta, alokujesz w nim miejsce i jego next ustawiasz na null i tak się zagłebiasz a stricte elementem, który jest dostępny jest tylko pierwszy wiersz w strukturze Data, żeby cokolwiek znaleźć trzeba od niego jechać po nextach, tak działa lista
ptaaq
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 23 sty 2015, o 23:58
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz

[c] problem ze stworzeniem listy

Post autor: ptaaq »

Czy tak mają wyglądać struktury z 2 pierwszych myślników? z 3 mam problem

Kod: Zaznacz cały

typedef struct Header
{   
    


	char* nazwy_kolumn;
	int ile_k;
	

}Header;


typedef struct Row
{   
    


	char* nazwa_wiersza;
	Double* dane;
	wiersz*next;
	dane=((double*)malloc(sizeof(double)*((d->ile_k-1));  
	

}Row;
Gouranga
Użytkownik
Użytkownik
Posty: 1584
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 245 razy

[c] problem ze stworzeniem listy

Post autor: Gouranga »

blisko:
-w Headerze nazwy_kolumn musi być dalekim wskaźnikiem (tablica napisów czyli tablica tablic znaków)
-w Row element next też musi być wskaźnikiem na Row
-malloca nie robisz w tym miejscu

jak te błędy usuniesz to zakładasz sobie strukturę:

Kod: Zaznacz cały

typedef struct Data{
  Header *hdr;
  Row *first;
} Data;
i malloc musi iść potem odpowiednio w takiej kolejności:
-alokujesz strukturę typu Data (np. Data d)
-alokujesz w niej d->hdr
-d->hdr->ile_k = 0
-w pętli zczytujesz nazwy kolumn rozwijając tablicę d->hdr->nazwy_kolumn i zwiększając d->hdr->ile_k
-zakładasz wskaźnik pomocniczny typu Row *last
-alokujesz d->first i przepisujesz last = d->first
-w pętli robisz te kroki:
--alokujesz last->nazwa_wiersza, wczytujesz ją
--alokujesz last->liczby jako tablicę o liczbie elementów wziętej z d->hdr->ile_k, wczytujesz liczby
--last = last->next

w ten sposób zawsze dopisujesz do końca listy a w strukturze prawidłowo przechowujesz jej początek
ODPOWIEDZ