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
}
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);

0

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):

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";
}

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, botów: 0