Usuwanie osoby ze struktury

0

Witam!
mam duży problem w rozpracowaniu zadania. muszę stworzyć strukturę danych z polami: imie, nazwisko, wiek, adres. oraz stworzyć 4 funkcję: wyświetlanie wszystkich danych, dodawanie elementu, usuwanie elementu, wyświetlanie danych osoby na podstawie nazwiska. większość już rozpracowałem, jedynie nie mam pojęcia jak usunąć osobę którą dodałem... przeszukuję google od kilku dni bez większego rezultatu. oto moje wypociny:

#include <cstdlib>
#include <iostream>
#include <conio.h>

using namespace std;

struct dane_osobowe
{
       char imie[15];
       char nazwisko[30];
       char wiek[3];
       char ulica[50];
       char numer_domu[4];
       char numer_mieszk[4];
       char kod_poczt[7];
       char miasto[50];
       };

dane_osobowe tab[10];

int n=1;


void wprowadz(){

                   cout << "WPROWADZASZ REKORD NUMER "<< n <<"\n\n";
                   cout << "Wprowadz imie: ";
                   cin >> tab[n].imie;
                   cout << "Wprowadz nazwisko: ";
                   cin >> tab[n].nazwisko;
                   cout << "Wprowadz wiek: ";
                   cin >> tab[n].wiek;
                   cout << "Ulica : ";
                   cin >> tab[n].ulica;
                   cout << "Numer domu: ";
                   cin >> tab[n].numer_domu;
                   cout << "Numer mieszkania: ";
                   cin >> tab[n].numer_mieszk;
                   cout << "Kod pocztowy w formacie XX-XXX: ";
                   cin >> tab[n].kod_poczt;
                   cout << "Miasto: ";
                   cin >> tab[n].miasto;
                   cout << "\nWprowadzono pomyslnie rekord numer " << n <<"\n\n";
}

void wyswietl(int n){
                   cout << tab[n].imie;
                   cout << " " << tab[n].nazwisko;
                   cout << " " << tab[n].wiek<<"l.";
                   cout << "\nUl. " << tab[n].ulica;
                   cout << " " << tab[n].numer_domu;
                   cout << "/" << tab[n].numer_mieszk;
                   cout << "\n" << tab[n].kod_poczt;
                   cout << " " << tab[n].miasto;
                   cout << "\n\n";
}
void usun(int nr_rek){

					 delete tab[nr_rek].imie;
                     delete tab[nr_rek].nazwisko;
                     delete tab[nr_rek].ulica;
                     delete tab[nr_rek].numer_domu;
                     delete tab[nr_rek].numer_mieszk;
                     delete tab[nr_rek].kod_poczt;
                     delete tab[nr_rek].miasto;
                     cout << "\nZawartosc rekordu " << nr_rek << " pomyslnie usunieta";
}
void szukaj(int i){
                   string szukaj;
                   cout<<"\nPodaj NAZWISKO szukanej osoby: ";
                   cin >> szukaj;
                   for(i=1;i<=n;i++) {
                   if(tab[i].nazwisko==szukaj) {
						cout <<"\n"<< tab[i].imie;
                   cout << " " << tab[i].nazwisko;
                   cout << " " << tab[i].wiek<<"l.";
                   cout << "\nUl. " << tab[i].ulica;
                   cout << " " << tab[i].numer_domu;
                   cout << "/" << tab[i].numer_mieszk;
                   cout << "\n" << tab[i].kod_poczt;
                   cout << " " << tab[i].miasto;
                   cout << "\n\n";
             }
         }
        }
        
int main(int argc, char *argv[])
{
int znak, i, j, nr_rek;
char sign,sign1;
        do{
             system("cls");
             cout<<"aktualnie posiadasz "<<n-1<<" wpisow.\n";
             cout<<"1 - DODAWANIE DANYCH OSOBOWYCH\n";
             cout<<"3 - USUWANIE DANYCH OSOBOWYCH\n";
             cout<<"3 - WYSWIETLANIE WSZYSTKICH DANYCH OSOBOWYCH\n";
             cout<<"4 - WYSZUKANIE REKORDU PO NAZWISKU\n";
             cout<<"5 - KONIEC PROGRAMU\n\n";
           
		             cin>>znak;
			switch (znak)
			{
				case 1:
                    do{
                        system("cls");
                   wprowadz();
                   n++;
                   cout << "CZY CHCESZ WPROWADZIC KOLEJNY REKORD?\n1 - TAK, 0 - NIE (POWROT DO MENU)";
                   sign=getch();
                   }
                   while(sign!='0');
                   break;
                   
                case 2:
					do{
						int numer;
						cout<<"wprowadz numer rekordu ktory chcesz usunac: ";
					  cin>>numer;
					  usun(numer);
                     cout << "CZY CHCESZ USUNAC KOLEJNY REKORD?\n1 - TAK, 0 - NIE (POWROT DO MENU)";
                     sign=getch();
                   }
                   while(sign!='0');
					break;
                   
				case 3:
					for (int i=1;i<n;i++)
					wyswietl(i);
					cout<<endl;
					getch();
					break;
					
				case 4:
					szukaj(n);
					getch();
					break;
				
					default:
						break;


                   
                   
				}}
		while (znak!='5');
system("PAUSE");
    return EXIT_SUCCESS;
}

z góry dziękuję za wszelką pomoc :)

0

Może po prostu ostatni element wsadź na miejsce usuwanego i zmniejsz liczbę osób o 1? Ewentualnie jeśli zależy Ci na zachowaniu kolejności, to jeśli chcesz usunąć osobę znajdującą się na miejscu x, to przesuwasz wszystko co jest dalej o jeden w lewo czyli x = x+1 i tak aż do n-1.

0

pomysł jest dobry. stworzyłem taką prototypową funkcję (k oznacza element który chcę usunąć):

void usuwanie (int k){
string pom;
for (int i=k;i<n;i++)
{pom = tab[i].imie;
 tab[i].imie = tab[k+1].imie;
tab[k+1].imie = pom;}
n-=1;}

jednak te dane które usuwam niestety nie znikają z pamięci, ponieważ gdy usunę np. imie Adam. następnie napisze n+=1 to znów widnieje to imię.
w tym zadaniu moim zdaniem chodzi o to aby całkowicie usunąć te dane... najprawdopodobniej poprzez funkcję delete.

0

:D ej ej ej, czy Ty w ogóle choć przez ułamek sekundy przeanalizowałeś co ta pętla robi? To powinno wyglądać tak:

void usuwanie (int k)
{
    string pom;
    for (int i=k;i<n;i++)
    {
        strncpy(pom, tab[i].imie);
        strncpy(tab[i].imie, tab[i+1].imie);
        strncpy(tab[i+1].imie, pom);
    }
}

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