Top Banner
COMP1511 - Programming Fundamentals Term 1, 2020 - Lecture 13
27

Fundamentals COMP1511 - Programming - University of New ...

Feb 16, 2022

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Fundamentals COMP1511 - Programming - University of New ...

COMP1511 - Programming Fundamentals

Term 1, 2020 - Lecture 13

Page 2: Fundamentals COMP1511 - Programming - University of New ...

What did we learn last week?Memory

● Allocating memory for use beyond the scope of functions

Multiple File Projects

Command Line Arguments

Linked Lists

● structs, pointers and malloc all together!

Page 3: Fundamentals COMP1511 - Programming - University of New ...

What are we learning today?Linked Lists

● Continuing our work from last week● Starting a larger example of a Linked List project● Adding and Removing from Linked Lists

Page 4: Fundamentals COMP1511 - Programming - University of New ...

Recap - Linked ListsA chain of identical structs to hold information

● Pointers to the same type of struct so they can be chained together

● Some kind of information stored in the struct

struct node { struct node *next; int data;}

Page 5: Fundamentals COMP1511 - Programming - University of New ...

A Linked List

A program's memory (not to scale)

Node

Next

Data

Node

Next

Data

Node

Next

Data

Node

Next

DataA pointer to the first node

NULL

Page 6: Fundamentals COMP1511 - Programming - University of New ...

Looping through a Linked ListLoop by using the next pointer

● We can jump to the next node by following the current node's next pointer

● We know we're at the end if the next pointer is NULL

// Loop through a list of nodes, printing out their datavoid printData(struct node *n) { while (n != NULL) { printf("%d\n", n->data); n = n->next; }}

Page 7: Fundamentals COMP1511 - Programming - University of New ...

Battle RoyaleLet's use a Linked List to track the players in a game

● We're going to start by adding players to the game● We want to be able to print all the players that are currently in the game

(the list of players can change as the game goes on)● We might want to control the order of the list, so we need to be able to

insert at a particular position● We also want to be able to find and remove players from the list if they're

knocked out of the round

Page 8: Fundamentals COMP1511 - Programming - University of New ...

What will our player nodes look like?We're definitely going to want a basic node struct

● Let's start with a name● And a pointer to the next node

struct player { char name[MAX_NAME_LENGTH]; struct player *next;};

Page 9: Fundamentals COMP1511 - Programming - University of New ...

Creating playersWe'll want a function that creates a node

// Create a player node using the name and next pointer provided// Return a pointer to this nodestruct player *createPlayer(char newName[], struct player *newNext) { struct player *p; p = malloc(sizeof (struct player)); strcpy(p->name, newName); p->next = newNext; return p;}

Page 10: Fundamentals COMP1511 - Programming - University of New ...

Creating the list itselfNote that we don't need to specify the length of the list!

This is one basic way of connecting player nodes together to make a list

int main(void) { // create the list of players struct node *head = createPlayer("Marc", NULL); head = createPlayer("Tom", head); head = createPlayer("Goku", head); head = createPlayer("Bulma", head); head = createPlayer("Master Roshi", head); return 0;}

Page 11: Fundamentals COMP1511 - Programming - University of New ...

Using createPlayer

A program's memory (not to scale)

First Player

Next

1head NULL

Head points at the First Player, its next is NULL

Page 12: Fundamentals COMP1511 - Programming - University of New ...

Adding another Player

A program's memory (not to scale)

New Player

Next

2 head

First Player

Next

1NULL

The New Player is created and copies the head pointer for its next

Next copies head

Page 13: Fundamentals COMP1511 - Programming - University of New ...

Making sure the list is still valid

A program's memory (not to scale)

New Player

Next

2head moves to aim at New Player

First Player

Next

1NULL

createPlayer returns a pointer to New Player, which is assigned to head

Next copied the old head

Page 14: Fundamentals COMP1511 - Programming - University of New ...

Printing out the list of playersHow do we traverse a list to see all the elements in it?

● Loop through, starting with the pointer to the head of the list● Use whatever data is inside the player node● Then move onto the next pointer from that player node● If the pointer is NULL, then we've reached the end of the list

// Loop through the list and print out the player namesvoid printPlayers(struct player* listPlayer) { while (listPlayer != NULL) { printf("%s\n", listPlayer->name); listPlayer = listPlayer->next; }}

Page 15: Fundamentals COMP1511 - Programming - University of New ...

Break TimeHomework - it's not real homework, just things that can inspire you

● AlphaGo Documentary (on Netflix)● I, Robot Short Stories (Isaac Asimov)● Snow Crash and The Cryptonomicon Novels (Neal Stephenson)● Human Resource Machine Game (on Steam, iOS and Android)● Space Alert Board Game (Vlaada Chvatil)

Page 16: Fundamentals COMP1511 - Programming - University of New ...

Inserting Nodes into a Linked ListLinked Lists allow you to insert nodes in between other nodes

● We can do this by simply aiming next pointers to the right places● We find two linked nodes that we want to put a node between● We take the next of the first node and point it at our new node● We take the next of the new node and point it at the second node

This is much less complicated with diagrams . . .

Page 17: Fundamentals COMP1511 - Programming - University of New ...

Our Linked ListBefore we've tried to insert anything

A program's memory (not to scale)

First Node

Next

2

Second Node

Next

1NULLhead

Page 18: Fundamentals COMP1511 - Programming - University of New ...

Create a nodeA new node is made, it's not connected to anything yet

A program's memory (not to scale)

First Node

Next

2

Second Node

Next

1NULLhead

New Node

Next

2

Page 19: Fundamentals COMP1511 - Programming - University of New ...

Connect the new node to the second nodeAlter the next pointer on the New Node

A program's memory (not to scale)

First Node

Next

2

Second Node

Next

1NULLhead

New Node

Next

2

Copy First Node's Next

Page 20: Fundamentals COMP1511 - Programming - University of New ...

Connect the first node to the new nodeAlter the next pointer on the First Node

A program's memory (not to scale)

First Node

Next

2

Second Node

Next

1NULLhead

New Node

Next

2

Set First Node's Next to New Node's address

Page 21: Fundamentals COMP1511 - Programming - University of New ...

Code for insertion of players// Create and insert a new node into a list after a given listNodestruct player *insert(struct player* insertPos, char newName[]) { struct player *p = createPlayer(newName, NULL); if (insertPos == NULL) { // List is empty, p becomes the only element in the list insertPos = p; p->next = NULL; } else { // Set the new player (p)'s next to after the insertion position p->next = insertPos->next; // Set the insert position node's next to now aim at p insertPos->next = p; } return listNode;}

Page 22: Fundamentals COMP1511 - Programming - University of New ...

Inserting Players to create a listWe can use insertion to have greater control of where players end up in a list

int main(void) { // create the list of players struct node *head = createPlayer("Marc", NULL); insert("Tom", head); insert("Goku", head); insert("Bulma", head); insert("Master Roshi", head); printPlayers(head);

return 0;}

Page 23: Fundamentals COMP1511 - Programming - University of New ...

Insertion with some conditionsWe can now insert into any position in a Linked List

● We can read the data in a node and decide whether we want to insert before or after it

● Let's insert our elements into our list based on alphabetical order● We're going to use a string.h function, strcmp() for this● strcmp() compares two strings, and returns

○ 0 if they're equal○ negative if the first has a lower ascii value than the second○ positive if the first has a higher ascii value than the second

Page 24: Fundamentals COMP1511 - Programming - University of New ...

Finding where to insertWe're going to loop through the list

● This loop assumes the list is already in alphabetical order● Each time we loop, we're going to keep track of the previous player● We'll test the name of each player using strcmp() ● We stop looping once we find the first name that's "higher" than ours● Then we insert before that player

Page 25: Fundamentals COMP1511 - Programming - University of New ...

Finding the insertion point

Player

Next

A

Player

Next

C

Player

Next

E

Player

Next

Shead points at the first player

NULL

D

Attempting to insert a player with name: "D" into a sorted list while maintaining the alphabetical order

loop stops here

Insert between these two players

loop starts here

Page 26: Fundamentals COMP1511 - Programming - University of New ...

Inserting into a list Alphabeticallystruct player *insertAlphabetical(char newName[], struct player* head) { struct player *previous = NULL; struct player *p = head; // Loop through the list and find the right place for the new name while (p != NULL && strcmp(newName, p->name) > 0) { previous = p; p = p->next; } struct player *insertionPoint = insert(newName, previous); // Return the head of the list (even if it has changed) if (previous == NULL) { // we inserted at the start of the list insertionPoint->next = p; return insertionPoint; } else { return head; }}

Page 27: Fundamentals COMP1511 - Programming - University of New ...

What did we learn today?Linked Lists

● Creating a List project● Building the list● Looping through the list● Inserting nodes at a specific location● Inserting nodes into an ordered list