# PBinfo #4173 – FLdiCauta – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

Se consideră o listă liniară dublu înlănțuită, alocată dinamic, în care elementele sunt de tipul declarat mai jos:

struct nod
{
    int info;
    nod *ant, *urm;
};
în care câmpul info memorează un număr întreg, câmpul ant memorează adresa elementului anterior al listei, iar campul urm memorează adresa elementului următor al listei.

Cerința
Să se scrie o funcție C++ cu următorul prototip:

int FLdiCauta(nod *prim, nod *ultim, int k)
Primul nod are adresa memorată în pointerul prim si ultimul nod are adresa memorata in pointerul ultim. Numărul k este întreg și nenul. Dacă k > 0, atunci funcția va returna informația reținută în al k-lea nod, parcurgând lista de la stânga la dreapta. În cazul, în care k este mai mare sau egal cu numărul de noduri, atunci funcția va returna informația din nodul ultim. Dacă k < 0, atunci, notând cu p = -k, funcția va returna informația reținută în al p-lea nod, parcurgând lista de la dreapta la stânga. În cazul, în care p este mai mare sau egal cu numărul de noduri, atunci funcția va returna informația din nodul prim. De exemplu, dacă lista reține valorile 5,3,6,2,8, atunci FLdiCauta(prim, ultim, 4) = 2, FLdiCauta(prim, ultim, 20) = 8, iar FLdiCauta(prim, ultim, -4) = 3.

Restricții și precizări

numele funcției va fi FLdiCauta
lista inițială conține cel puțin un nod

Important
Soluţia propusă va conţine definiţia funcţiei cerute. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.

## Cod sursă C++

```cpp
int FLdiCauta(nod *prim, nod *ultim, int k)
{
    nod *p;
    if (k > 0)
    {
        for (p = prim; p != NULL && k > 1; p = p->urm)
            k--;
        if (p == NULL) return ultim->info;
        return p->info;
    }
    k = -k;
    for (p = ultim; p != NULL && k > 1; p = p->ant)
        k--;
    if (p == NULL) return prim->info;
    return p->info;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/4173)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/4173/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-4173/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
