Download presentation

Presentation is loading. Please wait.

Published bySaul Scholar Modified over 2 years ago

1
418115: II

2
Linked List A linked list can be thought of a chain of linked list elements. A linked list element contains a single data item, and contains a pointer to the next linked list element. It may also contain a pointer to the previous linked list element. In this case, we call it a doubly linked list element.

3
Linked List (cont.)

4
Linked List Implementation struct _LLElement { int data; _LLElement *next, *prev; }; typedef struct _LLElement LLElement;

5
Linked List Implementaion (cont.) LLElement *LLElement_new( int data ) used to create a new linked list element with the given data. Usage: LLElement *element = LLElement_new(10);

6
Linked List Implementation (cont.) LLElement *LLElement_new( int data ) { LLElement *result = (LLElement *)malloc(sizeof(LLElement)); if (result != NULL) { result->data = data; result->next = NULL; result->prev = NULL; } return result; }

7
Linked List Implementaion (cont.) void LLElement_insert_after( LLElement *position, LLElement *e) inserts a linked list element e after position.

8
Linked List Implementation (cont.) this e

9
Linked List Implementation (cont.) this e

10
Linked List Implementation (cont.) this e

11
Linked List Implementation (cont.) this e

12
Linked List Implementation (cont.) this e

13
Linked List Implementation (cont.) this e

14
Linked List Implementation (cont.) void LLElement_insert_after( LLElement *position, LLElement *e) { e->prev = position; e->next = position->next; if (position->next != NULL) position->next->prev = e; position->next = e; }

15
Linked List Implementaion (cont.) void LLElement_insert_before( LLElement *position, LLElement *e) inserts the linked list element e before position.

16
Linked List Implementation (cont.) position e

17
Linked List Implementation (cont.) e position

18
Linked List Implementation (cont.) e position

19
Linked List Implementation (cont.) e position

20
Linked List Implementation (cont.) e position

21
Linked List Implementation (cont.) this e

22
Linked List Implementation (cont.) void LLElement_insert_before( LLElement *position, LLElement *e) { e->next = position; e->prev = position->prev; if (prev != NULL) position->prev->next = e; position->prev = e; }

23
Linked List Implementaion (cont.) void LLElement_remove(LLElement *e) removes the linked list element e from the chain. In effect, it links es prev with next.

24
Linked List Implementation (cont.) this

25
Linked List Implementation (cont.) e

26
Linked List Implementation (cont.) e

27
Linked List Implementation (cont.) e

28
Linked List Implementation (cont.) e

29
Linked List Implementation (cont.) e

30
Linked List Implementation (cont.) void LLElement_remove(LLElement *e) { if (e->prev != NULL) e->prev->next = e->next; if (e->next != NULL) e->next->prev = e->prev; e->prev = NULL; e->next = NULL; }

31
Linked List Elements Efficiency? Space: O(1) Running Time InsertBeforeO(1) InsertAfterO(1) RemoveO(1)

32
Implementing List with Linked List To simplify implementation, we will use two dummy elements to act as the first element and the last element of the list. These two dummies do not hold real data. Elements between them do.

33
Implementing List with Linked List (cont.) ??? head ??? tail

34
Implementing List with Linked List (cont.) typedef struct { LLElement *head, *tail; int size; } LinkedList; size linked list

35
Implementing List with Linked List (cont.) void LinkedList_init(LinkedList *list) Initializes a linked list. Create the head element. Create the tail element. Link them together. Set the size to 0. void LinkedList_init(LinkedList *list) { list->head = LLElement_new(0); list->tail = LLElement_new(0); list->head->next = tail; list->tail->prev = head; list->size = 0; } 0 head 0 tail

36
Implementing List with Linked List (cont.) int LinkedList_get(LinkedList *list, int i) { int j; LLElement *ptr = list->head->next; for(j=0;j*next; return ptr->data; }
*

37
Implementing List with Linked List (cont.) void LinkedList_set(LinkedList *list, int i, int x) { int j; LLElement *ptr = list->head->next; for(j=0;j*next; ptr->data = x; }
*

38
Implementing List with Linked List (cont.) void LinkedList_find(LinkedList *list, int x) { int result = 0; LLElement *ptr = list->head->next; while (ptr != list->tail && ptr->data != x) { ptr = ptr->next; result++; } if (ptr == tail) return -1; else return result; }

39
Implementing List with Linked List (cont.) void LinkedList_insert(LinkedList *list, int i, int x) { LLElement *ptr = list->head; int j; for(j=0;j

40
Implementing List with Linked List (cont.) void LinkedList_remove(LinkedList *list, int i) { LLElement *ptr = head->next; int j; for(j=0;j*next; LLElement_remove(ptr); free(ptr); list->size--; }
*

41
Linked List Implementations Efficiency Space: O(n) Running Time: Get(i)O(i) = O(n) Set(x,i)O(i) = O(n) Find(x)O(n) Insert(x,i)O(i) = O(n) Remove(x,i)O(i) = O(n)

42
Linked List Implementations Efficiency (cont.) Notice that how you specify the operations can have a lot of impact on the implementations efficiency. We can insert a linked list element into a linked list in O(1) if you know the element just before or after it. But, if we are given the position i to insert, it takes O(i) time just to get there.

43
Linked List Implementations Efficiency (cont.) How is linked list better than array? The space is O(n) at all time. More efficient use of memory. It performs some operation faster. Insert(x, 0) Remove(0) Both are O(1) in LinkedList, but O(n) in ArrayList. So, a queue implemented by a linked list takes O(1) per operation.

Similar presentations

© 2016 SlidePlayer.com Inc.

All rights reserved.

Ads by Google