Witam,
Mam zadanie w którym wczytuję dane z pliku .txt do dynamicznie alokowanej listy jednokierunkowej. Następnie mam stworzyć dynamicznie alokowaną tablice, do której wartości przypiszę z listy.
Kompiluje się bez żadnych błędów, jednak program przestaje działać przy próbie wypisania elementów tablicy (elementy listy są poprawnie wyświetlone).
Proszę o pomoc.
#include <iostream>
#include <string>
#include <fstream>
//#include "nagl.h"
using namespace std;
struct osoba
{
string imie;
string nazwisko;
int wiek;
struct osoba *next;
};
osoba* stworz_tablice(osoba **head, int ile);
void delete_all(osoba **head);
int lista(osoba **head);
void wypisz(osoba **head, osoba *tab, int ile);
void dodaj_tablica(osoba **tab, int num, int ile);
void dodaj_lista(osoba **head, int num);
void usun_lista(osoba **head, int *ile);
void usun_tablica(osoba **tab, int *ile);
int main()
{
int ile = 0;
osoba *head = new osoba;
head->next = NULL;
ile = lista(&head);
osoba *tab = stworz_tablice(&head, ile);
int x = 1;
while(x != 0)
{
cout << "\t\tMENU:" << endl;
cout << "0. Wyjscie\n1. Dodaj element\n2. Usun element\n3. Wypisz zawartosc obydwu struktur" << endl;
cout << "\nCo wybierasz?: ";
cin >> x;
switch(x)
{
case 0: break;
case 1: cout << "\nDodac do listy (wybierz 1) czy do tablicy (wybierz 2)?:";
int x;
cin >> x;
if(x==1)
{
cout << "\nW jakim miejscu mam dodac element: ";
int nr;
cin >> nr;
if(nr>0 && nr<ile+1)
{
dodaj_lista(&head, nr);
ile++;
}
else cout << "\nNie mozna dodac w tym miejscu!" << endl;
}
else if(x==2)
{
cout << "\nW jakim miejscu mam dodac element: ";
int nr;
cin >> nr;
if(nr>0 && nr<ile+1)
{
dodaj_tablica(&tab, nr, ile);
ile++;
}
else cout << "\nNie mozna dodac w tym miejscu!" << endl;
}
else cout << "\nBledny numer operacji!" << endl;
break;
case 2: cout << "\nUsunac z listy (wybierz 1) czy z tablicy (wybierz 2)?: ";
int z;
cin >> z;
if(z==1)
{
usun_lista(&head, &ile);
}
else if(z==2)
{
usun_tablica(&tab, &ile);
}
else cout << "\nBledny numer operacji!" << endl;
break;
case 3: wypisz(&head, tab, ile);
break;
default: cout << "Nie znam takiej operacji" << endl;
}
}
delete head;
delete [] tab;
return 0;
}
osoba* stworz_tablice(osoba **head, int ile)
{
osoba *tablica = new osoba[ile];
osoba *tmp = (*head)->next;
for(int i = 0; i < ile; i++)
{
tablica->imie = tmp->imie;
tablica->nazwisko = tmp->nazwisko;
tablica->wiek = tmp->wiek;
tablica->next = NULL;
tablica++;
tmp = tmp->next;
}
return tablica;
}
void delete_all(osoba **head)
{
if(!(*head)->next)
{
cout << "Lista juz pusta" << endl;
return;
}
osoba *toDel = NULL;
osoba *tmp = (*head)->next;
while(tmp) {
toDel = tmp;
tmp = tmp->next;
delete toDel;
}
(*head)->next = NULL;
cout << "\nPomyslnie usunieto wszystkie elementy!" << endl;
}
int lista(osoba **head)
{
ifstream plik;
plik.open("dane.txt");
string a, b;
int c, ile = 0;
char znak;
while(plik.get(znak) && znak != '.')
{
osoba *tmp = new osoba;
tmp->next = (*head)->next;
(*head)->next = tmp; //dolaczenie go na poczatek
plik >> a >> b >> c;
tmp->imie = a;
tmp->nazwisko = b; //utworzenie nowego wezla
tmp->wiek = c;
ile++;
}
osoba *n = new osoba;
n = (*head)->next;
while(n)
{
cout << n->imie << " " << n->nazwisko << " " << n->wiek << endl;
n = n->next;
}
delete n;
return ile;
}
void wypisz(osoba **head, osoba *tab, int ile)
{
osoba *n = new osoba;
n = (*head)->next;
int i = 0;
cout << "\n\tWypisanie zawartosci listy:" << endl;
while(n)
{
cout << "nr." << i << ": " << n->imie << " " << n->nazwisko << " " << n->wiek << endl;
n = n->next;
i++;
}
delete n;
cout << "\n\tWypisanie zawartosci tablicy:" << endl;
for(i=0; i < ile; i++)
{
cout << "nr." << i << ": " << tab->imie << " " << tab->nazwisko << " " << tab->wiek << endl;
tab++;
}
}
void dodaj_lista(osoba **head, int num)
{
osoba *tmp = *head;
tmp = tmp->next;
for(int i=1; i < num; i++)
{
tmp = tmp->next;
}
osoba *nowy = new osoba;
cout << "\nPodaj imie: ";
cin >> nowy->imie;
cout << "\nPodaj nazwisko: ";
cin >> nowy->nazwisko;
cout << "\nPodaj wiek: ";
cin >> nowy->wiek;
nowy->next = tmp->next;
tmp->next = nowy;
cout << "\nDodano nowa osobe!" << endl;
}
void dodaj_tablica(osoba **tab, int num, int ile)
{
osoba *ntab = new osoba[ile+1];
int i;
for(i = 1; i < num; i++)
{
ntab[i] = (*tab)[i];
}
cout << "\nPodaj imie: ";
cin >> ntab->imie;
cout << "\nPodaj nazwisko: ";
cin >> ntab->nazwisko;
cout << "\nPodaj wiek: ";
cin >> ntab->wiek;
ntab++;
for(i = num; i < ile+1; i++)
{
ntab[i] = (*tab)[i];
}
(*tab) = ntab;
delete [] ntab;
}
void usun_lista(osoba **head, int *ile)
{
int x;
cout << "\nWyszukac element wzgledem wieku (wybierz 1) czy nazwiska (wybierz 2)?: ";
cin >> x;
if(x==1)
{
int a, x=0;
cout << "\nPodaj szukany wiek: ";
cin >> a;
osoba *tmp = (*head)->next;
osoba *prev = (*head);
while(tmp || x!=1)
{
if((tmp->wiek) == a)
{
prev->next = tmp->next;
x = 1;
delete tmp;
(*ile)--;
}
else
{
prev = tmp;
tmp = tmp->next;
}
}
if(x != 1) cout << "\nNie znaleziono osoby o podanym wieku!" << endl;
}
else if(x==2)
{
int x=2;
string a;
cout << "\nPodaj szukane nazwisko: ";
cin >> a;
osoba *tmp = (*head)->next;
osoba *prev = (*head);
while(tmp || x!=0)
{
x = (tmp->nazwisko).compare(0, string::npos, a);
if(x == 0)
{
prev->next = tmp->next;
delete tmp;
}
else
{
prev = tmp;
tmp = tmp->next;
}
}
if(x != 0) cout << "\nNie znaleziono osoby o podanym nazwisku!" << endl;
}
else cout << "\nBledny numer operacji!" << endl;
}
void usun_tablica(osoba **tab, int *ile)
{
int x;
cout << "\nWyszukac element wzgledem wieku (wybierz 1) czy nazwiska (wybierz 2)?: ";
cin >> x;
if(x==1)
{
int a, i, x=0;
cout << "\nPodaj szukany wiek: ";
cin >> a;
for(i = 0; i < (*ile); i++)
{
if((*tab)[i].wiek == a)
{
osoba *ntab = new osoba[--(*ile)];
for(i; i<(*ile) ; i++)
{
ntab[i] = (*tab)[i+1];
}
*tab = ntab;
x = 1;
delete [] ntab;
}
}
if(x != 1) cout << "\nNie znaleziono osoby o podanym nazwisku!";
}
else if(x==2)
{
int i, x=2;
string a;
cout << "\nPodaj szukane nazwisko: ";
cin >> a;
for(i = 0; i < (*ile); i++)
{
x = ((*tab)[i].nazwisko).compare(0, string::npos, a);
if(x == 0)
{
osoba *ntab = new osoba[--(*ile)];
for(i; i<(*ile); i++)
{
ntab[i] = (*tab)[i+1];
}
*tab = ntab;
delete [] ntab;
}
}
if(x != 0) cout << "\nNie znaleziono osoby o podanym nazwisku!";
}
else cout << "\nBledny numer operacji!" << endl;
}