• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista dwukierunkowa i jej funkcje

Object Storage Arubacloud
0 głosów
224 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez Jędrzej Dembowski Użytkownik (740 p.)
Kod programu http://ideone.com/OZmZaK

Chcę aby funkcja szukaj po znalezieniu słowa zwracała jego wskaźnik, a jeśli szukane słowo nie istnieje zwróciła null. Nie potrafię poradzić sobie z drugą częścią. Mam problem z typami funkcji i zwracanej wartości. Dziękuję z góry za poświęcony czas.

2 odpowiedzi

0 głosów
odpowiedź 3 grudnia 2016 przez criss Mędrzec (172,590 p.)

Skoro chcesz zwracać wskaźnik, to funkcja powinna wyglądać tak:

elem *szukaj(elem *tail, char *tab){
  if(!tail)
    {
        printf("kolejka pusta");
    }
    else	/*jesli nie jest pusta*/
    {
        while(tail) /*przechodzimy petla dopoki tail nie wskazuje na null*/
        {
            if(strcmp(tail->value, tab)==0){
            return tail;
            }
            tail = tail->prev; /*przepinamy tail na wczesniejsz element w klejce*/
        }
        return nullptr;
    }
}

Typ zwracany - oczywiście powinien być typem wskaźnikowym skoro chcesz zwracać wskaźnik.

W jedenastej linii miałeś dereferencje wskaźnika. Nie powinno jej być.

komentarz 3 grudnia 2016 przez Jędrzej Dembowski Użytkownik (740 p.)
i potem zamiast nullptr też mogę zwrócić wartość tail bo po przejściu pętli będzie miał wartość null prawda?
komentarz 3 grudnia 2016 przez criss Mędrzec (172,590 p.)
Tak, wyjdzie na to samo.
komentarz 3 grudnia 2016 przez criss Mędrzec (172,590 p.)

Jeszcze jedno - jeśli wykona się pierwszy warunek (do funkcji podasz nullptr), to funkcja nic nie zwróci. I tu masz błąd. Najlepiej tak:


elem *szukaj(elem *tail, char *tab){
  if(!tail)
    {
        printf("kolejka pusta");
        return nullptr;
    }
    while(tail) /*przechodzimy petla dopoki tail nie wskazuje na null*/
     {
         if(strcmp(tail->value, tab)==0)
            return tail;
         tail = tail->prev; /*przepinamy tail na wczesniejsz element w klejce*/
     }
     return nullptr;
}

 

komentarz 3 grudnia 2016 przez Jędrzej Dembowski Użytkownik (740 p.)
A jak mogę poprawić funkcję usuń, aby wykorzystywała wskaźnik funkcji szukaj i usuwała ten element? W jaki sposób przestawić wskaźnik poprzedniego i kolejnego elementu?
komentarz 3 grudnia 2016 przez criss Mędrzec (172,590 p.)
Nie rozumiem o co ci chodzi. Co to znaczy "wskaźnik funkcji szukaj"? Wskaźnik na funkcje? Wskaźnik zwracany? Podaj co konkretnie chcesz zrobić.
komentarz 3 grudnia 2016 przez Jędrzej Dembowski Użytkownik (740 p.)
jeśli funkcja szukaj znajdzie podany element wtedy zwraca na niego wskaźnik, chcę stworzyć funkcję usuń, z tym że nie można usunąć elementu jeśli go nie ma w liście i do tego można użyć wcześniej napisanej funkcji szukaj, jeśli zwrócony wskaźnik przez szukaj nie jest nullem to znaczy, że element istnieje i można go usunąć, nie trzeba przeszukiwać całej listy w poszukiwaniu elementu, jeśli chcemy usuwać po wartości a nie indeksie
komentarz 3 grudnia 2016 przez criss Mędrzec (172,590 p.)
elem * ptr = szukaj(...);
usun(&ptr);

Druga sprawa, że nie wiem po co funkcja usun przyjmuje wskaźniki przez wskaźnik. Nie bardzo ma to sens w tym przypadku. Sens by miało gdybyś chciał zmodyfikować wewnątrz funkcji sam wskaźnik, a tego nie robisz. Gdyby usun przyjmowala normalnie elem* to mógłbyś napisać

elem * ptr = szukaj(...);
usun(szukaj(...));

Pominąłem pierwszy argument w wywołaniu usun, bo nie powinno go być - funkcja i tak z niego nie korzysta.

No i linia 46.:

x=tmp->value;

x to int, a tmp->value to tablica char (konwertowana na wskaźnik). To się kompiluje w ogóle? Nawet jeśli to do x przypisujesz adres tablicy tmp->value.

Co chwila znajduje nowe błędy, a pewnie jest ich jeszcze troche. Przeszukaj cały kod / napisz od nowa, bo ja za ciebie tego nie napisze.

komentarz 3 grudnia 2016 przez Jędrzej Dembowski Użytkownik (740 p.)

cały kod nie jest mój i dlatego stopniowo go modyfikuję, ten x tam nie jest potrzebny, tak jak kilka innych rzeczy, chciałem żeby to wyglądało w ten sposób, ale nie wiem co wpisać w nawiasy else żeby poprawnie usunąć ten element

void usun(char *tab, elem **tail, elem **head, elem *wsk){
    elem *tmp;
    tmp = szukaj(wsk, tab);	/* przypisanie tmpowi wartosci tail*/
    if(tmp==0)	/*sprawdza czy kolejka nie jest pusta*/
        {
            printf(" nie udalo sie usunac\n");
            return -1;
        }
        else	/*jak nie jest to zdejmuje element*/
        {

        }
}

 

–1 głos
odpowiedź 3 grudnia 2016 przez developer Użytkownik (860 p.)

troll czy na serio?

ze wstawki:

if(!(*tail))	

ma sprawdzać czy kolejka nie jest pusta?

 

komentarz 3 grudnia 2016 przez criss Mędrzec (172,590 p.)
Zauważ, że tail jest tutaj typu elem**.

Druga sprawa, że wg komentarza if sprawdza czy kolejka nie jest pusta, a jeśli się sprawdzi to wyświetla, że jest pusta. To już bezsens.

Podobne pytania

0 głosów
1 odpowiedź 1,560 wizyt
pytanie zadane 2 kwietnia 2017 w C i C++ przez chacken Użytkownik (820 p.)
0 głosów
2 odpowiedzi 615 wizyt
pytanie zadane 6 stycznia 2017 w C i C++ przez bllackbirrd Nowicjusz (150 p.)
–1 głos
1 odpowiedź 170 wizyt
pytanie zadane 11 maja 2017 w C i C++ przez Isild Użytkownik (580 p.)

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...