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