Documente Academic
Documente Profesional
Documente Cultură
1. Implementați operațiile de SEARCH, INSERT, DELETE, PRINT, FREE pentru o listă dublu înlănțuită.
Lucraţi cu fişiere header.
MAIN MAKENULL(LISTA L) // L – parametru IN-OUT
LISTA L, Nod_lista x Allocate memory for L.head
MAKENULL( L ) L.head.next := NULL
s := -1 L.head.prev := NULL
WHILE s <> 0 DO END MAKENULL
READ s //selecție
CASE s=1: READ key LIST_SEARCH(LISTA L, KEY) //L param. IN
Allocate memory for x //fct returnează un pointer către nodul găsit
x.cheie := key Nod_lista x //Nod_lista este un pointer
LIST_INSERT( L , x) x := L.head
CASE s=2: READ key WHILE x <> NULL AND x.cheie <> KEY DO
x:= LIST_SEARCH(L, key) x := x.next //deplasare în listă
IF x <> NULL THEN END WHILE
PRINT key, x RETURN x
ELSE END LIST_SEARCH
PRINT “Cheie negasita”
CASE s=3: READ key LIST_FREE(LISTA L) //L param. IN-OUT
x := LIST_SEARCH( L, key) Nod_lista x // pointer către un nod
IF x <> NULL THEN x := L.head.next
LIST_DELETE( L, x) WHILE x <> NULL DO
ELSE LIST_DELETE( L, x)
PRINT “Cheie negasita” Free x //dezalocă nodul
CASE 4: x := L.head.next
LIST_PRINT( L ) END WHILE
END CASE Free L.head
END WHILE END LIST_FREE
LIST_FREE( L )
END MAIN
LIST_DELETE(LISTA L, Nod_lista X) LIST_INSERT (LISTA L, Nod_lista X)
// L si X – parametrii IN-OUT deoarece se modifică în functie // L si X – parametrii IN-OUT deoarece se modifică în funcție
IF X.prev <> NULL THEN IF X == NULL THEN
X.prev.next := X.next RETURN
ELSE X.next := L.head.next
L.head.next := X.next IF L.head.next <> NULL THEN
END IF L.head.next.prev := X
IF X.next <> NULL THEN END IF
X.next.prev := X.prev L.head.next := X
END IF X.prev := L.head
END LIST_DELETE END LIST_INSERT
LIST_PRINT (LISTA L) WHILE x <> NULL DO
Nod_lista x // pointer către un nod PRINT x.cheie
x := L.head.next x := x.next //deplasare la următorul
IF x == NULL THEN END WHILE
PRINT “Lista e vida” END LIST_PRINT
END IF //continuare
2. Implemențati operațiile de PUSH și POP pentru o stivă, utilizând șiruri. Lucrați cu fișiere header.
MAIN INIT_STACK(STIVA S, INIT_SIZE) //S param. IN-OUT
STIVA s Allocate mem. S.data[INIT_SIZE]
e := -1 S.top := 0
INIT_STACK(s, 20) END INIT_STACK
WHILE e<>0 DO FREE_STACK(STIVA S)
READ e Free S.data
PUSH(s, e) S.data := NULL
PRINT_STACK(s) S.top := -1
END WHILE END FREE_STACK
WHILE !STACK_EMPTY(s) DO
STACK_EMPTY( STIVA S)
POP(s)
IF S.top == 0
PRINT_STACK(s)
RETURN TRUE
END WHILE
ELSE
FREE_STACK(s)
RETURN FALSE
END MAIN
END IF
END STACK_EMPTY
POP(STIVA S) PUSH(STIVA S, E)
IF STACK_EMPTY(S) S.top := S.top + 1
PRINT ”Stiva e goala” S.data[S.top]=E
RETURN -1 END PUSH
ELSE PRINT_STACK(STIVA S)
e := S.data[S.top] FOR i := 1 TO S.top
S.data[S.top] := 0 PRINT S.data[ i ]
S.top := S.top -1 END FOR
RETURN e END PRINT_STACK
END IF
END POP
Modul de implementare corectă şi structurată a stivei este:
Obs:
Se defineşte în fisierul header
Accesul la elementele stivei se face ca și mai sus prin ” -> ”(pentru param.
IN-OUT) si “ . ” (param IN)
Alocarea șirului de date din stivă se face cu malloc()- De ex. dacă avem
numere întregi în stivă:
stiva->data =(int *)malloc(init_size * sizeof(int))
1. Se dă ADT-ul listă, si 2 implementări ale acestuia, cu listă simplu înlănțuită și cu șir. Se cere
implementarea operațiilor INSERT, LOCATE, RETRIEVE, DELETE, NEXT, PREVIOUS, MAKENULL, FIRST și
PRINTLIST în cele 2 cazuri. Semnificațiile acestor operații sunt cele prezentate la curs.