Nie dziala funkcja nadająca pierwszy element dla listy łączonej

0

Witam. Próbuje napisać krótki program, w którym użytkownik będzie mógł stworzyć listę studentów. Mój problem polega na tym, że jeśli chcę, aby pierwszy element listy dodawał się poza funkcją main, w funkcji

 dodaj_studenta(*head)

, program nie działa. O to fragment kodu:

 
typedef struct student
{
    char imie[20];
    char nazwisko[30];
    int nr_indeksu;
    struct student *next;
}student;

void dodaj_studenta(student *head)
{
    student *wsk=head, *nowy;
    if(wsk!=NULL) // ten fragment programu dziala prawidlowo(program dodaje tu kolejnych studentow)
    {
    while(wsk->next!=NULL)
    {
        wsk=wsk->next;
    }
    nowy=(student*)malloc(sizeof(student));
    printf("Podaj kolejno imie, nazwisko oraz indeks studenta\n");
    scanf("%s", &nowy->imie);
    scanf("%s", &nowy->nazwisko);
    scanf("%d", &nowy->nr_indeksu);
    wsk->next=nowy;
    nowy->next=NULL;
    }
    else // Ten fragment programu NIE dziala prawidlowo (program ma tu wejsc jesli lista jest pusta i wpisac pierwszego studenta)
    {
        wsk=(student*)malloc(sizeof(student));
        printf("Podaj imie studenta ");
        scanf("%s", &wsk->imie);
        printf("Podaj nazwisko studenta ");
        scanf("%s", &wsk->nazwisko);
        printf("Podaj numer indeksu studenta ");
        scanf("%d", &wsk->nr_indeksu);
        wsk->next=NULL;
    }
}
int main()
{

   student *head=NULL;
   dodaj_studenta(head);

return 0;
}
 

Program wchodzi do opcji ELSE w funkcji dodaj_studenta, natomiast nie zapisuje go w liście. Jak mozna to naprawic?

2

Do funkcji leci KOPIA wskaźnika więc przypisanie czegoś do tego wskaźnika nie będzie widoczne poza funkcją. Musiałbyś użyć podwójnego wskaźnika na wypadek zmiany głowy albo zwracać głowę listy z tej funkcji.

1

To co @Shalom napisał, ale z przykładem:
Przekazywanie parametru przez wartość i referencję

0

Okey, poczytalem troche o przekazywaniu parametrów. Program napisalem calkiem od nowa, ale dalej z problemami. Najpierw kod:

#include<stdio.h>
typedef struct student
{
    char imie[20];
    char nazwisko[30];
    int indeks;
    struct student *next;
}student;
typedef student *lista; // tak dla uproszczenia, zeby nie wpisywac za duzo tych gwiazdek.. 

void dodaj(lista *pocz)
{
    lista nowy;
    lista temp = *pocz;
    if(temp==NULL)
    {
        temp=malloc(sizeof(lista));
        printf("Pierwszy student: podaj kolejno imie, nazwisko i indeks:\n");
        scanf("%s", &temp->imie);
        scanf("%s", &temp->nazwisko);
        scanf("%d", &temp->indeks);
        temp->next=NULL;
        *pocz=temp;
    }
    else
    {

        nowy=malloc(sizeof(lista));
        nowy->next=*pocz;
        printf("Nastepni studenci: podaj kolejno imie, nazwisko i indeks:\n");
        scanf("%s", &nowy->imie);
        scanf("%s", &nowy->nazwisko);
        scanf("%d", &nowy->indeks);
        *pocz=nowy;

    }
}

void wypisz(lista pocz)
{
    lista temp=pocz;
    if(temp==NULL)
    {
        printf("lista jest pusta\n");
    }
    while(temp!=NULL)
    {
        printf("%s %s %d\n", temp->imie, temp->nazwisko, temp->indeks);
        temp=temp->next;
    }
}
int main()
{
    lista *pocz=NULL;
    int i;
    int liczba;
    printf("Ilu studentow chcesz dodac?");
    scanf("%d", &liczba);
    wypisz(pocz);
    for(i=0;i<liczba;i++)
    {
        dodaj(&pocz);
        wypisz(pocz);
        system("pause");
        system("cls");
    }

    return 0;


}

 

A teraz program dziala tak, ze w zaleznosci od tego jakie imiona studentów wpiszę: raz doda pierwszy element i wyswietli go, doda drugi i wyswietli pierwszy z bledem, drugi bez bledu, albo w ogóle po dodaniu pierwszego elementu Od razu swiruje i sie wylacza, ogolnie cos jest nie tak, tylko co? Próbowałem to pisac na rozne sposoby: wstawiać nowe elementy na początek listy lub na koniec, ale zawsze taki sam efekt jak tutaj.. Raz to takie nawet dane podałem że udalo sie az dojsc do wpisywania 3 elementu, a potem znowu błąd jak zawsze.

1
typedef student *lista; // tak dla uproszczenia, zeby nie wpisywac za duzo tych gwiazdek.. 

Słaby pomysł, teraz to już w ogóle ciężko się połapać, gdzie jest wskaźnik, a gdzie wskaźnik do wskaźnika. W każdym razie ja nie potrafię tego programu już czytać.

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