Baza danych, lista jednokierunkowa.

0

Musze napisac prostą bazę danych. W bazie skadowane mają być informacje o imieniu i nazwisku danej osoby i jej numerze telefonu (zakładamy ze jedna osoba ma tylko jeden numer telefonu). Przy składowaniu danych w pamięci komputera należy wykorzystać strukturę listową (listę jedno lub dwukierunkową). Program powinien umożliwiać:

  • wczytanie bazy z pliku tekstowego
  • zapis bazy do pliku tekstowego
  • odszukanie telefonu osoby o danym nazwisku
  • dodanie nowej osoby do bazy
  • usunięcie wyszukanej osoby z bazy danych

A ja na swoje nieszczęście nie mam pojęcia co to jest lista jednokierunkowa i tym bardziej jak z niej skorzystać do zrobienia takiej bazy danych ! Proszę o małą pomoc ; bardzo mile widziane przykłady.

0

lista jednokierunkowa jest struktura dynamiczna. Najprosciej mozna to przedstawic rysunkiem:

el(1)->el(2)->el(3)->el(4)->...->el(n)

opiera sie calkowicie na dynamicznej alokacji pamieci, wiec musisz wykorzystac wskazniki. Cecha charakterystyczna jest to, ze jedyne do czego masz dostep bezposredni to pierwszy element - musisz przechowac adres do pierwszego elementu.
Adresy nastepnych elementow sa zapisane w elemencie poprzednim.
dostep do kolejnych elementow listy masz jedynie posrednio. czyli aby odczytac drugi element (el(2)) w pierwszej kolejnosci musisz z elementu pierwszego pobrac adres elementu drugiego.

Przykladowy element listy:
[code]struct element
{
int dane; //tu jakies przechowywane dane
struct element *nast; //adres nastepnego elementu
}[/code]
Aby zainicjowac liste musisz utworzyc pierwszy element:

[code]typedef struct element el;
el *lista; //zmienna pomocnicza
el *pierwszy=new el; //utworzenie pierwszego elementu
el->dane=5; //zapisanie jakis danych do elemtu
el->nast=NULL; //wskaznik na nastepny element jest pusty, gdyz jest to jedyny element w liscie
lista=el; //zapamietanie adresu poczatku struktury[/code]

dodajac kolejne elementy musisz pamietac o podaniu w pole el->nast prawidlowego adresu nastepnego elementu

To tak w duzym skrocie...

0

a jak zrobic zeby dopisac cos na koncu pliku?

0

FILE* f; -> fseek(f,0,SEEK_END);
fstream f; -> f.seekg(0,fstream::end); // może ewentualnie seekq
int f; -> lseek(f,0,SEEK_END);

1

z tym ze w przypadku FILE *f (nie wiem czy w drugim tez nie) mozna plik otworzyc z flaga "a" (append)... i wtedy nie trzeba seek dawac..
ew z flaga "r+" i zrobic tak jak flabra pisze ;>

flaga "w" i "w+" nie nadaje sie do dopisywania, jako ze na poczatek obcina plik do dlugosci 0

0

po wielkich trudac , usało mi sie zrobic początek, no i nie wiem co dalej.

struct osoba
{
char imie[20],nazwisko[20],tel[16];
struct *nast;
}

Co mam zrobic, zeby zainicjowac liste ?
jak mam teraz zrobić, zeby dało się to zapisać do pliku ?

0

Prosta baza (możesz wykożystać do swojego projektu):
[code]
struct TTablicaLiczb {
int n;
float tab[100];
};

void CzytajZPliku(TTablicaLiczb &a);
void Sortuj(TTablicaLiczb &a);
void Wyswietl(TTablicaLiczb &a);

int main(int argc, char* argv[])
{
TTablicaLiczb z;

cout << "\n------------------------------\n";
CzytajZPliku(z);
Sortuj(z);
Wyswietl(z);
cout << "------------------------------\n";
system("PAUSE");
return 0;
}

void CzytajZPliku(TTablicaLiczb &a){
ifstream plk;
float rob;

a.n=0;
plk.open("liczby.txt");

plk >> rob;
while(plk){
a.tab[a.n]=rob;
a.n++;
plk >> rob;
}
plk.close();
}

void zmien(float &a, float &b){
float tmp;
tmp=a;
a=b;
b=tmp;
}

void Sortuj(TTablicaLiczb &a){
int i,j;

for (i=0;i<a.n-1;i++)
for (j=i+1;j<a.n;j++)
if (a.tab[i] > a.tab[j])
zmien(a.tab[i],a.tab[j]);
}

void Wyswietl(TTablicaLiczb &a){
int i;

for (i=0;i<a.n;i++)
cout << a.tab[i] << "\n";
}
[/code]

0

ostatnio pisalem cos takiego na zaliczenie wiec jeszcze swieze, jest wszystko co opisales wiec jak chcesz daj maila

0

Byłbym bardzo wdzieczny ! MOj mail: [email protected] !

0

Pomożcie mi dokonczyć program, tak zeby działał. bede naprawde bardzo wdzieczy . Nie wiem czemu nie chce działać. Pewnie coś powaliłem :/

#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>

struct lista
{
    char imie[20],nazwisko[20],tel[16];
};
struct wezel
{
    wezel *nastepny, *poprzedni;
    lista *zawartosc;
};

void wczytaj(wezel *&pierwszy, wezel *&ostatni);
void dodaj(wezel *&pierwszy, wezel *&ostatni, lista *nowe);
void drukuj(wezel *pierwszy);
void wyszukaj(wezel *pierwszy);
void zapisz(wezel *pierwszy);
void odczytaj(wezel *&pierwszy, wezel *&ostatni);
void usun(wezel *&pierwszy, wezel *&ostatni);
int main()
{
    int koniec;
    int wybor;
    
 /*   wezel *pierwszy;
    wezel *ostatni;
    
    pierwszy = NULL;
    ostatni = NULL;
    
    odczytaj(pierwszy,ostatni);*/
    koniec = 1;
    
    do(
        printf("MENU\n");
        printf("1. Przeglad wszystkich pracownikow\n");
        printf("2. Nowy pracownik\n");
        printf("3. Wyszukaj pracownika\n");
        printf("4. Usun inf pracownika\n");
        printf("5. KONIEC\n");
        printf("Wprowadz odpowiedni znak:");
        
        scanf("%s");
        switch(wybor)
        {
                case 1: drukuj(pierwszy);
                break;
                case 2: wczytaj(pierwszy,ostatni);
                break;
                case 3: wyszukaj(pierwszy);
                break;
                case 4: usun(pierwszy,ostatni);
                break;
                case 5: zapisz(pierwszy);
                koniec = 0;
                break;
        }
    ) while (koniec);
}

void wczytaj(wezel *&pierwszy, wezel *&ostatni)
{
    lista *nowe;
    nowe = new lista;
    
    printf("Podaj imie:\n");
    scanf("%s",nowe->imie);
    printf("Podaj Nazwisko:\n");
    scanf("%s",nowe->nazwisko);
    printf("Podaj Telefon: \n");
    scanf("%s",nowe->tel);
    
    dodaj(pierwszy,ostatni,nowe);
}
void Dodaj(wezel *&pierwszy, wezel *&ostatni, dane *nowe)
{
   int i;
   wezel *w_nowy, *w_wezel;

   w_nowy = new wezel;
   w_nowy->zawartosc = nowe;

   if (pierwszy == NULL) {
      pierwszy = w_nowy;
      ostatni = w_nowy;
      pierwszy->nastepny = ostatni;
      ostatni->poprzedni = pierwszy;
      ostatni->nastepny = NULL;
      pierwszy->poprzedni = NULL;
   } else {
     if (strcmp(w_nowy->zawartosc->imie, pierwszy->zawartosc->imie) <0) {
        pierwszy->poprzedni = w_nowy;
        w_nowy->nastepny = pierwszy;
        pierwszy = w_nowy;
        pierwszy->poprzedni = NULL;
     } else
       if (strcmp(w_nowy->zawartosc->imie, ostatni->zawartosc->imie) > 0) {
          ostatni->nastepny = w_nowy;
          w_nowy->poprzedni = ostatni;
          ostatni = w_nowy;
          ostatni->nastepny = NULL;
       } else {
         w_wezel = pierwszy;
         while (strcmp(w_wezel->zawartosc->imie,w_nowy->zawartosc->imie) < 0)
               w_wezel = w_wezel->nastepny;

         w_nowy->nastepny = w_wezel;
         w_nowy->poprzedni = w_wezel->poprzedni;
         w_wezel->poprzedni->nastepny = w_nowy;
         w_wezel->poprzedni = w_nowy;
       }

   }

}

void DrukLista(wezel *pierwszy)
{
   wezel *w_wezel;

   w_wezel = pierwszy;

   if (w_wezel == NULL) {
      printf("LISTA JEST PUSTA\n");
		return;
	}
	printf("Wykaz pracownikow:\n");


   while (w_wezel != NULL) {
   printf("");
     cout << w_wezel->zawartosc->nazwisko << "   " << w_wezel ->zawartosc->imie <<
     "  " << w_wezel->zawartosc->adres << endl;
     w_wezel = w_wezel->nastepny;
   }
}

void Wyszukaj(wezel *pierwszy)
{
   char tekst;
   wezel *w_wezel;
	int znaleziono = 0;
	printf("Podaj imie:\n");
	scanf("%s", tekst);
   w_wezel = pierwszy;

   if (w_wezel == NULL) {
      printf("LISTA JEST PUSTA");
		return;
	}

   while (w_wezel != NULL) {
         if (strcmp(w_wezel->zawartosc->nazwisko,tekst) == 0) {
         printf("ZNALEZIONE DANE\n");
         printf("\n",w_wezel->zawartosc->imie );
		 printf("\n",w_wezel->zawartosc->nazwisko);
         printf("\n",w_wezel->zawartosc->tel);
  		 znaleziono = 1;
			}
         w_wezel = w_wezel->nastepny;
   }
	if (znaleziono == 0) 
	    printf("Danych nie znaleziono");

}

void Odczytaj(wezel *&pierwszy, wezel *&ostatni)
{
	int numer;
	
   lista *w_dane;
   FILE *plik;
   plik = fopen("lista.txt", "a+");
	if(! plik)
	{
    printf("NIEPOPRAWNE OTWARCIE PLIKU");
    return
 }
	while (!feof(plik)){
		w_dane = new lista;
		scanf((char *)) w_dane, sizeof(lista);
		if (!feof(plik)){
        scanf(char *) w_dane, sizeof(lista)};
        
         if (scanf(!feof(plik)))
                  dodaj(pierwszy,ostatni, w_dane);
		else
			delete w_dane;
	}
   fclose(plik);
}


void Zapisz(wezel *pierwszy)
{
	wezel *w_wezel;
	FILE * plik;
    plik = fopen("lista.txt", "a+");

	w_wezel = pierwszy;

	while (pierwszy != NULL) {
	    fprintf(plik,char *,pierwszy->zawartosc, sizeof(lista));

		delete pierwszy->zawartosc;

		pierwszy = pierwszy->nastepny;
		delete w_wezel;
		w_wezel = pierwszy;
	}
   fclose(plik);
}

void Usun(wezel *&pierwszy, wezel *&ostatni)
{
   char tekst;
   wezel *w_wezel, *pom1, *pom2;

   printf("Podaj imie:");
   scanf("%s",tekst);
   w_wezel = pierwszy;

   if (w_wezel == NULL) {
      printf("LISTA JEST PUSTA");
   	return;
	}
 
   while (w_wezel != NULL) {
		if (strcmp(w_wezel->zawartosc->nazwisko,tekst) == 0) {
			pom1 = w_wezel->poprzedni;
			pom2 = w_wezel->nastepny;
			
			if ((pom1 != NULL) && (pom2 != NULL)) {
				pom1->nastepny = pom2;
				pom2->poprzedni = pom1;
			}
			else
			if (pierwszy == ostatni) {
				pierwszy = NULL;
				ostatni = NULL;
			}
			else
			if ((pom1 != NULL) && (pom2 == NULL)) {
				pom1->nastepny = NULL;
				ostatni = pom1;
			}
			else
   		if ((pom1 == NULL) && (pom2 != NULL)) {
				pom2->poprzedni = NULL;
				pierwszy = pom2;
			}

			delete w_wezel->zawartosc;
			delete w_wezel;
			w_wezel = pom2;
			printf("INFORMACJE USUNIETO");
		
		} else
			w_wezel = w_wezel->nastepny;
	}

}

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