Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tworzenie listy jednokierunkowej w strukturze oraz jej wyświetlanie

Ostatnio zmodyfikowano 2019-01-13 10:26
Autor Wiadomość
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.

C/C++
void assign_book( STUDENT * student_arr, BOOK * root ) { /// PRZYPISANIE KSIAZEK STUDENTOM
   
    BOOK * current_book = root;
    ListBooks * current = NULL;
    ListBooks * head = NULL;
    ListBooks * ptr = NULL;
    int i, b_select, count = 0;
   
    do {
        //current_book = root;
        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)

C/C++
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:

C/C++
int main() {
   
   
    BOOK * HEAD = NULL; /// Wskaznik do pierwszego elementu listy
    STUDENT S_ARRAY[ 20 ]; ///Lista 20 studentów
   
    ListBooks * Ksiazki = S_ARRAY[ 2 ].books;
   
    create_group( & S_ARRAY );
    HEAD = create_library();
    assign_book( & S_ARRAY[ 2 ], HEAD ); //Funkcja przypisuje książki dla 2-go studenta
   
   
    printf( "\nDISPLAY BOOK:" );
    printf( "\n==========================\n" );
    print_assigned_books( Ksiazki ); //Funkcja wyświetlająca książki posiadane przez studenta.
   
    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
P-173519
pekfos
» 2019-01-13 00:26:49
Za mało kodu.
P-173520
NightSun221
Temat założony przez niniejszego użytkownika
Więcej kodu
» 2019-01-13 00:47:19
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 56


typedef struct Book { /// Struktura przechowujaca dane ksiazek
   
    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 { ///Struktura przechowujaca dane studentów
   
    int id;
    char name[ 10 ];
    char surname[ 15 ];
    char email[ 20 ];
    char phone_num[ 9 ];
    ListBooks * books;
   
} STUDENT;


void create_group( STUDENT * S_ARR ) { ///Wczytywanie grupy uczniów do listy struktur
    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 ) { ///Wyswietla liste uczniów
   
    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() { /// Pobieranie danych ksiazek do listy jednokierunkowej
   
    FILE * archive = fopen( "books.txt", "r" );
    if( !archive ) {
        printf( "FILE NOT FOUND!" ); ///Jezeli nie udalo sie otworzyc pliku
    }
    else {
       
        int i = 1;
        BOOK * head = NULL; /** Deklaracja wskazników **/
        BOOK * current = NULL;
        BOOK * p = NULL;
       
       
        /**Deklaracja zmiennych tymczasowych**/
        char auth[ MAX ];
        char titl[ MAX ];
        char yr[ MAX ];
       
        while( fscanf( archive, "%s\t%s\t%s", auth, titl, yr ) != EOF ) { ///Zczytywanie danych z pliku do zmiennych tymczasowych
           
            // MAXSIZE++;
           
            ///Tworzenie indywidualnego elementu listy
            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 ) /// Jezeli lista jest pusta ustaw obecny element jako pierwszy w liœcie
            {
                head = current;
            }
           
            else /// Iteracja po liscie aby dodac element na koncu
            {
                p = head;
                while( p->next != NULL )
                     p = p->next;
               
                p->next = current;
            }
        }
       
        return head; /// Zwroc wskaznik do pierwszego elementu listy
    }
}

void display_library( BOOK * head ) { ///Wyświetla liste ksiazek w wykazie
   
    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 ) { /// PRZYPISANIE KSIAZEK STUDENTOM
   
    BOOK * current_book = root;
    ListBooks * current = NULL;
    ListBooks * head = NULL;
    ListBooks * ptr = NULL;
    int i, b_select, count = 0;
   
    do {
        //current_book = root;
        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; /// Wskaznik do pierwszego elementu listy
    STUDENT S_ARRAY[ 20 ]; ///Lista 20 studentów
    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;
}
P-173521
pekfos
» 2019-01-13 10:26:47
C/C++
char year[ 4 ];
Tak rok musi mieć najwyżej 3 cyfry.
P-173522
« 1 »
  Strona 1 z 1