List Data Structure, Linked List, Stacks.ppt

nelryan 22 views 64 slides Sep 02, 2024
Slide 1
Slide 1 of 64
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64

About This Presentation

List Data Structures


Slide Content

Data Structures
Linked Lists, Stacks and Queues

09/02/24 CS 201
Data Structure
•A construct that can be defined within a
programming language to store a
collection of data
–one may store some data in an array of
integers, an array of objects, or an array of
arrays

09/02/24 CS 201
Abstract Data Type (ADT)
•Definition: a collection of data together
with a set of operations on that data
–specifications indicate what ADT
operations do, but not how to implement
them
–data structures are part of an ADT’s
implementation
•Programmer can use an ADT without
knowing its implementation.

09/02/24 CS 201
Typical Operations on Data
•Add data to a data collection
•Remove data from a data collection
•Ask questions about the data in a data
collection. E.g., what is the value at a
particular location, and is x in the
collection?

09/02/24 CS 201
Why ADT
•Hide the unnecessary details
•Help manage software complexity
•Easier software maintenance
•Functionalities are less likely to change
•Localised rather than global changes

09/02/24 CS 201
Illustration

Linked Lists

09/02/24 CS 201
Lists
•List: a finite sequence of data items
a1, a2, a3, …, an
•A list is an ordered data structure
•Lists are pervasive in computing
–e.g. class list, list of chars, list of events
•Typical operations:
–Creation
–Insert / remove an element
–Test for emptiness
–Find an item/element
–Current element / next / previous
–Find k-th element
–Print the entire list

09/02/24 CS 201
Array-Based List Implementation
•One simple implementation is to use arrays
–A sequence of n-elements
•Maximum size is anticipated a priori.
•Internal variables:
–Maximum size maxSize (m)
–Current size curSize (n)
–Current index cur
–Array of elements listArray
n
curSize
a
1
a
2a
3 a
n
listArray
unused
012 n-1 m
cur

09/02/24 CS 201
Inserting Into an Array
•While retrieval is very fast, insertion and
deletion are very slow
– Insert has to shift upwards to create gap
a
1a
2 a
7a
8
a
4a
5a
6
a
3
Step 1 : Shift upwards
8
Size arr
8 a
1a
2a
3 a
7a
8
Size arr
a
4a
5a
6
Example : insert(2, it, arr)
Step 2 : Write into gap
it
Step 3 : Update Size
9

09/02/24 CS 201
Coding
typedef struct {
int arr[MAX];
int max;
int size;
} LIST
void insert(int j, int it, LIST *pl)
{ // pre : 1<=j<=size+1
int i;
for (i=pl->size; i>=j; i=i-1)
// Step 1: Create gap
{ pl->arr[i+1]= pl->arr[i]; };

pl->arr[j]= it; // Step 2: Write to gap
pl->size = pl->size + 1; // Step 3: Update size
}

09/02/24 CS 201
Deleting from an Array
•Delete has to shift downwards to close gap of
deleted item
Step 1 : Close Gap
9 a
1a
2it a
7
a
8
size
a
5a
6a
3
a
8
arr
9 a
1a
2it a
7a
8
size
a
4a
5a
6a
3
arr
Example: deleteItem(4, arr)
Step 2 : Update Size
8
Not part of list

09/02/24 CS 201
Coding
void delete(int j, LIST *pl)
{ // pre :
1<=j<=size
for (i=j+1; i<=pl->size; i=i+1)
// Step1: Close
gap
{ pl->arr[i-i]=pl->arr[i]; };
// Step 2: Update
size
pl->size = pl->size - 1;
}

09/02/24 CS 201
Linked List Approach
•Main problem of array is the slow deletion/insertion since it
has to shift items in its contiguous memory
•Solution: linked list where items need not be contiguous
with nodes of the form
•Sequence (list) of four items < a
1
,a
2
,a
3
,a
4
> can be
represented by:
item next
a
i
a
1 a
2 a
3 a
4
head represents
null

Pointer-Based Linked Lists
•A node in a linked list is usually a struct
struct Node
{ int item
Node *next;
}; //end struct
•A node is dynamically allocated
Node *p;
p = malloc(sizeof(Node));
A node
09/02/24 CS 201

Pointer-Based Linked Lists
•The head pointer points to the first node
in a linked list
•If head is NULL, the linked list is empty
–head=NULL
•head=malloc(sizeof(Node))
09/02/24 CS 201

A Sample Linked List
09/02/24 CS 201

Traverse a Linked List
•Reference a node member with the ->
operator
p->item;
•A traverse operation visits each node in
the linked list
–A pointer variable cur keeps track of the
current node
for (Node *cur = head;
cur != NULL;
cur = cur->next)
x = cur->item;
09/02/24 CS 201

Traverse a Linked List
The effect of the assignment cur = cur->next
09/02/24 CS 201

Delete a Node from a Linked List
•Deleting an interior/last node
prev->next=cur->next;
•Deleting the first node
head=head->next;
•Return deleted node to system
cur->next = NULL;
free(cur);
cur=NULL;
09/02/24 CS 201

Delete a Node from a Linked List
Deleting a node from a linked list
Deleting the first node
09/02/24 CS 201

Insert a Node into a Linked List
•To insert a node between two nodes
newPtr->next = cur;
prev->next = newPtr;
Inserting a new node
into a linked list
CS 201

Insert a Node into a Linked List
•To insert a node at the beginning of a
linked list
newPtr->next = head;
head = newPtr;
Inserting at the beginning
of a linked list
CS 201

Insert a Node into a Linked List
•Inserting at the end of a linked list is not
a special case if cur is NULL
newPtr->next = cur;
prev->next = newPtr;
Inserting at the end of a
linked list
CS 201

Look up
BOOLEAN lookup (int x, Node *L)
{ if (L == NULL)
return FALSE
else if (x == L->item)
return TRUE
else
return lookup(x, L-next);
}
09/02/24 CS 201

An ADT Interface for List
•Functions
–isEmpty
–getLength
–insert
–delete
–Lookup
–…
•Data Members
–head
–Size
•Local variables to
member functions
–cur
–prev
09/02/24 CS 201

09/02/24 CS 201
Doubly Liked Lists
•Frequently, we need to traverse a sequence
in BOTH directions efficiently
•Solution : Use doubly-linked list where each
node has two pointers
next
forward traversal
Doubly Linked List.
x
1 x
4x
2
head
x
3
backward traversal
prev

09/02/24 CS 201
Circular Linked Lists
•May need to cycle through a list repeatedly,
e.g. round robin system for a shared resource

•Solution : Have the last node point to the first
node
x
1 x
2 x
n. . .
Circular Linked List.
head

Stacks

09/02/24 CS 201
What is a Stack?
•A stack is a list with the restriction that
insertions and deletions can be performed in
only one position, namely, the end of the list,
called the top.
•The operations: push (insert) and pop (delete)
pop push(o)
6
7
2
3Top

09/02/24 CS 201
Stack ADT Interface
•The main functions in the Stack ADT are (S is the stack)
boolean isEmpty(); // return true if empty
boolean isFull(S); // return true if full
void push(S, item); // insert item into stack

void pop(S); // remove most recent item
void clear(S); // remove all items from stack

Item top(S); // retrieve most recent item

Item topAndPop(S); // return & remove most recent item

09/02/24 CS 201
Sample Operation
Stack S = malloc(sizeof(stack));
push(S, “a”);
push(S, “b”);
push(S, “c”);
d=top(S);
pop(S);
push(S, “e”);
pop(S);
s
a
b
c
top
e
d

09/02/24 CS 201
Implementation by Linked Lists
•Can use a Linked List as implementation of stack
Top of Stack = Front of Linked-List
StackLL
lst
a
1 a
2 a
3 a
4
head
LinkedListItr

09/02/24 CS 201
Code
struct Node {
int element;
Node * next;
};
typedef struct Node * STACK;

09/02/24 CS 201
More code

More Code
09/02/24 CS 201

09/02/24 CS 201
Implementation by Array
•use Array with a top index pointer as an implementation of stack
EF
0 1 7 8 923 4 5 6
ABCD
top
StackAr
arr
A

09/02/24 CS 201
Code

09/02/24 CS 201
More code

09/02/24 CS 201
More code

Effects
09/02/24 CS 201

09/02/24 CS 201
Applications
•Many application areas use stacks:
–line editing
–bracket matching
–postfix calculation
–function call stack

09/02/24 CS 201
Line Editing
•A line editor would place characters read into a
buffer but may use a backspace symbol (denoted by
) to do error correction
•Refined Task
–read in a line
–correct the errors via backspace
–print the corrected line in reverse
Input :
Corrected Input :
Reversed Output :
abc_defgh2klpqrwxyz
abc_defg2klpwxyz
zyxwplk2gfed_cba

09/02/24 CS 201
The Procedure
•Initialize a new stack
•For each character read:
–if it is a backspace, pop out last char
entered
–if not a backspace, push the char into
stack
•To print in reverse, pop out each char
for output
Input : fghryz
Corrected Input :
Reversed Output :
fyz
zyf Stack
f
g
hr
y
z

09/02/24 CS 201
Bracket Matching Problem
•Ensures that pairs of brackets are properly matched
• An Example:{a,(b+f[4])*3,d+f[5]}
• Bad Examples:
(..)..) // too many closing brackets
(..(..) // too many open brackets
[..(..]..) // mismatched brackets

09/02/24 CS 201
Informal Procedure
Initialize the stack to empty
For every char read
if open bracket then push onto stack
if close bracket, then
return & remove most recent item
from the stack
if doesn’t match then flag error
if non-bracket, skip the char read
Example
{a,(b+f[4])*3,d+f[5]}

Stack
{
(
[
)
}
]
[]

09/02/24 CS 201
Postfix Calculator
•Computation of arithmetic expressions can be efficiently
carried out in Postfix notation with the help of a stack.
Infix - arg1 op arg2
Prefix - op arg1 arg2
Postfix - arg1 arg2 op
(2*3)+4
2*(3+4) 2 3 4 + *
2*3+4
infix
2 3 * 4 +
postfix

09/02/24 CS 201
Informal Procedure
Initialise stack S
For each item read.
If it is an operand,
push on the stack
If it is an operator,
pop arguments from stack;
perform operation;
push result onto the stack
2
3
4
Stack
Expr
2
3
4
+
*
push(S, 2)
push(S, 3)
push(S, 4)
arg2=topAndPop(S)
arg1=topAndPop(S)
push(S, arg1+arg2)
arg2=topAndPop(S)
arg1=topAndPop(S)
push(S, arg1*arg2)
3+4=7
2*7=14

09/02/24 CS 201
Summary
•The ADT stack operations have a last-
in, first-out (LIFO) behavior
•Stack has many applications
–algorithms that operate on algebraic
expressions
–a strong relationship between recursion
and stacks exists
•Stack can be implemented using arrays
or linked lists

Queues

09/02/24 CS 201
What is a Queue?
•Like stacks, queues are lists. With a queue,
however, insertion is done at one end whereas
deletion is done at the other end.
•Queues implement the FIFO (first-in first-out)
policy. E.g., a printer/job queue!
•Two basic operations of queues:
–dequeue: remove an item/element from front
–enqueue: add an item/element at the back
dequeue enqueue

09/02/24 CS 201
Queue ADT
•Queues implement the FIFO (first-in first-out)
policy
–An example is the printer/job queue!
enqueue(o)
dequeue()
isEmpty()
getFront() createQueue()

09/02/24 CS 201
Sample Operation
Queue *Q;
enqueue(Q, “a”);
enqueue(Q, “b”);
enqueue(Q, “c”);
d=getFront(Q);
dequeue(Q);
enqueue(Q, “e”);
dequeue(Q);
q
front back
abce
d

09/02/24 CS 201
Queue ADT interface
•The main functions in the Queue ADT are (Q is the
queue)
void enqueue(o, Q) // insert o to back of Q

void dequeue(Q); // remove oldest item

Item getFront(Q); // retrieve oldest item

boolean isEmpty(Q); // checks if Q is empty

boolean isFull(Q); // checks if Q is full
void clear(Q); // make Q empty

}

09/02/24 CS 201
Implementation of Queue
(Linked List)
•Can use LinkedListItr as underlying implementation of Queues
a
1 a
2 a
3 a
4
head
tail
Queue
lst
LinkedList
addTail

09/02/24 CS 201
Code
struct Node {
int element;
Node * next;
};
struct QUEUE {
Node * front;
Node * rear;
};

09/02/24 CS 201
More code

More code
09/02/24 CS 201
CELL is a list node

09/02/24 CS 201
Implementation of Queue
(Array)
•use Array with front and back pointers as implementation of
queue
Queue
arr
0 1 7 8 923 4 5 6
ABCDEFG
front
back

09/02/24 CS 201
Circular Array
•To implement queue, it is best to view arrays as circular structure
0 1 7 8 923 4 5 6
ABCDEFG
front
back
front
back
A
B
C
D
EF
G
0
1
7
8
9
2
3
4
5
6
Circular view of arrays.

09/02/24 CS 201
How to Advance
•Both front & back pointers should make advancement until they
reach end of the array. Then, they should re-point to beginning
of the array
front = adv(front);
back = adv(back);
int adv(int p)
{ return ((p+1) % maxsize);
}
Alternatively, use modular arithmetic:
mod operator
int adv(int p)
{ int r = p+1;
if (r<maxsize) return r;
else return 0;
}
upper bound of the array

09/02/24 CS 201
Sample
Queue *Q;
enqueue(Q, “a”);
enqueue(Q, “b”);
enqueue(Q, “c”);
dequeue(Q);
dequeue(Q);
enqueue(Q, “d”);
enqueue(Q, “e”);
dequeue(Q);
a
Q
F=front
B=back
F
B
bcd
F
BBB
FF
BB
e

09/02/24 CS 201
Checking for Full/Empty State
What does (F==B) denote?
F
B
Queue
Empty
State
cde
B
F
f Queue
Full
State
size 0 size 4
cde
BF
Alternative - Leave a Deliberate Gap!
No need for size field.
Full Case : (adv(B)==F)

09/02/24 CS 201
Summary
•The definition of the queue operations
gives the ADT queue first-in, first-out
(FIFO) behavior
•The queue can be implemented by
linked lists or by arrays
•There are many applications
–Printer queues,
–Telecommunication queues,
–Simulations,
–Etc.
Tags