ďťż

Ładny brzuch

Witam!
Napisałem f-cje ktora powinna teoretycznie zwrócic wskaznik do struktury na której znajduje sie szukany telefon.

Deklaracja struktury:
struct data { int  numer; char nazwisko[80]; char imiona[80]; int urodziny; int telefon; data *nastepny; data *poprzedni; };

wskazniki pomocnicze:

data *wsk; data *wsk2; data *wsk3; data *poczatek; data *koniec; poczatek=NULL; koniec=NULL;

f-cja:
struct data *find_telefon(struct data *wsk,struct data *pocz,int telef) { wsk=pocz;  do  {  if(wsk->telefon==telef)   return wsk;  else   wsk=wsk->nastepny;  }  while(wsk!=NULL); return NULL; }

wywołanie
int search=0;  printf("Podaj szukany nr telefonu: ");  scanf("%d",search);  wsk3=find_telefon(wsk3,poczatek,search);   if(wsk3!=NULL)    {     printf("Telefon nalezy do nazwiska%s",wsk3->nazwisko);    }    else    {    printf("Nie znaleziono wpisu");

cały kod źródłowy
http://www.toya.net....risu/LISTA2.CPP
nie wklejam coby niei robic bałaganu
I ktos moze mi w którym miejscu popełniam bład ? Funkcja non stop zwraca, ze szukany telefon na liscie sie nie znajduje:/

------------------edit--------------------------
zapomniałem dać & przy scanf i przez to nie działało . Dziwne ze visual błedu nie wywalał:/
mozna zamknąć :) ew usunać
Użytkownik Crisu edytował ten post 07 luty 2006, 18:47


Swoją drogą nie jestem pewien czemu masz to "struct data *wsk" w parametrach funkcji, skoro w jej pierwszej linijce i tak piszesz wsk=pocz. Proponuję przerobić ją na taką:
struct data *find_telefon(struct data *pocz,int telef) {  while (pocz)    if (pocz->telefon == telef)      return pocz;    else      pocz = pocz->next;  return NULL; }
Raczej ładniejsza i wydajniejsza. ;)
Poza tym Twoja wersja wywali się, jeśli w pocz będzie NULL.
Użytkownik Chmurek edytował ten post 07 luty 2006, 20:09
masz racje lepiej wyglada Twoja wersja :) zaraz przerobie reszte f-cji:)
W kazdym razie zeby nie zakładac nowego wątku mam problem z usuwaniem wpisu. A dokladnie z przypadkami skrajnymi: pierwszy i ostatni wyraz
na chłopski rozum skleiłem taka f-cje


void usun(struct data *wsk, struct data *pocz, struct data *kon)
{
if (pocz==wsk)
{
  pocz->nastepny=wsk->nastepny;
  wsk->nastepny->poprzedni=pocz;;
  delete wsk;
}
else if(kon==wsk)
{
  kon->poprzedni=wsk->poprzedni;
  wsk->poprzedni->nastepny=kon;
  delete wsk;
}
else
{
  wsk->poprzedni->nastepny=wsk->nastepny;
  wsk->nastepny->poprzedni=wsk->poprzedni;
  delete wsk;
}
}


do wsk jest przykazywany wskaźnik aktualnej pozycji do usuniecia.
pocz - to wskaznik na poczatek
kon - wskaznik na koniec

na razie testowo przekazuje wskaźnik du usuniecia przez f-cje która szuka telefonu:)
szczegóły w kodzie źródłowym:
http://www.toya.net....risu/LISTA2.CPP

void usun(struct data *wsk, struct data *pocz, struct data *kon) { if (pocz==wsk) {  pocz->nastepny=wsk->nastepny;  wsk->nastepny->poprzedni=NULL;  delete wsk; } else if(kon==wsk) {  kon->poprzedni=wsk->poprzedni;  wsk->poprzedni->nastepny=NULL;  delete wsk; } else {  wsk->poprzedni->nastepny=wsk->nastepny;  wsk->nastepny->poprzedni=wsk->poprzedni;  delete wsk; } }

Wprowadzilem mala poprawke.
wsk->nastepny->poprzedni=NULL; dla 1 wyrazu
wsk->poprzedni->nastepny=NULL; dla ostatniego wyrazu
ich wskazniki nie wskazuja w sumie na nic, i niepotrzebne chyba było przypisanie do nich wartosci poczatku i konca
Myslalem ze przez to wypisuje smieci ale jednak to nie to.



Sorry, że nie odpisałem wcześniej, ale nie zaglądam tu zbyt często.
W każdym razie tak:
1. W kasowaniu końca liniakon->poprzedni=wsk->poprzedni;jest niepotrzebna, bo przecież wtedy kon i wsk wskazują na to samo.
2. Gdy kasujesz początek powinieneś jeszcze zmienić wskaźnik pocz, tak by wskazywał na nowy początek. Przy kasowaniu końca za to zmienić wskaźnik kon.Poza tym tak samo jak w przypadku kasowania końca - pierwsza linijka po if'ie w zasadzie nic nie zmienia.

Proponuję taką wersję tej funkcji:
void usun(struct data *wsk, struct data **pocz, struct data **kon) {  if (*pocz==wsk)  {    wsk->nastepny->poprzedni=NULL;    *pocz = wsk->nastepny;    delete wsk;  }  else if(*kon==wsk)  {    wsk->poprzedni->nastepny=NULL;    *kon = wsk->poprzedni;    delete wsk;  }  else  {    wsk->poprzedni->nastepny=wsk->nastepny;    wsk->nastepny->poprzedni=wsk->poprzedni;    delete wsk;  } }
Użytkownik Chmurek edytował ten post 08 luty 2006, 22:58
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •