Unit ii(dsc++)

52
UNIT-II UNIT-II Topics to be covered Topics to be covered Singly linked list Singly linked list Circular linked list Circular linked list Doubly linked list Doubly linked list Representing Stack with linked Representing Stack with linked list list Representing Queues with linked Representing Queues with linked list list

Transcript of Unit ii(dsc++)

Page 1: Unit ii(dsc++)

UNIT-IIUNIT-IITopics to be coveredTopics to be covered Singly linked list Singly linked list Circular linked listCircular linked list Doubly linked list Doubly linked list Representing Stack with linked listRepresenting Stack with linked list Representing Queues with linked listRepresenting Queues with linked list

Page 2: Unit ii(dsc++)

In array(or lists) are simple data structures used to hold sequence of data.

Array elements are stored in consecutive memory locations. To occupy the adjacent space, block of memory that is required for the array should be allocated before hand.

Once memory allocated it cannot be extended any more. So that array is called the static data structure.

Wastage of memory is more in arrays.

int a[ ]= {50,42,85,71,99};

Page 3: Unit ii(dsc++)

What’s wrong with Array and Why linked lists?

Disadvantages of arrays as storage data structures:– slow searching in unordered array– insertion and deletion operations are slow.

Because, we have to shift subsequent elements – Fixed size– Wastage of memory

Linked lists solve some of these problems- Linked list is able to grow in size as needed

• Does not require the shifting of items during insertions and deletions.

- No wastage of memory.

Page 4: Unit ii(dsc++)

Linked ListsLinked Lists

Page 5: Unit ii(dsc++)

Linked list Linked list is a linear data structure that supports the dynamic

memory allocation( the amount of memory could be varied during its use). It is also dynamic data structure.

Linked list is used to hold sequence of data values. Data values need not be stored in adjacent memory cells each data values has pointer which indicates where its next data

value in computer memory.

An element in a linked list is known as a node. A node contains a data part and one or two pointer part which contains the address of the neighborhood nodes in the list.

Node structure-

Page 6: Unit ii(dsc++)
Page 7: Unit ii(dsc++)

• Types of linked list• Depending on the requirements the pointers are

maintained, and accordingly linked list can be classified into three groups

1. Singly linked lists 2. Circular linked lists 3. Doubly linked lists1. Singly linked list in singly linked list, each node has two parts one is

data part and other is address part. - data part stores the data values. - address part contains the address of its next node.

Page 8: Unit ii(dsc++)

• Structure of singly linked list

10 25002000

20 26002500

30 2367 40 NULL

23672600

2000Header

A NULL pointer used to mark the end of the linked list

The head or header always points to the first node in the list.

Page 9: Unit ii(dsc++)

Possible operations on singly linked list

1. Insertion2. Deletion3. Traverse\display4. Search5. reverse a linked list6. Copying7. Merging (combine two linked lists)

Page 10: Unit ii(dsc++)

Insertion in linked list

• There are various positions where node can be inserted.

1. Insert at front ( as a first element)2. Insert at end ( as a last node)3. Insert at middle ( any position)

Page 11: Unit ii(dsc++)

Singly linked listsNode Structure

struct node{

int data;struct node *link;

}*new, *ptr, *header, *ptr1;

Creating a node

new = malloc (sizeof(struct node));new -> data = 10;new -> link = NULL;

data link

2000

10

new

2000

NULL

Page 12: Unit ii(dsc++)

1000

header

10 20 30

5

2000

21

1. Insert new node at front in linked listAlgorithm step1- create a new nodeStep2- new->link=header->linkStep3- new->data=itemStep4- header->link=new.Step5-stop

5

New node

2000

1000 1500 2050

1500 2050

1000

2000

Page 13: Unit ii(dsc++)

Insert new node at end of the linked list

• Algorithm• Step1- create a new node• Step2- ptr=header• Step3- while(ptr->link!=null)• 3.1. ptr=ptr->link• Step4- ptr->link=new• Step5- new->data=item• Step6- new->link=null• Step7-stop

Page 14: Unit ii(dsc++)

Insert new node at end of the linked list

2300

header

10 20 30

40

2500

ptr

12300 2400

2400

2450

2450

New

2500

AlgorithmStep1- create a new nodeStep2- ptr=headerStep3- while(ptr->link!=null) 3.1. ptr=ptr->linkStep4- ptr->link=newStep5- new->data=itemStep6- new->link=nullStep7-stop

Page 15: Unit ii(dsc++)

Insert new node at any position in linked list• Algorithm

1.Create new node2. ptr=header3. Enter the position 4. for(i=1;i<pos-1;i++) 4.1 ptr=ptr->link; 5. new->link=ptr->link; 6. ptr->link=new; 7. new->data=item 8.stop

10 25002000

20 26002500

30 2367 40 NULL

23672600

2000Header

Inserted position is : 3ptr

5

New node1000

2600

1000

Page 16: Unit ii(dsc++)

Deletion of a node from singly linked list Like insertion, there are also various

cases of deletion:1. Deletion at the front2. Deletion at the end3. Deletion at any position in the list

Page 17: Unit ii(dsc++)

Deleting a node at the beginning

if (header = = NULL) print “List is Empty”;else{ ptr = header; header = header -> link; free(ptr);}

10 1800 20 30 1400 40 NULL

1500 1800 1200 1400

1200

1500

header

1500

ptr

1800

Page 18: Unit ii(dsc++)

Deleting a node at the end

10 1800 20 1200 30 1400 40 NULL

1500 1800 1200 1400

1500

header

ptr = header;while(ptr -> link != NULL){

ptr1=ptr;ptr = ptr -> link;

}ptr1 -> link = NULL;free(ptr);

1500

ptr

18001200

NULL

ptr1 ptr1 ptr1

1400

Page 19: Unit ii(dsc++)

Deleting a node at the given position

10 1800 20 1200 30 1400 40 NULL

1500

header

ptr = header ;for(i=1;i<pos-1;i++)

ptr = ptr -> link;ptr1 = ptr -> link;ptr -> link = ptr1-> link;free(ptr1);

1500

ptr

1500 1800 1200 1400

Delete position : 31800

ptr1

1200

1400

Page 20: Unit ii(dsc++)

Traversing an elements of a list

10 1800 20 1200 30 1400 40 NULL

1500 1800 1200 1400

1500

header

if(header = = NULL)print “List is empty”;

elsefor (ptr = header ; ptr != NULL ; ptr = ptr ->

link)print “ptr->data”;

ptr

1500

Page 21: Unit ii(dsc++)

SLL program#include<stdio.h>#include<malloc.h>void search();void traverse();void deletion();void insertion();int choice,i,pos,item;struct node{int data;struct node *link;}*header,*ptr,*ptr1,*new;

void main(){header=NULL;printf("****Menu****\n");printf("\n1.insertion\n 2.deletion\n 3.traverse \n4.search \n5.exit\n");while(1){printf("\nenter ur choice");scanf("%d",&choice);switch(choice){case 1: insertion();

break;case 2: deletion();

break;case 3: traverse();

break;case 4:search();

break;case 5:exit(0);default:printf("\nwrong choice\n");}//switch}//while}//main

Page 22: Unit ii(dsc++)

//insertion functionvoid insertion(){new=malloc(sizeof(struct node));printf("\n enter the item to be inserted\n");scanf("%d",&item);new->data=item;if(header==NULL){new->link=NULL;header=new;}//ifelse{printf("\nenter the place to insert the item\n");printf("1.start\n 2.middle\n 3. end\n");scanf("%d",&choice);

if(choice==1){new->link=header;header=new;}//ifif(choice==2){ptr=header;printf("enter the position to place item\n");scanf("%d",&pos);for(i=0;i<pos-1;i++)ptr=ptr->link;new->link=ptr->link;ptr->link=new;}//ifif(choice==3){ptr=header;while(ptr->link!=NULL)ptr=ptr->link;new->link=NULL;ptr->link=new;}//if}//else}//insertion

Page 23: Unit ii(dsc++)

//deletion functionvoid deletion(){ptr=header;if(header==NULL){printf("\nthe list is empty");}else{printf("\n1.start \n2.middle \n3.end");printf("\n enter the place to delete the element from list");scanf("%d",&choice);if(choice==1){printf("\nthe deleted item from the list is -> %d",ptr->data);header=header->link;}//if

if(choice==2){printf("\n enter the position to delete the element from the list");scanf("%d",&pos);for(i=0;i<pos-1;i++){ptr1=ptr;ptr=ptr->link;}printf("\n the deleted element is ->%d",ptr->data);ptr1->link=ptr->link;}//ifif(choice==3){while(ptr->link!=NULL){ptr1=ptr;ptr=ptr->link;}//whileprintf("\nthe deleted element from the list is ->%d", ptr->data);ptr1->link=NULL;}}}

Page 24: Unit ii(dsc++)

void search(){int loc=0;ptr=header;printf("\n enter the element to be searched in the list");scanf("%d",&item);while((ptr->data!=item)&&(ptr->link!=NULL)){ptr=ptr->link;loc++;}If((ptr->link==NULL)&&(ptr->data!=item))Printf(“\n element not found”); elseprintf("\n the element found at location %d",loc);}//search()

//traverse functionvoid traverse(){if(header==NULL)printf("list is empty\n");else{printf("\n the elements in the list are");for(ptr=header;ptr!=NULL;ptr=ptr->link)printf(“ %d”, ptr->data);}//else}//traverse

Page 25: Unit ii(dsc++)

Disadvantage of using an array to implement a stack or queue is the wastage of space.

Implementing stacks as linked lists provides a feasibility on the number of nodes by dynamically growing stacks, as a linked list is a dynamic data structure.

The stack can grow or shrink as the program demands it to.

A variable top always points to top element of the stack.

top = NULL specifies stack is empty.

Representing Stack with Linked List

Page 26: Unit ii(dsc++)

In this representation, first node in the list is last inserted element hence top must points to the first element on the stack

Last node in the list is the first inserted element in the stack.

Thus, push operation always adds the new element at front of the list

And pop operation removes the element at front of the list.

Size of the stack not required. Test for overflow is not applicable in this case.

Page 27: Unit ii(dsc++)

10 NULL

1500

1800

1200

1400

20 1400

30 1200

40 1800

50 1500 1100

top

Example:The following list consists of five cells, each of which holds a data object and a link to another cell.

A variable, top, holds the address of the first cell in the list.

Page 28: Unit ii(dsc++)

/* write a c program to implement stack using linked list */#include<stdio.h> #include<malloc.h> #include<stdlib.h>int push(); int pop(); int display();int choice,i,item;struct node {

int data;struct node *link;

}*top,*new,*ptr;main() { top=NULL;

printf("\n***Select Menu***\n");while(1) {

printf("\n1.Push \n2.Pop \n3.Display \n4.Exit\n5.Count");printf("\n\nEnter ur choice: ");scanf("%d",&choice);switch(choice) {

case 1: push(); break;case 2: pop(); break;case 3: display(); break;case 4: exit(0);case 5: count(); break;default: printf("\nWrong choice");

}/* end of switch */}/* end of while */

}/* end of main */

Page 29: Unit ii(dsc++)

int push(){

new=malloc(sizeof(struct node));printf("\nEnter the item: ");scanf("%d",&item);new->data=item;if(top==NULL){

new->link=NULL;}else{

new->link=top;}top=new;return;

}/* end of insertion */

int pop(){

if(top = = NULL){printf("\n\nStack is empty");

return;}//ifelse{printf("\n\nThe deleted element

is: %d",top->data);top=top->link;

}return;

}/* end of pop() */

Page 30: Unit ii(dsc++)

int display(){

ptr=top;if(top= =NULL){printf("\nThe list is empty");

return;}

printf("\nThe elements in the stact are: ");while(ptr!=NULL){printf("\n %d",ptr->data);ptr=ptr->link;}/* end of while */return;

}/* end of display() */

int count(){

int count=1;ptr=top;if(top = = NULL){printf("\nThe list is empty");

return;}while(ptr->link!=NULL){

++count;ptr=ptr->link;

}printf("\n\nThe number of elements in the stack are: %d",count);return;

}/* end of count */

Page 31: Unit ii(dsc++)

New items are added to the end of the list. Removing an item from the queue will be done from the front.

A pictorial representation of a queue being implemented as a linked list is given below.

The variables front points to the first item in the queue and rear points to the last item in the queue.

Representing Queue with Linked List

10 1800 20 1200 30 1400 40 NULL

1500 1800 1200 1400

front rear

Page 32: Unit ii(dsc++)

10 1800 20 1200 30 1400 40 NULL

1500 1800 1200 1400

front rear

int enqueue(){new=malloc(sizeof(struct node));

printf("\nenter the item");scanf("%d",&item);new->data=item;new->link=NULL;if(front==NULL) {

front=new; }else{

rear->link=new;}rear=new;return;

}/*end of enqueue */

Page 33: Unit ii(dsc++)

/*write a c program to implement queue using linked list*/#include<stdio.h> #include<malloc.h> #include<stdlib.h>int choice,i,item;struct node {

int data;struct node *link;

}*front,*rear,*new,*ptr;main() {

front=NULL;rear=NULL;printf("\n\n MENU");printf("\n1.Enqueue \n2.Dequeue \n3.Display \n4.Exit");while(1) {

printf("\nEnter your choice: ");scanf("%d",&choice);switch(choice) {

case 1:enqueue(); break;case 2:dequeue(); break;case 3:display(); break;case 4:exit(0);default:printf("\nwrong choice");

}/*end of switch */}/*end of while */

}/*end of main */

Page 34: Unit ii(dsc++)

int enqueue(){

new=malloc(sizeof(struct node));printf("\nenter the item");scanf("%d",&item);new->data=item;new->link=NULL;if(front==NULL){

front=new;}else{

rear->link=new;}rear=new;return;

}/*end of enqueue */

display(){

if(front==NULL)printf("\nThe list is

emtpy");else{

for(ptr=front;ptr!=NULL;ptr=ptr->link) printf(" %d",ptr->data);}return;

}/* end of display */

Page 35: Unit ii(dsc++)

dequeue(){

if(front==NULL)printf("\nThe list is empty");

elseif(front==rear) /*list has single element*/{

printf("\nThe deleted element is: %d",front->data);

front=rear=NULL;}else{

printf("\nThe deleted element is: %d",front->data);

front=front->link;}return;

}/*end ofdequeue*/

Page 36: Unit ii(dsc++)

Doubly linked list In a singly linked list one can move from the header node to any node in

one direction only (left-right).

A doubly linked list is a two-way list because one can move in either direction. That is, either from left to right or from right to left.

It maintains two links or pointer. Hence it is called as doubly linked list.

Where, DATA field - stores the element or data, PREV- contains the address of its previous node, NEXT- contains the address of its next node.

PREV DATA NEXT

Structure of the node

Page 37: Unit ii(dsc++)

Operations on doubly linked list• All the operations as mentioned for the singly linked can be

implemented on the doubly linked list more efficiently.• Insertion• Deletion• Traverse• Search.

Insertion on doubly linked list• Insertion of a node at the front• Insertion of a node at any position in the list• Insertion of a node at the end

Deletion on doubly linked list

• Deletion at front• Deletion at any position• Deletion at end

Page 38: Unit ii(dsc++)

if(header==NULL){

new->prev=NULL;new->next=NULL;header=new;

}

else {new->next=ptr;ptr->prev=new;new->prev=NULL;header=new;}

New 1200

1000

1050

21050

1050 1100 2000

1100 2000 1100

header

ptr

1

1200 10 20 30

5

Insertion of a node at the front

1200

Page 39: Unit ii(dsc++)

Insertion of a node at the end1. Create a new node2. Read the item3. new->data=item4. ptr= header5. while(ptr->next!=NULL)

5.1 ptr=ptr->next;6. new->next=NULL;7. ptr->next=new;8. new->prev=ptr;

1050

1050

1050 1100 2000

1100 2000 1100

header

ptr

10 20 30

New 1200

40

1200

2000

Page 40: Unit ii(dsc++)

Insertion of a node at any position in the list1. create a node new2. read item3. new->data=item4. ptr=header;5. Read the position where the element is

to be inserted6. for(i=1;i<pos-1;i++)

6.1 ptr=ptr->next;7. 1 ptr1=ptr->next;7.2 new->next=ptr1; 7.3 ptr1->prev=new;7.4 new->prev=ptr;7.5 ptr->next=new;

Algorithm

Page 41: Unit ii(dsc++)

header

20 10001010 30 20002020 40 NULL100010 2020NULL

1010 2020 1000 2000

1010 ptr1010 ptr

50 NULLNULL

2200 new

Before inserting a node at position 3

header

20 22001010 30 20002200 40 NULL100010 2020NULL

1010 2020 1000 2000

1010ptr2020 ptr

50 10002020

2200 new

ptr1000 ptr1

After inserting a node at position 3

Page 42: Unit ii(dsc++)

Algorithm:1.ptr=header2.ptr1=ptr->next;3.header=ptr1;4.if(ptr1!=NULL)

1.ptr1->prev=NULL;5. free(ptr);

header

20 10001010 30 20002020 40 NULL100010 2020NULL

1010 2020 1000 2000

1010

ptr1ptr

20 1000NULL 30 20002020 40 NULL100010 2020NULL

1010 2020 1000 2000

20201010

header

Before deleting a node at beginning

After deleting a node at beginning

Page 43: Unit ii(dsc++)

header

20 10001010 30 20002020 40 NULL100010 2020NULL

1010 2020 1000 2000

1010

Algorithm:1. ptr=header2. while(ptr->next!=NULL)

1. ptr=ptr->next;3. end while4. ptr1=ptr->prev;5. ptr1->next=NULL;

Before deleting a node at end

ptrpt1header

20 10001010 30 NULL2020 40 NULL100010 2020NULL

1010 2020 1000 2000

1010 20001000After deleting a node at end

Page 44: Unit ii(dsc++)

Deletion at any position

Algorithm1. ptr=header

1.for(i=0;i<pos-1;i++) 1. ptr=ptr->next;

2. ptr1=ptr->prev;3. ptr2=ptr->next;4. ptr1->next=ptr2;5. ptr2->prev=ptr1;6. free(ptr);

Page 45: Unit ii(dsc++)

header

20 10001010 30 20002020 40 NULL100010 2020NULL

1010 2020 1000 2000

1010 ptr1010 ptrBefore deleting a node at position 3

After deleting a node at position 3

2000header

20 20001010 30 20002200 40 NULL202010 2020NULL

1010 2020 1000 2000

1010ptr2020 ptr

1ptr1000 ptr2

Page 46: Unit ii(dsc++)

Displaying elements of a list

Algorithm:1. ptr=header;2. if(header = = NULL)

1. printf("The list is empty\n");3. else

1. print “The elements in farword order: “2. while(ptr!=NULL)

1. print “ptr->data”;2. if(ptr->next = = NULL)

1. break;3. ptr=ptr->next;

3. print “The elements in reverse order: “4. while(ptr!=header)

4.1 print “ptr->data”; 4.2ptr=ptr->prev;5. End while

6. print “ptr->data”;7.end else

Page 47: Unit ii(dsc++)

20 10001010 30 20002020 40 NULL100010 2020NULL

1010 2020 1000 2000

header1010

ptr

1010

Forward Order : 10 20 30 40

Reverse Order : 40 30 20 10

Page 48: Unit ii(dsc++)

Circular linked list• In a single linked list the last node link is NULL, but a number of

advantages can be gained if we utilize this link field to store the pointer of the header node.(address of first node).

• Definition- the linked list where the last node points the header node is

called circular linked list.Structure of the circular linked list

Page 49: Unit ii(dsc++)

Advantages of circular linked list1. Accessibility of a member node in the list2. No Null link problem3. Merging and splitting operations implemented easily 4. Saves time when you want to go from last node to first node.

Disadvantage1. Goes into infinite loop, if proper care is not taken2. It is not easy to reverse the elements 3. Visiting previous node is also difficult

Page 50: Unit ii(dsc++)

/* Write a c program to implement circular linked list*/#include<stdio.h> #include<conio.h> #include<malloc.h> #include<stdlib.h>int choice,i,item;struct node {

int data;struct node *link;

}*front,*rear,*new,*ptr1,*ptr;main() {

front=rear=NULL;printf("\n select menu\n");while(1) {

printf("\n1.Enqueue \n2.Dequeue \n3.Display \n4.Exit");printf("\nEnter ur choice: ");scanf("%d",&choice);switch(choice) {

case 1: enqueue(); break;case 2: dequeue(); break;case 3: display(); break;case 4: exit(0);default: printf("\nWrong choice.");

}/*end of switch*/}/*end of while*/

}/*end of main*/

Page 51: Unit ii(dsc++)

int enqueue(){

new=malloc(sizeof(struct node));printf("\nEnter the item: ");scanf("%d",&item);new->data=item;if(front==NULL)

front=new;else

rear->link=new;rear=new;rear->link=front;return;

}/*end of enqueue()*/

dequeue(){

if(front==NULL)printf("\nThe circular list is empty.");

elseif(front==rear)// cll has single element{ printf("\nThe deleted element is: %d",front->data); front=rear=NULL;}else{ printf("\nThe deleted element is: %d",front->data); front=front->link; rear->link=front;}return;

}/*end of dequeue*/

Page 52: Unit ii(dsc++)

display(){

ptr=front;if(front==NULL)

printf("\nThe circular list is empty.");else{

printf("\nElements in the list are: ");while(ptr!=rear){

printf(" %d",ptr->data);ptr=ptr->link;

}/*end of while*/ printf(“ %d”, ptr->data);

return;}/*end of else*/

}/*end of display*/