Lista jednokierunkowa C

0

Witam próbowałem stworzyć w C liste studentów, ale przy wprowadzaniu samodzielnie kolejnych osób wszyscy przyjmują imię i nazwisko ostatnio wpisanej osoby(numer indeksu i srednia ocen zostają nienaruszone)
Prosze o pomoc i z góry dziekuje.

MAIN:

#include "funkcje.h"

int main() 
{
    int wybor;
    const char imie[15];
    const char nazwisko[15];
    unsigned int indeks;
    float srednia;

    poczatek = 0;

    dodaj("Beniamin","Idziak",11697,4.5);
    dodaj("Ala","Makota",11698,4.9);

    printf("-----------------------------------DZIEKANAT-----------------------------------");

    for( ; ; )
    {
        printf("\nMENU:");
        printf("\n1. Wyswietl studentow");
        printf("\n2. Dodaj studenta");
        printf("\n3. Usun studenta");
        printf("\n4. Sortuj studentow");
        printf("\n5. Wyszukaj studenta");
        printf("\n6. Wyjdz");
        printf("\nWYBIERZ: ");

        scanf("%d", &wybor);
        fflush(stdin);

        switch(wybor)
        {
            case 1:
            {

            wyswietl();

            break;
            }

            case 2:
            {
            printf("\nPodaj imie: ");
            scanf("%s",imie);
            printf("\nPodaj nazwisko: ");
            scanf("%s",nazwisko);
            printf("\nPodaj nr. indeksu: ");
            scanf("%d",&indeks);
            printf("\nPodaj srednia: ");
            scanf("%f",&srednia);
            fflush(stdout);
            dodaj(imie,nazwisko,indeks,srednia);
            break;
            }
        }
    }   

    return 0;
}

FUNKCJE.C:

#include "funkcje.h"

struct student* nowy(char* imi, char* naz, unsigned int ind, float sr)
{
    struct student* nowys = (struct student*)malloc(sizeof(struct student));
    nowys->imie = imi;
    nowys->nazwisko = naz;
    nowys->indeks = ind;
    nowys->srednia = sr;
    nowys->nast = 0;
    return nowys;
}

void dodaj(char* imi, char* naz, unsigned int ind, float sr) 
{   
    struct student* bufor = poczatek;
    struct student* nowys = nowy(imi,naz,ind,sr);
    if(poczatek == 0) 
    {
        poczatek = nowys;
        return;
    }
    while(bufor->nast != NULL)
    {
        bufor = bufor->nast;
    }
        bufor->nast = nowys;

}

void wyswietl() 
{
    struct student* bufor = poczatek;
    printf("STUDENCI:\n");
    while(bufor != NULL) 
    {
        printf("IMIE:%10s NAZWISKO:%10s NR.INDEK5SU:%5d SREDNIA:%0.1f\n",bufor->imie, bufor->nazwisko, bufor->indeks, bufor->srednia);
        bufor = bufor->nast;
    }
}

FUNKCJE.H:


#ifndef FUNKCJE_H
#define FUNKCJE_H

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

struct student  
{
    char* imie;
    char* nazwisko;
    unsigned int indeks;
    float srednia;
    struct student* nast;

}*poczatek;

struct student* nowy(char* imi, char* naz, unsigned int ind, float sr);

void dodaj(char* imi, char* naz, unsigned int ind, float sr);

void wyswietl();

#endif
0

Czyli jeśli dobrze cie rozumiem musze stworzyć sobie kolejną funkcje, aby to ona zwracala mi wartość?

1

Nie zrozumiałeś pojęcia napisu.
Poza tym masz bezsensownie zbudowane struktury.

0

hmmm... no cóż zostaje mi jeszcze przy tym posiedziec, choć dalej nie wiem co tam jest nie tak :P (patrząc okiem poczatkujacego)

2
  1. Stworzyłeś potwora, studento-krzesło-rząd operowanie takim potworem jest co najmniej uciążliwe, nie wspominając o bezsensowności.
  2. Nie podzieliłeś programu na małe funkcje, co maksymalnie utrudnia jego zrozumienie nawet dla ciebie
  3. Nie rozumiesz zasady działania wskaźników oraz napisów.
1

Początkowe pytanie było dlaczego w strukturze jest nazwa ostatniego wpisanego studenta. Błąd jest w funkcji "nowy" w liniach:
nowys->imie = imi;
nowys->nazwisko = naz;

gdzie kopiujemy wskaźniki do obiektów
const char imie[15];
const char nazwisko[15];

zamiast utworzyć kopię samych obiektów. Powinno być coś w tym stylu:
nowys->imie = malloc(strlen(imi) + 1)
strcpy(nowys->imie, imie)

i podobnie dla
nowys->nazwisko

0

Dzieki bardzo Tomek, twoja porada sie przydala :)

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