fundamentals comp1511 - programming - university of new
TRANSCRIPT
![Page 1: Fundamentals COMP1511 - Programming - University of New](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/1.jpg)
COMP1511 - Programming Fundamentals
Term 1, 2020 - Lecture 13
![Page 2: Fundamentals COMP1511 - Programming - University of New](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/2.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/3.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/4.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/5.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/6.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/7.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/8.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/9.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/10.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/11.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/12.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/13.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/14.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/15.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/16.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/17.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/18.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/19.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/20.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/21.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/22.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/23.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/24.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/25.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/26.jpg)
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](https://reader031.vdocument.in/reader031/viewer/2022021717/620bf28a76c402468b5fae92/html5/thumbnails/27.jpg)
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