18
Linked Lists in C and C++ CS-2303, C-Term 2010 1 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming Language, 2 nd edition, by Kernighan and Ritchie and from C: How to Program, 5 th and 6 th editions, by Deitel and Deitel)

Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Embed Size (px)

Citation preview

Page 1: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 1

Linked Lists in C and C++

CS-2303System Programming Concepts

(Slides include materials from The C Programming Language, 2nd edition, by Kernighan and Ritchie and from C: How to Program, 5th and 6th editions, by Deitel and Deitel)

Page 2: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 2

Definitions

• Linked List• A data structure in which each element is

dynamically allocated and in which elements point to each other to define a linear relationship

• Singly- or doubly-linked• Stack, queue, circular list

• Tree• A data structure in which each element is

dynamically allocated and in which each element has more than one potential successor

• Defines a partial order

Note: elements are usually the

same type (but not always).

Page 3: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 3

Linked List

struct listItem {type payload;struct listItem *next;

};

payload

next

payload

next

payload

next

payload

next

Note: payload may be

multiple members.

Page 4: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 4

Linked List (continued)

• Items of list are usually same type• Generally obtained from malloc()

In computing, malloc is a subroutine for performing dynamic memory allocation in the C and C++ programming languages, though its use in C++ has been largely superseded by operators new and new[]. malloc is part of the standard library for both languages and is declared in the stdlib.h header although it is also declared within the std namespace via the C++'s cstdlib header.

Programs must properly manage dynamic memory allocated through the use of malloc to avoid memory leaks and memory corruption.

• Each item points to next item• Last item points to null• Need “head” to point to first item!

Page 5: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

• “Payload” of item may be almost anything• A single member or multiple members• Any type of object whose size is known at compile time• Including struct, union, char * or other pointers• Also arrays of fixed size at compile time

Linked Lists in C and C++

CS-2303, C-Term 2010 5

A

Head

B C

Page 6: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 6

Usage of Linked Lists

• Not massive amounts of data• Linear search is okay

• Sorting not necessary• or sometimes not possible

• Need to add and delete data “on the fly”• Even from middle of list

• Items often need to be added to or deleted from the “ends”

Page 7: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 7

Linked List (continued)

struct listItem {type payload;struct listItem *next;

};struct listItem *head;

payload

nextpayload

nextpayload

next

payload

next

Page 8: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 8

Adding an Item to a List

struct listItem *p, *q;• Add an item pointed to by q after item pointed to by p

– Neither p nor q is NULL

payload

nextpayload

nextpayload

next

payload

next

payload

next

Page 9: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 9

Adding an Item to a List

listItem *addAfter(listItem *p, listItem *q){q -> next = p -> next;p -> next = q;return p;

}

payload

nextpayload

nextpayload

next

payload

next

payload

next

Page 10: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 10

Adding an Item to a List

listItem *addAfter(listItem *p, listItem *q){q -> next = p -> next;p -> next = q;return p;

}

payload

nextpayload

nextpayload

next

payload

next

payload

next

Page 11: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 11

Adding an Item to a List

listItem *addAfter(listItem *p, listItem *q){q -> next = p -> next;p -> next = q;return p;

}

payload

nextpayload

nextpayload

next

payload

next

payload

next

Question: What to do if we cannotguarantee that p and q are non-NULL?

Page 12: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 12

Adding an Item to a List (continued)

listItem *addAfter(listItem *p, listItem *q){if (p && q) {

q -> next = p -> next;p -> next = q;

}return p;

}

payload

nextpayload

nextpayload

next

payload

next

payload

next

Note test for non-null p and q

Page 13: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 13

What about Adding an Itembefore another Item?

struct listItem *p;• Add an item before item pointed to by p (p != NULL)

payload

nextpayload

nextpayload

next

payload

next

payload

next

Page 14: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 14

What about Adding an Itembefore another Item?

• Answer:–– Need to search list from beginning to find

previous item– Add new item after previous item

Page 15: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 15

Doubly-Linked List

struct listItem {type payload;listItem *prev;listItem *next;

};struct listItem *head, *tail;

prev next

payload

prev next

payloadprev next

payload

prev next

payload

In-class exercise

:– how to

add a new item q after a lis

t

item p

Page 16: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 16

Other Kinds of List Structures

• Queue — FIFO (First In, First Out)

• Items added at end

• Items removed from beginning

• Stack — LIFO (Last In, First Out)

• Items added at beginning, removed from beginning

• Circular list• Last item points to first item

• Head may point to first or last item

• Items added to end, removed from beginning

Page 17: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 17

Circular List

listItem *addAfter (listItem *p, listItem *tail){if (p && tail) {

p -> next = tail -> next;tail = p;

} else if (p) {tail p -> next = p;

}return tail;

}

payload

nextpayload

nextpayload

next

payload

next

struct listItem *tail;

Optional:–struct listItem *head;

Page 18: Linked Lists in C and C++ CS-2303, C-Term 20101 Linked Lists in C and C++ CS-2303 System Programming Concepts (Slides include materials from The C Programming

Linked Lists in C and C++

CS-2303, C-Term 2010 18

Questions?