Ladda ner presentationen
Presentation laddar. Vänta.
1
Riktade listor i C och Java Lösning till gruppövning 1
2
Gränsytan på sidan 66 Empty () Dlist(val) Insert (v:val, p:pos, l: Dlist(val)) (Dlist(val), pos) IsEmpty(l:Dlist(val)) Bool Inspect(p:pos, l: Dlist(val)) val IsEnd(p:pos, l: Dlist(val)) Bool First(l: Dlist(val)) pos Next(p:pos, l: Dlist(val)) pos Remove (p:pos, l: Dlist(val)) (Dlist(val), pos)
3
”Problemet” Insert ska stoppa in ett element före den angivna positionen. –Men i en riktad lista finns ingen prev-pekare... Hur löser man problemet? –Stoppar in en ny cell efter positionen, kopierar värdet på positionen till den nya cellen och stoppar in det nya värdet på den gamla platsen. –Använder sig av en fysisk och en logisk referens
4
Java vs. C I Java –är den abstrakta datatypen en egen klass som döljer attributen och eventuella hjälpmetoder. –man har inte listan med som argument till metoderna. –Empty motsvaras av klassens konstruktor. I C –når man alla funktioner ”lika lätt” och man har listan med som argument. –måste man komma ihåg att avallokera minnet man använder. –funktionshuvudena blir i princip som de i boken.
5
Java:s interface public interface DListInterface { // Empty () Dlist(val) blir konstruktorn public Pos insert(Object v, Pos p) ; public boolean isEmpty(); public Object inspect(Pos p); public boolean isEnd(Pos p); public Pos first(); public Pos next(Pos p); public Pos remove(Pos p); } DListInterface.java
6
C:s ”interface” /* Funktionsprototyper */ dlist_t *dlist_empty(); pos_t *dlist_insert(dlist_t *list, void *v, pos_t *pos); int dlist_isempty(dlist_t *list); void *dlist_inspect(dlist_t *list, pos_t *pos); int dlist_isend(dlist_t *list, pos_t *pos); pos_t *dlist_first(dlist_t *list); pos_t *dlist_next(dlist_t *list, pos_t *pos); pos_t *dlist_remove(dlist_t *list, pos_t *pos); DList.c
7
Datatypen Pos och DList Java class Pos{ // Inte så snyggt gjort!!! public Object v = null; public Pos next = null; } // DList blir en egen klass public class DList implements DListInterface{ private Pos head; … C typedef struct pos_s{ void *v; struct pos_s *next; } pos_t; typedef struct dlist_s{ pos_t *head; } dlist_t;
8
Empty DList(){ // Tomma listan head = new Pos(); head.next = head; } dlist_t *dlist_empty(){ dlist_t *list = malloc(sizeof(dlist_t)); list->head = malloc(sizeof(pos_t)); list->head->next = list->head; return list; } head vnext list
9
IsEmpty, Inspect public boolean isEmpty(){ return (head.next == head); } public Object inspect(Pos pos){ return (pos.next.v); } int dlist_isempty(dlist_t *list){ return (list->head->next == list->head); } void *dlist_inspect(dlist_t *list, pos_t *pos){ return (pos->next->v); } Kom ihåg: Inspect är inte definierad för listans sista position head vnext list vnextv... vnext pos Logisk position Fysisk position
10
IsEnd, First, Next public boolean isEnd(Pos pos){ return (pos.next == head); } public Pos first(){ return (head); } public Pos next(Pos pos){ return (pos.next); } int dlist_isend(dlist_t *list, pos_t *pos){ return (pos->next == list->head); } pos_t *dlist_first(dlist_t *list){ return (list->head); } pos_t *dlist_next(dlist_t *list, pos_t *pos){ return (pos->next); } head vnext list vnextv... vnext
11
Insert public Pos insert (Object v, Pos pos){ Pos p = new Pos(); p.v = v; if (isEmpty()) { head.next = p; p.next = head; return head; } else { p.next = pos.next; pos.next = p; return pos; } pos_t *dlist_insert(dlist_t *list, void *v, pos_t *pos) { pos_t *p = malloc(sizeof(pos_t)); p->v = v; if (dlist_isempty(list)) { list->head->next = p; p->next = list->head; return list->head; } else { p->next = pos->next; pos->next = p; return pos; }
12
Remove public Pos remove(Pos pos){ Pos p = pos.next; p.v = null; // Behövs eg. inte pos.next = p.next; return pos.next; } pos_t *dlist_remove(dlist_t *list, pos_t *pos){ pos_t *p = pos->next; if (p->v != NULL) { free(p->v); } pos->next = p->next; return pos->next; }
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.