Chapter 5 – Dynamic Data Structure Part 2: Linked List DATA STRUCTURES & ALGORITHMS Teacher: Nguyen Do Thai Nguyen

Slides:



Advertisements
Similar presentations
Linked Lists Geletaw S..
Advertisements

Pointers and Data Structures 1 Yinzhi Cao Modified from slides made by Prof Goce Trajcevski.
Lists CS 3358.
Chapter 17 Linked Lists.
COMP171 Fall 2005 Lists.
Linked Lists.
DATA STRUCTURES USING C++ Chapter 5
DATA STRUCTURE “Linked Lists” SHINTA P STMIK MDP April 2011.
Linked List
Linked Lists
Stacks and Queues COMP171 Fall Stack and Queue / Slide 2 Stack Overview * Stack ADT * Basic operations of stack n Pushing, popping etc. * Implementations.
Lecture 6 Feb 12 Goals: stacks Implementation of stack applications Postfix expression evaluation Convert infix to postfix.
C++ Programming: Program Design Including Data Structures, Third Edition Chapter 17: Linked Lists.
Starting Out with C++: Early Objects 5/e © 2006 Pearson Education. All Rights Reserved Starting Out with C++: Early Objects 5 th Edition Chapter 17 Linked.
Chapter 4 Linked Lists. © 2005 Pearson Addison-Wesley. All rights reserved4-2 Preliminaries Options for implementing an ADT List –Array has a fixed size.
1 CSC 211 Data Structures Lecture 10 Dr. Iftikhar Azim Niaz 1.
Linked Lists Spring Linked Lists / Slide 2 List Overview * Linked lists n Abstract data type (ADT) * Basic operations of linked lists n Insert,
Data Structures Using C++ 2E
2 Preliminaries Options for implementing an ADT List Array has a fixed size Data must be shifted during insertions and deletions Linked list is able to.
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++ Early Objects Seventh Edition by Tony Gaddis, Judy.
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley. Ver Chapter 4: Linked Lists Data Abstraction & Problem Solving with.
Data Structures Week 5 Further Data Structures The story so far  We understand the notion of an abstract data type.  Saw some fundamental operations.
Chapter 5 – Dynamic Data Structure Par1: Abstract Data Type DATA STRUCTURES & ALGORITHMS Teacher: Nguyen Do Thai Nguyen
Lists II. List ADT When using an array-based implementation of the List ADT we encounter two problems; 1. Overflow 2. Wasted Space These limitations are.
A first look an ADTs Solving a problem involves processing data, and an important part of the solution is the careful organization of the data In order.
1 Linked-list, stack and queue. 2 Outline Abstract Data Type (ADT)‏ Linked list Stack Queue.
Iterator for linked-list traversal, Template & STL COMP171 Fall 2005.
Lists Chapter 8. 2 Linked Lists As an ADT, a list is –finite sequence (possibly empty) of elements Operations commonly include: ConstructionAllocate &
Starting Out with C++ Early Objects Seventh Edition by Tony Gaddis, Judy Walters, and Godfrey Muganda Chapter 17: Linked Lists.
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Slide
Copyright © 2012 Pearson Education, Inc. Chapter 17: Linked Lists.
The List ADT A sequence of zero or more elements A 1, A 2, A 3, … A N-1 N: length of the list A 1 : first element A N-1 : last element A i : position i.
Chapter 5 Linked Lists. © 2004 Pearson Addison-Wesley. All rights reserved 5 A-2 Preliminaries Options for implementing an ADT –Array Has a fixed size.
1 Linked Lists (Lec 6). 2  Introduction  Singly Linked Lists  Circularly Linked Lists  Doubly Linked Lists  Multiply Linked Lists  Applications.
Chapter 5 Linked List by Before you learn Linked List 3 rd level of Data Structures Intermediate Level of Understanding for C++ Please.
Chapter 17: Linked Lists. Objectives In this chapter, you will: – Learn about linked lists – Learn the basic properties of linked lists – Explore insertion.
1 CSC 211 Data Structures Lecture 11 Dr. Iftikhar Azim Niaz 1.
1 Linked List. Outline Introduction Insertion Description Deletion Description Basic Node Implementation Conclusion.
Data Structure & Algorithms
1 CS 132 Spring 2008 Chapter 5 Linked Lists p
Linked Lists Chapter Introduction To The Linked List ADT Linked list: set of data structures (nodes) that contain references to other data structures.
Copyright © 2011 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++ Early Objects Seventh Edition by Tony Gaddis, Judy.
Copyright © 2014, 2008 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Starting Out with C++ Early Objects Eighth Edition by Tony Gaddis,
C++ Programming: Program Design Including Data Structures, Fourth Edition Chapter 17: Linked Lists.
C++ Programming: From Problem Analysis to Program Design, Fourth Edition Chapter 18: Linked Lists.
CC 215 DATA STRUCTURES LINKED LISTS Dr. Manal Helal - Fall 2014 Lecture 3 AASTMT Engineering and Technology College 1.
LINKED LISTS.
List data structure This is a new data structure. The List data structure is among the most generic of data structures. In daily life, we use shopping.
Copyright © 2012 Pearson Education, Inc. Chapter 17: Linked Lists.
UNIT-V ABSTRACT DATA TYPE 1.LIST 2.STACK 3.QUEUE EC6301-II-ECE-C.
Chapter 16: Linked Lists.
Unit – I Lists.
C++ Programming:. Program Design Including
Lectures linked lists Chapter 6 of textbook
Lists CS 3358.
Lecture - 6 On Data Structures
Linked Lists.
List ADT & Linked Lists.
Chapter 4 Linked Lists.
Chapter 4 Linked Lists
Data Structures and Algorithms IT12112
LINKED LISTS CSCD Linked Lists.
Linked Lists.
Chapter 4 Linked Lists.
Chapter 18: Linked Lists.
Linked List.
Chapter 4 Linked Lists.
17CS1102 DATA STRUCTURES © 2018 KLEF – The contents of this presentation are an intellectual and copyrighted property of KL University. ALL RIGHTS RESERVED.
Linked Lists.
Sequences 08/30/17 08/30/17 Unit III. Linked Lists 1.
Presentation transcript:

Chapter 5 – Dynamic Data Structure Part 2: Linked List DATA STRUCTURES & ALGORITHMS Teacher: Nguyen Do Thai Nguyen Phone: Group: Ho Chi Minh City University of Pedagogy

Outline Linked List 5. Array versus Linked Lists 1. Concept of Linked List 2. Declaration of Linked List 3. Operation of Linked List 4. Variations of Linked Lists

Problem With Array Fixed Length (Occupy a Block of memory) [Are also called Dense List] – > waste space Insertion or Deletion: slow 3

Solution Attach a pointer to each item in the array, which points to the next item – This is a linked list – An data item plus its pointer is called a node 4

1. Concept of Linked List * A linked list, or one-way list, is a linear collection of data elements, called nodes, where the linear order is given by means of pointer 5

* Each node is divided into two parts n First part contains the information of the element, and n Second part called the link field or nextpointer field contains the address of the next node in the list Concept of Linked List

* A linked list is a series of connected nodes * Head : pointer to the first node  The last node points to NULL 7 Head  A BC

1. Concept of Linked List * Each node contains at least n A piece of data (any type) n Pointer to the next node in the list 8 datapointer node A

2. Declaration of Linked List  We use two classes: Node and List  Declare Node class for the nodes data : double -type data in this example next : a pointer to the next node in the list class Node { public: doubledata; // data Node*next; // pointer to next };

2. Declaration of Linked List  Declare List, which contains head : a pointer to the first node in the list. Since the list is empty initially, head is set to NULL Operations on List

2. Declaration of Linked List class List { public: List(void) { head = NULL; }// constructor ~List(void);// destructor bool IsEmpty() { return head == NULL; } Node* InsertNode(int index, double x); int FindNode(double x); int DeleteNode(double x); void DisplayList(void); private: Node* head; };

3. Operation of Linked List * Operations of List n IsEmpty: determine whether or not the list is empty n InsertNode: insert a new node at a particular position n FindNode: find a node with a given value n DeleteNode: delete a node with a given value n DisplayList: print all the nodes in the list

Inserting a new node * Node* InsertNode(int index, double x) n Insert a node with data equal to x after the index’th elements. (i.e., when index = 0, insert the node as the first element; when index = 1, insert the node after the first element, and so on) n If the insertion is successful, return the inserted node. Otherwise, return NULL. (If index is length of the list, the insertion will fail.)

Inserting a new node * Steps 1. Locate index’th element 2. Allocate memory for the new node 3. Point the new node to its successor 4. Point the new node’s predecessor to the new node newNode index’th element

Inserting a new node  Possible cases of InsertNode 1. Insert into an empty list 2. Insert in front 3. Insert at back 4. Insert in middle * But, in fact, only need to handle two cases n Insert as the first node (Case 1 and Case 2) n Insert in the middle or at the end of the list (Case 3 and Case 4)

Inserting a new node Node* Node* List::InsertNode(int index, double x) { if (index < 0) return NULL; int currIndex=1; Node* currNode=head; while (currNode && index > currIndex) { currNode=currNode->next; currIndex++; } if (index > 0 && currNode == NULL) return NULL; Node* newNode=newNode; newNode->data=x; if (index == 0) { newNode->next=head; head=newNode; } else { newNode->next=currNode->next; currNode->next=newNode; } return newNode; } Try to locate index’th node. If it doesn’t exist, return NULL.

Inserting a new node Node* Node* List::InsertNode(int index, double x) { if (index < 0) return NULL; int currIndex=1; Node* currNode=head; while (currNode && index > currIndex) { currNode=currNode->next; currIndex++; } if (index > 0 && currNode == NULL) return NULL; Node* newNode=newNode; newNode->data=x; if (index == 0) { newNode->next=head; head=newNode; } else { newNode->next=currNode->next; currNode->next=newNode; } return newNode; } Create a new node

Inserting a new node Node* Node* List::InsertNode(int index, double x) { if (index < 0) return NULL; int currIndex=1; Node* currNode=head; while (currNode && index > currIndex) { currNode=currNode->next; currIndex++; } if (index > 0 && currNode == NULL) return NULL; Node* newNode=newNode; newNode->data=x; if (index == 0) { newNode->next=head; head=newNode; } else { newNode->next=currNode->next; currNode->next=newNode; } return newNode; } Insert as first element head newNode

Inserting a new node Insert after currNode Node* Node* List::InsertNode(int index, double x) { if (index < 0) return NULL; int currIndex=1; Node* currNode=head; while (currNode && index > currIndex) { currNode=currNode->next; currIndex++; } if (index > 0 && currNode == NULL) return NULL; Node* newNode=newNode; newNode->data=x; if (index == 0) { newNode->next=head; head=newNode; } else { newNode->next=currNode->next; currNode->next=newNode; } return newNode; } newNode currNode

Finding a node * int FindNode(double x) Search for a node with the value equal to x in the list. n If such a node is found, return its position. Otherwise, return 0. int List::FindNode(double x) { Node* currNode=head; int currIndex=1; while (currNode && currNode->data != x) { currNode=currNode->next; currIndex++; } if (currNode) return currIndex; return 0; }

Finding a node * int FindNode(double x) Search for a node with the value equal to x in the list. n If such a node is found, return its position. Otherwise, return 0. int List::FindNode(double x) { Node* currNode = head; int currIndex=1; while (currNode && currNode->data != x) { currNode=currNode->next; currIndex++; } if (currNode) return currIndex; return 0; }

Deleting a node * int DeleteNode(double x) n Delete a node with the value equal to x from the list. n If such a node is found, return its position. Otherwise, return 0. * Steps n Find the desirable node (similar to FindNode ) n Release the memory occupied by the found node n Set the pointer of the predecessor of the found node to the successor of the found node * Like InsertNode, there are two special cases n Delete first node n Delete the node in middle or at the end of the list

Deleting a node * int DeleteNode(double x) n Delete a node with the value equal to x from the list. n If such a node is found, return its position. Otherwise, return 0. * Steps n Find the desirable node (similar to FindNode ) n Release the memory occupied by the found node n Set the pointer of the predecessor of the found node to the successor of the found node * Like InsertNode, there are two special cases n Delete first node n Delete the node in middle or at the end of the list

Deleting a node * int DeleteNode(double x) n Delete a node with the value equal to x from the list. n If such a node is found, return its position. Otherwise, return 0. * Steps n Find the desirable node (similar to FindNode ) n Release the memory occupied by the found node n Set the pointer of the predecessor of the found node to the successor of the found node * Like InsertNode, there are two special cases n Delete first node n Delete the node in middle or at the end of the list

Deleting a node int List::DeleteNode(double x) { Node* prevNode=NULL; Node* currNode=head; int currIndex=1; while (currNode && currNode->data != x) { prevNode=currNode; currNode=currNode->next; currIndex++; } if (currNode) { if (prevNode) { prevNode->next=currNode->next; delete currNode; } else { head=currNode->next; delete currNode; } return currIndex; } return 0; } Try to find the node with its value equal to x

Deleting a node int List::DeleteNode(double x) currNode prevNode A B C

Deleting a node int List::DeleteNode(double x) prevNode AC

Deleting a node int List::DeleteNode(double x) { prevNode AC

Deleting a node int List::DeleteNode(double x) { Node* prevNode=NULL; Node* currNode=head; int currIndex=1; while (currNode && currNode->data != x) { prevNode=currNode; currNode=currNode->next; currIndex++; } if (currNode) { if (prevNode) { prevNode->next=currNode->next; delete currNode; } else { head=currNode->next; delete currNode; } return currIndex; } return 0; }

Deleting a node int List::DeleteNode(double x) { currNode head AB

Deleting a node int List::DeleteNode(double x) { head B

Deleting a node int List::DeleteNode(double x) { head B

Deleting a node int List::DeleteNode(double x) { Node* prevNode=NULL; Node* currNode=head; int currIndex=1; while (currNode && currNode->data != x) { prevNode=currNode; currNode=currNode->next; currIndex++; } if (currNode) { if (prevNode) { prevNode->next=currNode->next; delete currNode; } else { head=currNode->next; delete currNode; } return currIndex; } return 0; }

Printing all the elements * void DisplayList(void) n Print the data of all the elements n Print the number of the nodes in the list void List::DisplayList() { int num=0; Node* currNode=head; while (currNode != NULL) { cout data << endl; currNode=currNode->next; num++; } cout << "Number of nodes in the list: " << num << endl; }

Destroying the list * ~List(void) n Use the destructor to release all the memory used by the list. n Step through the list and delete each node one by one. void List::~List(void) { Node* currNode = head, *nextNode = NULL; while (currNode != NULL) { nextNode=currNode->next; // destroy the current node delete currNode; currNode=nextNode; }

Using List int main(void) { List list; list.InsertNode(0, 7.0);// successful list.InsertNode(1, 5.0);// successful list.InsertNode(-1, 5.0);// unsuccessful list.InsertNode(0, 6.0);// successful list.InsertNode(8, 4.0);// unsuccessful // print all the elements list.DisplayList(); if(list.FindNode(5.0) > 0)cout << "5.0 found" << endl; elsecout << "5.0 not found" << endl; if(list.FindNode(4.5) > 0) cout << "4.5 found" << endl; elsecout << "4.5 not found" << endl; list.DeleteNode(7.0); list.DisplayList(); return 0; } Number of nodes in the list: found 4.5 not found 6 5 Number of nodes in the list: 2 result

4. Variations of Linked Lists * Circular linked lists n The last node points to the first node of the list n How do we know when we have finished traversing the list? (Tip: check if the pointer of the current node is equal to the head.) A Head BC

4. Variations of Linked Lists * Doubly linked lists n Each node points to not only successor but the predecessor There are two NULL: at the first and last nodes in the list n Advantage: given a node, it is easy to visit its predecessor. Convenient to traverse lists backwards A Head B  C 

5. Array versus Linked Lists * Linked lists are more complex to code and manage than arrays, but they have some distinct advantages. n Dynamic: a linked list can easily grow and shrink in size.  We don’t need to know how many nodes will be in the list. They are created in memory as needed.  In contrast, the size of a C++ array is fixed at compilation time. n Easy and fast insertions and deletions  To insert or delete an element in an array, we need to copy to temporary variables to make room for new elements or close the gap caused by deleted elements.  With a linked list, no need to move other nodes. Only need to reset some pointers.

Example: The Polynomial ADT * An ADT for single-variable polynomials * Array implementation

The Polynomial ADT… n Acceptable if most of the coefficients A j are nonzero, undesirable if this is not the case n E.g. multiply  most of the time is spent multiplying zeros and stepping through nonexistent parts of the input polynomials * Implementation using a singly linked list n Each term is contained in one cell, and the cells are sorted in decreasing order of exponents

Overview of Templates  template keyword tells the compiler that the class definition that follows will manipulate one or more unspecified types. template class List * When a list is declared, a specific type must be specified. The compiler then generates the actual class code from the template. int main(void) { // use integer type instead of double List list;... }

Linked List using template  Node with/without using template class Node { public: doubledata; Node*next; }; template class Node { public: Objectdata; Node*next; }; * template Object is the substitution parameter, representing a type name. Object is used everywhere in the class where you would normally see the specific type (e.g. double ) the container holds.

Linked List using template template class List { public: List(void) { head = NULL; } ~List(void); bool IsEmpty() { return head == NULL; } Node * InsertNode(int index, Object & x); int FindNode(Object & x); int DeleteNode(Object & x); void DisplayList(void); private: Node * head; };

Linked List using template The first line indicates that Object is the template argument template List ::~List(void) { // desctructor Node * currNode = head, *nextNode = NULL; while (currNode != NULL) { nextNode = currNode->next; delete currNode; currNode = nextNode; }

template Node * List ::InsertNode(int index, Object & x) { if (index < 0) return NULL; int currIndex=1; Node * currNode=head; while (currNode && index > currIndex) { currNode=currNode->next; currIndex++; } if (index > 0 && currNode == NULL) return NULL; Node * newNode=newNode ; newNode->data=x; if (index == 0) { newNode->next=head; head=newNode; } else { newNode->next=currNode->next; currNode->next=newNode; } return newNode; }

Linked List using template template int List ::FindNode(Object & x) { Node * currNode=head; int currIndex=1; while (currNode && currNode->data != x) { currNode=currNode->next; currIndex++; } if (currNode) return currIndex; return 0; }

template int List ::DeleteNode(Object & x) { Node * prevNode=NULL; Node * currNode=head; int currIndex=1; while (currNode && currNode->data != x) { prevNode= currNode; currNode= currNode->next; currIndex++; } if (currNode) { if (prevNode) { prevNode->next= currNode->next; delete currNode; } else { head= currNode->next; delete currNode; } return currIndex; } return 0; }

Linked List using template template void List ::DisplayList() { int num=0; Node * currNode=head; while (currNode != NULL) { cout data << endl; currNode=currNode->next; num++; } cout << "Number of nodes in the list: " << num << endl; }

Using List int main(void) { // use integer type instead of double List list; int x1 = 7, x2 = 5, x3 = 6, x4 = 8; // add items to the list list.InsertNode(0, x1); list.InsertNode(0, x2); list.InsertNode(0, x3); list.InsertNode(1, x4); // print all the elements list.DisplayList(); if(list.FindNode(x2) > 0)cout << "5 found" << endl; elsecout << "5 not found" << endl; list.DeleteNode(x1); list.DisplayList(); return 0; }

Execricise 1.Merge two ordered single linked lists of intergers into one ordered list. 2.Delete an ith node on a linked list. Be sure that such a node exists 3.Delete from list L1 nodes whose positions are to be found in an ordered list L2. For instance, if L1 = (A B C D E) and L2= (2 4 8), then the second and the fourth nodes are to be deleted from list L1 (the eighth node does not exist), and after deletion, L1 = (A C E) 52

Execricise 4.Delete from list L1 nodes occupying position indeicated in ordered lists L2 and L3. For instance, if L1 = (A B C D E), L2 = (2 4 8), and L3 = (2 5), then after deletion, L1 = (A C) 5.Delete from an ordered list L nodes occupying positions indicated in list L itself. For instance, if L = ( ), then after deletion, L = (1 7) 53

Execricise 6. Write a member function to check whether two singly linked lists have the same contents 7. Write a member function to reverse a singly linked list using only one pass through the list 8. Creat a singly linked list that is displayed in the picture below: 54

Execricise 9. Make Menu and perform the following operation by the help of singly linked list?linked list – Create a link list. (The list should be Dynamic and should stop only when the user wishes to end the creation of the list) – Ask User to enter a desire node and as a result the program will delete that node from the list. – Take a node from the user as input and insert that node after the desired node provided by the user.node – Take an identification of a node as input from the user and search that node from the created link list.node search 55