NightSun221 Temat założony przez niniejszego użytkownika |
Tworzenie listy jednokierunkowej w strukturze oraz jej wyświetlanie » 2019-01-12 23:40:34 Witam mam za zadanie stworzyć bazę danych w której muszę przypisać książki do poszczególnych uczniów, Do przechowywania studentów użyłem tablicy structów. Natomiast do przechowywania książek listy jednokierunkowej. Teraz stworzyłem funkcję która powinna przypisywać książki danemu studentowi. Tworzy ona listę oraz dodaje po kolei książki do listy, do póki użytkownik nie wprowadzi id książki = 0. void assign_book( STUDENT * student_arr, BOOK * root ) { BOOK * current_book = root; ListBooks * current = NULL; ListBooks * head = NULL; ListBooks * ptr = NULL; int i, b_select, count = 0; do { printf( "\nPodaj id ksiazki:" ); scanf( "%d", & b_select ); while( current_book != NULL && b_select != 0 ) { if( b_select == current_book->id ) { current =( ListBooks * ) malloc( sizeof( ListBooks ) ); current->count = count; current->Book = current_book; current->next = NULL; count++; if( head == NULL ) { head = current; } else { ptr = head; while( ptr->next != NULL ) ptr = ptr->next; ptr->next = current; } break; } else { current_book = current_book->next; } } } while( b_select != 0 ); }
Jednak jest pewien problem ponieważ, gdy chcę wyświetlić listę dostaję błąd: Program received signal SIGSEGV, Segmentation fault. In ungetwc () (C:\Windows\System32\msvcrt.dll) void print_assigned_books( ListBooks * list_of_assigned_books ) { ListBooks * current = list_of_assigned_books; while( current != NULL ) { printf( "%s", current->Book->author ); current = current->next; } }
Tutaj umieszczam funkcję main: int main() { BOOK * HEAD = NULL; STUDENT S_ARRAY[ 20 ]; ListBooks * Ksiazki = S_ARRAY[ 2 ].books; create_group( & S_ARRAY ); HEAD = create_library(); assign_book( & S_ARRAY[ 2 ], HEAD ); printf( "\nDISPLAY BOOK:" ); printf( "\n==========================\n" ); print_assigned_books( Ksiazki ); return 0; }
Nie jestem pewien o co chodzi. Gdyż sprawdzając te 2 funkcje debuggerem wszystko jest dobrze w funkcji przypisującej książki, jednak gdy próbuje je wyświetlić dostaję właśnie błąd: Program received signal SIGSEGV, Segmentation fault. In ungetwc () (C:\Windows\System32\msvcrt.dll) Będę wdzięczny jeśli komuś uda się rozwiązać mój problemsmiley |
|
pekfos |
» 2019-01-13 00:26:49 Za mało kodu. |
|
NightSun221 Temat założony przez niniejszego użytkownika |
Więcej kodu » 2019-01-13 00:47:19 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 56
typedef struct Book { int id; char author[ 15 ]; char title[ 20 ]; char year[ 4 ]; struct BOOK * next; } BOOK;
typedef struct ListBooks_t { int count; BOOK * Book; struct ListBooks_t * next; } ListBooks;
typedef struct Student { int id; char name[ 10 ]; char surname[ 15 ]; char email[ 20 ]; char phone_num[ 9 ]; ListBooks * books; } STUDENT;
void create_group( STUDENT * S_ARR ) { FILE * f_stud = fopen( "registrants.txt", "r" ); int i; char num_tel[ MAX ]; char imie[ MAX ]; char nazwisko[ MAX ]; char mail[ MAX ]; for( i = 0; i < 20; i++ ) { fscanf( f_stud, "%s %s %s %s", imie, nazwisko, mail, num_tel ); S_ARR->id = i + 1; strcpy( S_ARR->name, imie ); strcpy( S_ARR->surname, nazwisko ); strcpy( S_ARR->email, mail ); strcpy( S_ARR->phone_num, num_tel ); S_ARR++; } fflush( stdin ); fclose( f_stud ); }
void print_group( STUDENT * S_ARR ) { int i; printf( "%2s%15s%15s%15s%20s\n", "nr", "Imie", "Nazwisko", "E-mail", "Nr tel" ); for( i = 0; i < 20; i++ ) { printf( "%2d", S_ARR->id ); printf( "%15s", S_ARR->name ); printf( "%15s", S_ARR->surname ); printf( "%22s", S_ARR->email ); printf( "%15s\n", S_ARR->phone_num ); S_ARR++; } fflush( stdin ); }
BOOK * create_library() { FILE * archive = fopen( "books.txt", "r" ); if( !archive ) { printf( "FILE NOT FOUND!" ); } else { int i = 1; BOOK * head = NULL; BOOK * current = NULL; BOOK * p = NULL; char auth[ MAX ]; char titl[ MAX ]; char yr[ MAX ]; while( fscanf( archive, "%s\t%s\t%s", auth, titl, yr ) != EOF ) { current =( BOOK * ) malloc( sizeof( BOOK ) ); current->id = i; strcpy( current->author, auth ); strcpy( current->title, titl ); strcpy( current->year, yr ); current->next = NULL; i++; if( head == NULL ) { head = current; } else { p = head; while( p->next != NULL ) p = p->next; p->next = current; } } return head; } }
void display_library( BOOK * head ) { BOOK * current = head; while( current != NULL ) { printf( "%d %s %s %s\n", current->id, current->author, current->title, current->year ); current = current->next; } }
void assign_book( STUDENT * student_arr, BOOK * root ) { BOOK * current_book = root; ListBooks * current = NULL; ListBooks * head = NULL; ListBooks * ptr = NULL; int i, b_select, count = 0; do { printf( "\nPodaj id ksiazki:" ); scanf( "%d", & b_select ); while( current_book != NULL && b_select != 0 ) { if( b_select == current_book->id ) { current =( ListBooks * ) malloc( sizeof( ListBooks ) ); current->count = count; current->Book = current_book; current->next = NULL; count++; if( head == NULL ) { head = current; } else { ptr = head; while( ptr->next != NULL ) ptr = ptr->next; ptr->next = current; } break; } else { current_book = current_book->next; } } } while( b_select != 0 ); }
void print_assigned_books( ListBooks * list_of_assigned_books ) { ListBooks * current = list_of_assigned_books; while( current != NULL ) { printf( "%s", current->Book->author ); current = current->next; } }
int main() { BOOK * HEAD = NULL; STUDENT S_ARRAY[ 20 ]; create_group( & S_ARRAY ); HEAD = create_library(); ListBooks * Ksiazki = S_ARRAY[ 2 ].books; assign_book( & S_ARRAY[ 2 ], HEAD ); printf( "\n\n" ); printf( "\n" ); print_assigned_books( Ksiazki ); return 0; }
|
|
pekfos |
» 2019-01-13 10:26:47 Tak rok musi mieć najwyżej 3 cyfry. |
|
« 1 » |