Skocz do zawartości

Zmiana rozmiaru tablicy dynamicznej w trakcie działania programu (realloc)


Pomocna odpowiedź

Napisano

Hej, napisałem program, który alokuje tablicę na N osób. Teraz chciałbym to przerobić tak, żeby program miał proste menu (1. Dodaj osobę, 2. Wypisz). Problem mam taki, że nie wiem jak poprawnie użyć realloc, żeby powiększyć tablicę o 1 miejsce przy każdym dodaniu nowej osoby, nie tracąc przy tym starych danych. Czy ktoś mógłby rzucić okiem na kod i podpowiedzieć, jak zmienić funkcję wypelnijListe na taką, która dodaje tylko jedną osobę?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>


#define OBECNY_ROK 2026

typedef struct
{
	char imie[50];
	int rok_urodzenia;
}
osoba;

typedef struct 
{
	osoba* adres_tablicy;
	int N;
}
listaObecnosci;

osoba generujOsobe()
{
	osoba o;
	printf("Podaj imie studenta: ");
	scanf("%49s", o.imie);
	o.rok_urodzenia = rand() % (2020 - 1920 + 1) + 1920;
	return o;
}

int wypelnijListe(listaObecnosci* lista)
{
	lista->adres_tablicy = (osoba*)malloc(lista->N * sizeof(osoba));

	if (lista->adres_tablicy == NULL)
	{
		printf("blad alokacji pamieci\n");
		return 0;
	}

	for (int i = 0; i < lista->N; i++)
	{
		printf("wprowadzenie osoby nr %d\n", i + 1);
		lista->adres_tablicy[i] = generujOsobe();
	}
	return 1;
}

void wypiszliste(listaObecnosci lista)
{
	printf("wynki: \n");
	for (int i = 0; i < lista.N; i++)
	{
		int wiek = OBECNY_ROK - lista.adres_tablicy[i].rok_urodzenia;
		printf("%s: %d\n", lista.adres_tablicy[i].imie, wiek);
	}
}

int main()
{
	srand(time(NULL));
	listaObecnosci mojaLista;

	do
	{
		printf("Podaj liczbe osob od 1 do 10: ");
		scanf("%d", &mojaLista.N);

		if (mojaLista.N < 1 || mojaLista.N > 10);
		{
			printf("bledna liczba\n");
		}
	} while (mojaLista.N < 1 || mojaLista.N > 10);

	if (wypelnijListe(&mojaLista) == 0)
	{
		printf("Blad alokacji pamieci\n");
		return 1;
	}
	wypiszliste(mojaLista);

	free(mojaLista.adres_tablicy);
	mojaLista.adres_tablicy = NULL;
	return 0;
}

 

Jeśli mnie pamięć nie myli (mój C trochę zardzewiał już), to powinno wyglądać mniej więcej tak:

lista->N++;
lista->adres_tablicy = (osoba*)realloc(lista->N * sizeof(osoba))
lista->adres_tablicy[lista->N - 1] = <tu wstaw nowy rekord>

 

  • 2 tygodnie później...

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...