Skocz do zawartości

baza danych(kontaktów)-lista w liście na wskażnikach


qweir205

Polecane posty

Mam pytanie.Jak powinien wyglądać schemat takiego algorytmu. Mam rekord na którego podstawie powstaje główna lista. I jak zrobić by w kontakcie można było wpisać wiele np numerów czy emaili ,Wiem że to ma być za pomocą listy w liście głównej.Pytam sie was jak zroobić by wczytywać np kilka numerów czy emaili do kazdego kontaktu.

program baza_kontaktow;

uses crt;
type
 wskaznik = ^kontakt;
 kontakt = record
ID:integer;
imie : string[20];
nazwisko: string[20];
miasto: string[20];
ulica: string[20];
nr_d: integer;
nr_m: string[20];
kod_p: string[6];
poczta: string[20];
numer:real;
email:string[30];
next : wskaznik;
prev : wskaznik;
 end;


 var head:wskaznik;

procedure dodaj_kontakt(var head : wskaznik);
var
 tmp, pom : wskaznik;


 i,n:byte;
begin
 clrscr;

 new(tmp);
 write('Nazwisko: ');
 readln(tmp^.nazwisko);
 write('Imie: ');
 readln(tmp^.imie);
 write('Numer telefonu:');
 readln(tmp^.numer);
 write('Email:');
 readln(tmp^.email);
 write('Miasto: ');
 readln(tmp^.miasto);
 write('Ulica: ');
 readln(tmp^.ulica);
 write('Numer domu:');
 readln(tmp^.nr_d);
 write('Numer mieszkania:');
 readln(tmp^.nr_m);
 write('Kod pocztowy:');
 readln(tmp^.kod_p);
 write('Poczta:');
 readln(tmp^.poczta);
 tmp^.next := nil;
 if head = nil then
begin
 	tmp^.ID:=1;
 	tmp^.prev := nil;
 	head := tmp  ;
end

 else begin
pom := head;
while pom^.next <> nil do
     	pom := pom^.next;
     	pom^.next := tmp;
     	tmp^.prev := pom;
     	tmp^.next := nil;
     	tmp^.ID:=tmp^.prev^.ID+1;

end;


end;


procedure wyswietl(head : wskaznik);
begin
 clrscr;
 if head = nil then
write('Brak kontaktow')
 else begin
while head <> nil do
begin
	writeln('ID:',head^.ID,' | Nazwisko i imie:',head^.nazwisko, ' ', head^.imie,' | Numer tel.:',head^.numer:9:0,' | Email:',head^.email,' | ADRES:',head^.miasto,' ul.',head^.ulica,' ',head^.nr_d,' m.',head^.nr_m, ' ',head^.kod_p,' ',head^.poczta);
	writeln;
	head := head^.next;
end;
 end;

 readln;
end;
procedure usun_dane(var head : wskaznik);
begin
 if head = nil then
write('brak elemntow do usuniecia')
 else
begin
 	while head <> nil do
       	begin
    			dispose(head);
    			head := head^.next;
       	end;
end;
end;

function szukaj(head : wskaznik; nazwisko : string) : wskaznik;
begin
while (head <> nil) and (head^.nazwisko <> nazwisko) do
     	head := head^.next;
szukaj := head;
end;
procedure usun_wybrany_kontakt(var head : wskaznik);
var
 pom, tmp , pom2: wskaznik;
 nazwisko : string[30];
begin
 write('Podaj nazwisko: ');
 readln(nazwisko);
 tmp := szukaj(head, nazwisko);
 if tmp = nil then
write('Nie ma takiego ukontaktu')
 else
begin
  	if tmp = head then
	begin
       	head := head^.next;
       	head^.prev := nil;
       	dispose(tmp);
	end
  	else
  		begin
           	pom := head;
           	while pom^.next <> tmp do
                 	pom := pom^.next;
           	pom^.next := tmp^.next;
           	if tmp^.next <> nil then
             	tmp^.next^.prev := pom;
           	dispose(tmp);
  		end;
end;
 readln;
end;
procedure wyszukaj(var head : wskaznik);
var
 pom, tmp , pom2: wskaznik;
 nazwisko : string[30];
begin
 write('Podaj nazwisko: ');
 readln(nazwisko);
 tmp := szukaj(head, nazwisko);
 if tmp = nil then
write('Nie ma takiego kontaktu')
 else
begin
			if tmp <> nil then
begin

	writeln('ID:',tmp^.ID,' | Nazwisko i imie:',tmp^.nazwisko, ' ', tmp^.imie,' | Numer tel.:',tmp^.numer:9:0,' | Email:',tmp^.email,' | ADRES:',tmp^.miasto,' ul.',tmp^.ulica,' ',tmp^.nr_d,' m.',tmp^.nr_m, ' ',tmp^.kod_p,' ',tmp^.poczta);
	writeln;
	end;
end;
readln;
 end;


var
 i   : integer;
 tmp : wskaznik;

begin

repeat
  		clrscr;
  		writeln('1. Dodaj kontakt');
  		writeln('2. Wyswietl kontakty');
  		writeln('3. Usun wybrany kontakt');
  		writeln('4. Usun wszystkie kontakty');
  		writeln('5. Zapisz kontakty do pliku');
  		writeln('6. Usun plik');
  		writeln('7. Wyszukaj kontakt');
  		writeln('0. Wyjscie');
  		writeln;
  		write('Twoj wybor: ');
  		readln(i);
  		if i = 1 then dodaj_kontakt(tmp);
  		if i = 2 then wyswietl(tmp);
  		if i = 3 then usun_wybrany_kontakt(tmp);
  		if i = 4 then usun_dane(tmp);


  		if i = 7 then wyszukaj(tmp);

   	until i = 0;

end.

Link do komentarza
Udostępnij na innych stronach

Podejścia do problemu sa 2.

1) jeśli znasz maksymalną ilość numerów i adresów, to przewidujesz miejsce na nie w strukturze (mało eleganckie, ale szybkie i proste)

2) mozesz skonstruować kolejne struktury, ktore byłyby powiązane z glownym rekordem. W efekcie będziesz miał 3 tabele - tabela glowna, oraz tabele powiązane, gdzie będą np pola id, id_kontakt, adresemail i podobnie z telefonem. Powiązanie poprzez numer id_kontakt.

Link do komentarza
Udostępnij na innych stronach

No właśnie mam zrobić to dynamicznie. Myślałem czy to będzie działało gdy w rekordzie dam wskażnik na inny rekord np z numerem i jakby ta lista z numerami była podczepiana do listy głównej,ale nie wiem czy sie tak da. Wrzucam to co zrobiłem ,kompiluje ale nie działa. Jesem początkujący i nie moge rozgryść tego.

program baza_kontaktow;

uses crt;
type
 wskaznik = ^kontakt;
 wskaznik2 = ^numery;
 kontakt = record
ID:integer;
imie : string[20];
nazwisko: string[20];
miasto: string[20];
ulica: string[20];
nr_d: integer;
nr_m: string[20];
kod_p: string[6];
poczta: string[20];
numer:real;
email:string[30];
numer2: wskaznik2;
next : wskaznik;
prev : wskaznik;
 end;
numery = record
numer:real;
next : wskaznik2;
 end;


 var head:wskaznik;

procedure dodaj_numery(var head2 :wskaznik2;i:byte);
var num,pom2:wskaznik2;
begin
  new(num);

  writeln('Podaj ',i,' numer');
  readln(num^.numer);
  num^.next:=nil;
  if head2=nil then
                 	head2:=num
                 	else begin  pom2:=head2;
                 	while pom2^.next <> nil do
                       	pom2:=pom2^.next;
                       	pom2^.next:=num;

                       	end;

end;

procedure dodaj_kontakt(var head : wskaznik);
var
 tmp, pom : wskaznik;
 num:wskaznik2;


 i,n:byte;
begin
 clrscr;

 new(tmp);
 write('Nazwisko: ');
 readln(tmp^.nazwisko);
 write('Imie: ');
 readln(tmp^.imie);
 write('Numer telefonu:');
 readln(tmp^.numer);
 write('Email:');
 readln(tmp^.email);
 write('Miasto: ');
 readln(tmp^.miasto);
 write('Ulica: ');
 readln(tmp^.ulica);
 write('Numer domu:');
 readln(tmp^.nr_d);
 write('Numer mieszkania:');
 readln(tmp^.nr_m);
 write('Kod pocztowy:');
 readln(tmp^.kod_p);
 write('Poczta:');
 readln(tmp^.poczta);

writeln('Ile kontaktow?');
  readln(n);
  for i:=1 to n do
  begin
  num:=tmp^.numer2;
  dodaj_numery(num,i);
 end;               
 tmp^.next := nil; 
 if head = nil then
begin
 	tmp^.ID:=1;
 	tmp^.prev := nil;
 	head := tmp  ;
end

 else begin
pom := head;
while pom^.next <> nil do
     	pom := pom^.next;
     	pom^.next := tmp;
     	tmp^.prev := pom;
     	tmp^.next := nil;
     	tmp^.ID:=tmp^.prev^.ID+1;

end;


end;
procedure wyswietl_numery(head2:wskaznik2);
var i:byte;
begin
i:=0;
if head2 = nil then write('Brak numerow') else begin
while head2<>nil do begin i:=i+1; writeln('Numer',i,': ',head2^.numer);
head2:=head2^.next;
end;end;
end;

procedure wyswietl(head : wskaznik);
begin
 clrscr;
 if head = nil then
	write('Brak kontaktow')
 else begin
while head <> nil do
begin
    	writeln('ID:',head^.ID,' | Nazwisko i imie:',head^.nazwisko, ' ', head^.imie,' | Numer tel.:',head^.numer:9:0,' | Email:',head^.email,' | ADRES:',head^.miasto,' ul.',head^.ulica,' ',head^.nr_d,' m.',head^.nr_m, ' ',head^.kod_p,' ',head^.poczta);
     	wyswietl_numery(head^.numer2);
    	head := head^.next;
end;
 end;

 readln;
end;



var
 i   : integer;
 tmp : wskaznik;

begin

	repeat
      	clrscr;
      	writeln('1. Dodaj kontakt');
      	writeln('2. Wyswietl kontakty');
      	writeln('0. Wyjscie');
      	writeln;
      	write('Twoj wybor: ');
      	readln(i);
      	if i = 1 then dodaj_kontakt(tmp);
      	if i = 2 then wyswietl(tmp);
until i = 0;

end.

Link do komentarza
Udostępnij na innych stronach

Zrobić to można na kilka sposobów, ja zrobiłbym 2 listę z adresami, 3 z telefonami - struktura taka jak podałem. Sortowałbym po id_kontakt. Dla optymalizacji można dać z kontaktu link do pierwszych elementów w pozostałych list.

Link do komentarza
Udostępnij na innych stronach

A jak powiązać wszystkie te listy przez id?Nie mam sposobu jak przepisać wartość id kontaktu do id numerów i emaili?

w kontaktach masz id osoby, ten sam id przypisujesz do numerów i adresów. później jak masz posortowane tamte listy wzgledem tego id, wyszukanie to chwila.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...