Docsity
Docsity

Prepare for your exams
Prepare for your exams

Study with the several resources on Docsity


Earn points to download
Earn points to download

Earn points by helping other students or get them with a premium plan


Guidelines and tips
Guidelines and tips

Linked Lists: A Comprehensive Guide for Computer Science Students, Lecture notes of Data Structures and Algorithms

Data Structure PPT

Typology: Lecture notes

2015/2016

Uploaded on 10/19/2016

.23368
.23368 🇮🇳

4

(1)

2 documents

1 / 23

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
Linked Lists
COMP171
Fall 2006
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17

Partial preview of the text

Download Linked Lists: A Comprehensive Guide for Computer Science Students and more Lecture notes Data Structures and Algorithms in PDF only on Docsity!

Linked Lists

COMP

Fall 2006

List Overview

 Linked lists

 Abstract data type (ADT)

 Basic operations of linked lists

 Insert, find, delete, print, etc.

 Variations of linked lists

 Circular linked lists

 Doubly linked lists

A Simple Linked List Class

 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:

double data; // data

Node* next; // pointer to next

A Simple Linked List Class

 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

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;

Inserting a new node

 Node* InsertNode(int index, double x)

 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)

 If the insertion is successful, return the inserted node.

Otherwise, return NULL.

(If index is < 0 or > length of the list, the insertion will fail.)

 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

 Insert as the first node (Case 1 and Case 2)

 Insert in the middle or at the end of the list (Case 3 and

Case 4)

Inserting a new 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 = new Node; 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* 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 = new Node; 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

Finding a node

 int FindNode(double x)

 Search for a node with the value equal to x in the list.

 If such a node is found, return its position. Otherwise, return

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)

 Delete a node with the value equal to x from the list.

 If such a node is found, return its position. Otherwise, return

 Steps

 Find the desirable node (similar to FindNode)

 Release the memory occupied by the found node

 Set the pointer of the predecessor of the found node to the

successor of the found node

 Like InsertNode, there are two special cases

 Delete first node

 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; }

prevNode currNode

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; }

head currNode

Destroying the list

 ~List(void)

 Use the destructor to release all the memory used by the list.

 Step through the list and delete each node one by one.

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;

else cout << "5.0 not found" << endl;

if(list.FindNode(4.5) > 0) cout << "4.5 found" << endl;

else cout << "4.5 not found" << endl;

list.DeleteNode(7.0);

list.DisplayList();

return 0;

6 7 5 Number of nodes in the list: 3 5.0 found 4.5 not found 6 5 Number of nodes in the list: 2

result