linked list

98
List Objectives • Describe a list • How a list can be implemented by linked structure • Implement the various operations on linked list

Upload: harry-potter

Post on 23-Jan-2017

109 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Linked list

ListObjectives• Describe a list• How a list can be implemented by linked

structure• Implement the various operations on

linked list

Page 2: Linked list

List

• List is homogeneous collection of elements, with linear relationship between the elements, the list can be ordered or unordered.

• Implementing listList can be implemented using1. Linear array2. Linked list

Page 3: Linked list

Array implementation of lists• The linear array can be created at the compilation time by

using type declaration statement of typeint a[100];

• Which create linear array with 100 elements• Since each elements takes two bytes of memory, the

compiler allocates 200 bytes for the array.• The above array can be created at run time with the

following declaration statementint *a;a=(int*)malloc(100*sizeof(int));

In the above declaration, the malloc() function allocates 200 bytes of memory and assign the address of the first byte to the pointer variable a.

Page 4: Linked list

Limitations of an array

• Insertion and deletion operations are expensive.

• Inserting at first position requires first pushing the entire array down by one position to make room.

• Deleting the first element requires shifting all the elements in the list one position up.

• So worst case of these operation is O(n).• Size of the list must be known in advance.

Page 5: Linked list

Linked implementation of list• To avoid the linear cost of insertion and deletion

operations, we need to ensure that the elements of the list are not stored contiguously.

• Linked list basically consists of series of structures, which are not necessarily adjacent in memory

• Each structure contains an element of the list and a pointer to structure containing its successor.

• Linked implementation allow traverse and search operations to be carried out in linear time.

• Insertion and deletion operations can be implemented efficiently as it requires only rearrangement of pointers.

Page 6: Linked list

Linked list definedA linked list is a linear collection of data

elements, called nodes, the linear order is given by pointers. Each node is divided into two or more parts. Linked list can be of following types:

• Linear linked list or one way list• Doubly linked list or two way list• Circular linked list• Header linked list

Page 7: Linked list

Linear linked listIn a linear linked list, also called singly linked list or one

way linked list, each node is divided into two parts.• First parts contain the information of the element• Second part called the linked field or next pointer field,

contains the address of the next node in the list.

head

1200 1201 1202 1203 X

Next pointer field of 2nd node

Information field of second node

•head is used to hold the address of first element of the list.

•Last element of the linked list have NULL value in the next pointer field to mark the end of the list

Page 8: Linked list

Representation of Linear linked list

Suppose we want to store the list of integer numbers, then the linear linked list can be represented in memory with the following declarations.

typedef struct nodetype{

int info;struct nodetype *next;

}node;node *head;

The above declaration define a new data type, whose each element is of type nodetype and gives it a name node.

Page 9: Linked list

Operation on Linear linked lists

• Creating an empty list• Traversing a list• Searching an element• Inserting an element• Deleting an element

Page 10: Linked list

Creating an empty list• In the previous declaration, the variable head is declared

as pointer to node data type.• Variable head is not yet given a value.• This variable is used to point to the first element of the

list• Since the list will be empty in the beginning, the variable

head is assigned a sentinel value to indicate the list is empty.

void createemptylist(node **head){

*head=NULL;}

Page 11: Linked list

Traversing a listLinear list can be traversed in two ways• In order traversal• Reverse order traversalIn order traversal:To traverse the linear linked list, we move along the pointer, and

process each element till we reach the last element.void traverseinorder(node *head){

while(head!=NULL){

printf(“%d\n”,head->info);head=head->next;

}}

Page 12: Linked list

Traversing a listReverse order traversal:To traverse the linear linked list in reverse order, we move along the

pointer till we reach the last element. The last element is processed first, then the second last and so on and finally the first element of the list

To implement this we use either stack (LIFO) or recursion.Void traversereverseorder(node *head)

{if(head->next!=NULL){

traversereverseorder(head->next);printf(“%d\n”,head->info);

}}

Page 13: Linked list

Searching an element• In linear linked list, only linear searching

is possible.• This is one of the limitation of the linked

list as there is no way to find the location of the middle element of the list

List can be 1. Sorted2. Unsorted

Page 14: Linked list

Searching an elementList is unsorted:We traverse the list from the beginning, and compare

each element of the list with the given element say item to be searched.

node *searchunsortedlist(node *head, int item){

while((head!=NULL) &&(head->info!=item))head=head->next;

return head;}

Page 15: Linked list

Searching an elementList is sorted:If the list is sorted say in ascending order then we traverse the list from

beginning and compare each element of list with item to be searched. If the match occurs, the location of the element is returned. If we reach the element that is greater than item or end of the list NULL value is returned.

node *searchinsortedlist(node *head, int item){

while(head!=NULL){

if(head->info==item)return head;

else if (item<head->info)return NULL;

elsehead=head->next;

}return NULL;

}

Page 16: Linked list

Inserting an elementTo insert an element in the list, the first task is to

get a free node, assign the element to be inserted to the info field of the node, and then new node is placed at the appropriate position by adjusting the appropriate pointer. The insertion in the list can take place at the following positions:

• At the beginning of the list• At the end of the list• After a given element

Page 17: Linked list

Inserting an elementInsert at the beginning of the list:First test whether the linked list is initially empty, if yes,

then the element is inserted as the first and only one element by performing the following steps:

• Assign NULL value to the next pointer field of the new node

• Assign address of new node to headIf the list is not empty, then the element is inserted as the

first element of the list by performing the following steps:• Assign value of head variable to the next pointer field of

the new node.• Assign address of the new node to the head.

Page 18: Linked list

Inserting an elementInsert at the beginning of the list:Void insertatbegining(node **head,int item)

{node *ptr;ptr=(node*)malloc(sizeof(node));ptr->info=item;if(*head==NULL)

ptr->next=NULL;else

ptr->next=*head;*head=ptr;

}

Page 19: Linked list

Inserting an elementInserting at the end of the list:First test whether the linked list is initially empty, if yes,

then the element is inserted as the first and only one element by performing the following steps:

• Assign NULL value to the next pointer field of the new node

• Assign address of new node to headIf the list is not empty, then the list is traversed to reach the

last element, and then element is inserted as the last element of the list by performing the following steps:

• Assign NULL value to the next pointer field of the new node

• Assign address of the new node to the next pointer field of the last node.

Page 20: Linked list

Inserting an elementVoid insertatend(node **head, int item)

{node *ptr, *loc; ptr=(node*)malloc(sizeof(node));ptr->info=item;ptr->next=NULL;if(*head==NULL)

*head=ptr;else{

loc=*head;while (loc->next!=NULL)

loc=loc->next;loc->next=ptr;

}}

Page 21: Linked list

Inserting an elementInserting after given element:To insert the new element after the given element,

first we find the location, say loc, of the given element in the list, and then the element is inserted in the list by performing following steps:

• Assign the next pointer field of the node pointed by loc to the next pointer field of the new node.

• Assign address of the new node to the next pointer field of the node pointed by loc.

Page 22: Linked list

Inserting an elementVoid insertafterelement(node *head, int item,int after){

node *ptr, *loc;loc=search(head,after);if(loc==(node*)NULL) /*element after not found*/

return;

ptr=(node*)malloc(sizeof(node));ptr->info=item;ptr->next=loc->next;loc->next=ptr;

}

Page 23: Linked list

Deleting an element

• To delete an element from the list, first the pointer are set properly and then the memory occupied by the node to be deleted is deallocated(free).

• The deletion in the list can take place at the following positions.

1. At the beginning of the list2. At the end of the list3. After a given element

Page 24: Linked list

Deleting from the beginning of the list

An element from the beginning of the lists can be deleted by performing following steps:

• Assign the value of head ( address of the first element of the list) to a temporary variable (say ptr)

• Assign the value of the next pointer field of the first node to head.

• Deallocate the memory occupied by the node pointed to by ptr.

Page 25: Linked list

Deleting from the beginning of the list

Void deletefrombegining( node **head){

node *ptr;if(*head==NULL)

return;else{

ptr=*head;*head=(*head)->next;free(ptr);

}}

Page 26: Linked list

Deleting from the end of the listTo delete from the end of the list, we first traverse

to the second last element of the list. Then the last element can be deleted by performing following steps:

• Assign the next pointer field of the second last node to a temporary variable ( say ptr).

• Assign value NULL to the next pointer field of the second last node of the list.

• Deallocate the memory occupied by the node pointed to by ptr.

Page 27: Linked list

Deleting from the end of the listVoid deletefromend( node **head){

node *ptr,*loc;if (*head==NULL)

return;else if ((*head)->next==(node*) NULL)

{ptr=*head;*head=NULL;free(ptr);}

else{loc=*head;ptr=(*head)->next;while(ptr->next!=NULL) { loc=ptr; ptr=ptr->next; } loc->next=NULL;

free(ptr); }

}

Page 28: Linked list

Deleting after a given elementTo delete an element after a given element, first

we find the location say (loc) of the element after which the element can be deleted by performing the following steps:

• Assign next pointer field of the node pointed by the loc to temporary variable (say ptr).

• Assign the next pointer field of the node to be deleted to the node pointed to by loc

• Deallocate the memory occupied by the node pointed to by ptr.

Page 29: Linked list

Deleting after a given elementVoid deleteafterelement( node*head, int after){

node *ptr, *loc;loc=search(head,after);if(loc==(node*)NULL) /*element ‘after’ not found*/

return;ptr=loc->next;loc->next=ptr->next;free(ptr);

}

Page 30: Linked list

Deleting Entire listBefore the program terminates, the entire list must

be deletedso that the memory occupied by the nodes of the list can be used for other purposes. This task can be accomplished by performing the following steps:

• Assign the head pointer to a temporary variable, say ptr.

• Advance the head pointer to the next node.• Deallocate the memory occupied by the node

pointed to by ptr.The above steps are repeated till the entire list is

deleted.

Page 31: Linked list

Deleting Entire listVoid deletelist(node **head){

node *ptr;while(*head!=NULL){

ptr=*head;*head=(*head)->next;free(ptr);

}}

Page 32: Linked list

Doubly Linked ListIn doubly linked list, also called the two way list,

each node is divided into three parts:• The first part called, previous pointer field,

contains the address of preceding element in the list.

• The second part contains the information of the list.

• The third part, called next pointer field, contains the address of the succeeding element in the list.

In addition, two pointer variables, e.g. head and tail, are used that contains the address of first element and the address of last element of the list.

Page 33: Linked list

Doubly Linked List

head

X 1200 1201 1203 X

Next pointer field of 2nd node

Information field of second node

tail

Previous pointer field of 2nd node

Page 34: Linked list

Representation of doubly linked list

• Suppose we want to store list of integer.typedef struct nodetype

{struct nodetype *prev;int info;struct nodetype *next;

}node;node *head,*tail;The above declaration defines a new data type, whose

each element is of type nodetype and gives it name node.

Page 35: Linked list

Operation on Doubly linked lists

• Creating an empty list• Traversing a list• Searching an element• Inserting an element• Deleting an element

Page 36: Linked list

Creating an Empty list• In the previous declaration, the variable head and tail are

declared as pointer to a node data type.• These Variables are not yet given a value.• The head is used to point to the first element of the list

and tail is used to point to the last element of the list.• Since the list will be empty in the beginning, the variable

head and tail are assigned a sentinel value to indicate the list is empty.

void createemptylist(node **head, node **tail)

{*head=*tail=NULL;

}

Page 37: Linked list

Traversing a listDoubly linked list can be traversed in both way and that too very

conveniently.• In order traversal• Reverse order traversalIn order traversal:To traverse the doubly linked list, we move along the pointer, and

process each element till we reach the last element.void traverseinorder(node *head){

while(head!=NULL){

printf(“%d\n”,head->info);head=head->next;

}}

Page 38: Linked list

Traversing a listReverse order traversal:The following listing shows the various steps required for

traversing a doubly linked list in the backward direction.Void traversereverseorder(node *tail)

{if(tail!=NULL){

printf(“%d\n”,tail->info);tail=tail->prev;

}}

Page 39: Linked list

Searching an elementThe doubly linked list can be traversed in any order to

reach the given element. The following listing shows the various steps required for searching an element from the beginning.

node *search (node *head, int item){

while(head!=NULL){

if(head->info==item)return head;

head=head->next;}return NULL;

}

Page 40: Linked list

Inserting an elementTo insert an element in the list, the first task is to

get a free node, assign the element to be inserted to the info field of the node, and then new node is placed at the appropriate position by adjusting the appropriate pointer. The insertion in the list can take place at the following positions:

• At the beginning of the list• At the end of the list• After a given element• Before a given element

Page 41: Linked list

Inserting an elementInsert at the beginning of the list:First test whether the linked list is initially empty, if yes, then the

element is inserted as the first and only one element by performing the following steps:

• Assign NULL value to the next pointer and prev pointer field of the new node

• Assign address of new node to head and tail pointer variables.If the list is not empty, then the element is inserted as the first element

of the list by performing the following steps:• Assign NULL value to the prev pointer field of the new node.• Assign value of head variable (the address of the first element of the

existing list) to the next pointer field of the new node.• Assign address of the new node to prev pointer field of the node

currently pointed by head variable, i. e. first element of the existing list.

• Finally Assign address of the new node to the head variable.

Page 42: Linked list

Inserting an elementInsert at the beginning of the list:Void insertatbegining (node **head, node **tail, int item)

{node *ptr;ptr=(node*)malloc(sizeof(node));ptr->info=item;if(*head==NULL)

ptr->next=ptr->prev=NULL;*head=*tail=ptr;

else{

ptr->prev=NULL;ptr->next=*head;(*head)->prev=ptr;*head=ptr;

}}

Page 43: Linked list

Inserting an elementInserting at the end of the listFirst test whether the linked list is initially empty, if yes, then the

element is inserted as the first and only one element by performing the following steps:

• Assign NULL value to the next pointer and prev pointer field of the new node

• Assign address of new node to head and tail pointer variable.If the list is not empty, then element is inserted as the last element

of the list by performing the following steps:• Assign NULL value to the next pointer field of the new node.• Assign value of the tail variable (the address of the last element

of the existing list) to the prev pointer field of the new node.• Assign address of the new node to the next pointer field of the

node currently pointed by tail variable i.e last element of the existing list.

• Finally assign the address of the new node to tail variable.

Page 44: Linked list

Inserting an elementInsert at the end of the list:Void insertatend (node **head, node **tail, int item)

{node *ptr;ptr=(node*)malloc(sizeof(node));ptr->info=item;if(*head==NULL)

ptr->next=ptr->prev=NULL;*head=*tail=ptr;

else{

ptr->next=NULL;ptr->prev=*tail;(*tail)->next=ptr;*tail=ptr;

}}

Page 45: Linked list

Inserting an elementInserting after a given element:Void insert afterelement (node *head, node **tail, int item, int after)

{node *ptr, *loc;ptr=head;loc=search(ptr,after);if(loc==NULL)

return;ptr=(node*)malloc(sizeof(node));ptr->info=item;if(loc->next==NULL){

ptr->next=NULL;loc->next=ptr;ptr->prev=*tail;*tail=ptr;

}else{

ptr->prev=loc;ptr->next=loc->next;(loc->next)->prev=ptr;loc->next=ptr;

}}

Page 46: Linked list

Inserting an elementInserting before a given element:Void insertbeforeelement (node **head, int item, int before)

{node *ptr, *loc;ptr=*head;loc=search(ptr,before);if(loc==NULL)

return;ptr=(node*)malloc(sizeof(node));ptr->info=item;if(loc->prev==NULL){

ptr->prev=NULL;loc->prev=ptr;ptr->next=*head;*head=ptr;

}else{

ptr->prev=loc->prev;ptr->next=loc;(loc->prev)->next=ptr;loc->prev=ptr;

}}

Page 47: Linked list

Deleting an element• To delete an element from the list, first the

pointer are set properly and then the memory occupied by the node to be deleted is deallocated (freed).

• The deletion in the list can take place at the following positions.

1.At the beginning of the list2.At the end of the list3.After a given element4.Before a given element

Page 48: Linked list

Deleting an elementDeleting from the beginning of the list:An element from the beginning of the lists can be

deleted by performing following steps:• Assign the value of head ( address of the first

element of the list) to a temporary variable (say ptr)• Further there are two cases:1. If there is only one element in the existing list, both

head and tail variable are set to NULL.2. If there are more than one element in the list then

following steps are given below:– Assign NULL value to the prev pointer field of the second

node.– Assign address of the second node to head.3. Deallocate the memory occupied by the node pointed to by

ptr.

Page 49: Linked list

Deleting an elementDeleting from the beginning of the list:Void deletefrombegining( node **head, node **tail){

node *ptr;if(*head==NULL)

return;ptr=*head;if(*head==*tail) /*one element only*/

*head=*tail=NULL;else{

(ptr->next)->prev=NULL;*head=ptr->next;

}free(ptr);

}

Page 50: Linked list

Deleting an elementDeleting from the end of the list:An element from the end of the list can be deleted by

performing following steps:• Assign the value of tail ( address of the last element of

the list) to a temporary variable (say ptr)• Further there are two cases:1. If there is only one element in the existing list, both

head and tail variable are set to NULL.2. If there are more than one element in the list then

following steps are given below:– Assign NULL value to the next pointer field of the second

last node.– Assign address of the second last node to tail.3.Deallocate the memory occupied by the node pointed to by

ptr.

Page 51: Linked list

Deleting an elementDeleting from the end of the list:Void deletefromend( node **head, node **tail){

node *ptr;if(*head==NULL)

return;ptr=*tail;if(*head==*tail) /*one element only*/

*head=*tail=NULL;else{

(ptr->prev)->next=NULL;*tail=ptr->prev;

}free(ptr);

}

Page 52: Linked list

Deleting an elementDeleting after a given element:Void ideleteafterelement (node *head, node **tail, int item, int after)

{node *ptr, *loc;ptr=head;loc=search(ptr,after);if(loc==NULL)

return;else if((loc->next)->next==NULL)

{ptr=loc->next;loc->next=NULL;*tail=loc;free(ptr);}

else{ptr=loc->next;loc->next=ptr->next;(ptr->next)->prev=loc;free(ptr);}

}

Page 53: Linked list

Deleting an elementDeleting before a given element:Void ideleteafterelement (node **head, int item, int before)

{node *ptr, *loc;ptr=head;loc=search(ptr,before);if(loc==NULL)

return;else if((loc->prev)->prev==NULL)

{ptr=loc->prev;loc->prev=NULL;*head=loc;free(ptr);}

else{ptr=loc->prev;loc->prev=ptr->prev;(ptr->prev)->next=loc;free(ptr);}

}

Page 54: Linked list

Deleting entire listThe doubly linked list can be deleted either by

heading from the beginning or from the end. The list can be deleted from the beginning by performing the following steps:

• Assign the head pointer to a temporary variable, say ptr.

• Advance the head pointer to the next node.• Deallocate the memory occupied by the node

pointed to by ptr.The above steps are repeated till the entire list

is deleted. Finally the tail pointer is set to NULL value.

Page 55: Linked list

Deleting entire listVoid deletelist(node **head, node **tail){

node *ptr;while(*head!=NULL){

ptr=*head;*head=(*head)->next;free(ptr);

}*tail=NULL;

}

Page 56: Linked list

Circular Linked ListA circular list is a linear linked list, except that the

last element points to the first element. For non empty circular linked list there are no NULL pointer.

The memory declarations for representing circular linked lists are the same as for linear linked lists

Properties:• Can reach entire list from any node• Need special test for end of list• Used as buffer

Page 57: Linked list

Circular Linked List• A Circular Linked List is a special type of

Linked List• It supports traversing from the end of the list

to the beginning by making the last node point back to the head of the list.

• Circular linked lists are usually sorted• Circular linked lists are useful for playing

video and sound files in “looping” mode.• They are also a stepping stone to

implementing graphs, an important topic in computer graphics.

Page 58: Linked list

Representation of Circular linked list

Suppose we want to store the list of integer numbers, then the circular linked list can be represented in memory with the following declarations.

typedef struct nodetype{

int info;struct nodetype *next;

}node;node *head;

The above declaration define a new data type, whose each element is of type nodetype and gives it a name node.

Page 59: Linked list

Circular Linked ListAll operations performed on linear linked list can be easily

extended for circular linked lists with following exceptions:

1. While inserting new node at the end of the lists, its next pointer field is made to point to the first node.

2. While testing for the end of the lists, we compare the next pointer field with the address of the first node.

head

1201 1234 1345

Circular Linked with 3 Nodes

Page 60: Linked list

Operation on Linear linked lists

• Creating an empty list• Traversing a list• Searching an element• Inserting an element• Deleting an element

Page 61: Linked list

Header Linked List• A header list is a linked list, which

always contains a special node, called header node, at the beginning of the linked list.

• This header node usually contains vital information about the linked list such as the number of nodes in the list, whether the list is sorted or not.

Page 62: Linked list

Header Linked List

head

1234 1345 1346 X

Header Node

Page 63: Linked list

Header Linked ListTypes of header linked list:• Header linear linked list• Circular header list• Two way header list• Two way circular header list

Page 64: Linked list

Header Linked List

head

1234 1345 1346 X

Header Node

Header linear linked list

Page 65: Linked list

Header Linked List

head

1234 1345 1346

Header Node

Circular header list

Page 66: Linked list

Header Linked List

X 1200 1201 1203 X

headHeader node

Two way header list

Page 67: Linked list

Header Linked List

1200 1201 1203

headHeader node

Page 68: Linked list

Applications of linked lists• To implement the other data structures

such as stacks, queues, trees and graphs.• To maintain a directory of names.• To perform arithmetic operation on long

integers.• To manipulate polynomial.• To represent sparse matrices.

Page 69: Linked list

Polynomial ManipulationA polynomial of type

4x3+6x2+10x+6can be represented using following linked

list

4 3 6 2 10 1 6 0 X

Poly coefficient

power

In the above list, each node has the following structure

Coefficient of the term Power of x Link to the next node

Page 70: Linked list

Polynomial ManipulationThe required memory declarations for the

representation of a polynomial with integer coefficients are

typedef struct nodetype{

int coeff;int power;struct nodetype *next;

}node;node *poly;

Page 71: Linked list

Examples

a x x 3 2 114 8

b x x x 8 3 1014 10 6

3 14 2 8 1 0a

null

8 14 -3 10 10 6b

null

Polynomial Representation: Example

Page 72: Linked list

Adding Polynomials: Figure 4:19 c = a + b

4.6.2 Adding Polynomials: c = a + b

Case 1: p->exp = q->exp

3 14 2 8 1 0p

8 14 -3 10 10 6

q

11 14

a

b

c

Page 73: Linked list

Adding Polynomials : c = a + b (cont.)

Case 2: p->exp < q->exp

3 14 2 8 1 0

p

8 14 -3 10 10 6

q

11 14 -3 10

a

b

c

Page 74: Linked list

3 14 2 8 1 0

p

8 14 -3 10 10 6

q

11 14 -3 10 2 8

Case 3: p->exp > q->exp

Adding Polynomials: c = a + b (cont.)

Page 75: Linked list

Representing sparse matrices

• inadequate of sequential schemes(1) # of nonzero terms will vary after some matrix computation(2) matrix just represents intermediate results

• new scheme• Each column (row): a circular linked list with a head node

0 0 0 2 0 0

0 0 1 0 0 5

0 4 0 0 0 0

0 0 0 0 0 0

0 0 0 0 7 0

A 5X6 sparse matrices

Page 76: Linked list

Sparse MatrixThe description of this representation is as• It contains one header node that has four fields….

--#of rows--#of cols--#of non zero elements--head i.e. pointer to 1st row containing at least one non zero element.

• A linked list of rows containing at least one non zero term, in the ascending order of their row values. each node of this list has three fields --row (row number for corresponding row list)--next (pointer to next node in the row list)--first (a pointer to first column in a row having non zero item)

• A linked list of columns containing nonzero terms, in the ascending order of their column values. Each node of this list has three fields--col (column number for corresponding row list)--term ( a non zero value in column col)--link (a pointer to next column having non zero element)

Page 77: Linked list

Sparse Matrix

5 6 5

1 4 2 X

2 3 1

3 2 4 X

5 X 5 7 X

6 5 X

A linked representation of sparse matrix

Page 78: Linked list

Required memory declaration

Structure of column node:typedef struct columnnodetype{

int col;float element;struct columnnodetype *link;

}columnnode;

Page 79: Linked list

Required memory declaration

Structure of row node:typedef struct rownodetype{

int row;struct rownodetype *next;struct columnnode *first;

}rownode;

Page 80: Linked list

Required memory declaration

Structure of header node:typedef struct headernodetype{

int nrow; int ncol; int num;struct rownode *head;}headernode;

Page 81: Linked list
Page 82: Linked list
Page 83: Linked list
Page 84: Linked list
Page 85: Linked list
Page 86: Linked list
Page 87: Linked list
Page 88: Linked list
Page 89: Linked list
Page 90: Linked list
Page 91: Linked list
Page 92: Linked list
Page 93: Linked list
Page 94: Linked list

Linked list Problems1. Write a function that return value 1 if the

linear linked list is sorted in the ascending order otherwise it returns value 0.

2. Write a function that makes copies of given linear linked list.

3. Write a function that merge two sorted linear linked list.

4. Write a function that sorts a linear linked list of integer values in the descending order.

Page 95: Linked list

Josephus ProblemIt consists of a group of soldiers surrounded by a heavy

enemy force. There is only one horse to escape. Therefore, only one soldier can escape. In order to determine which soldier will escape, they form a circle and pick up a number n from a hat. A name is also picked up from the hat. They start counting clockwise around the circle from a soldier whose name is picked up from the hat. And the soldier on which count reaches n is removed from the circle. And the count again starts from the soldier who was next to the soldier who is removed from the circle. This process goes on till only one soldier is left. This soldier will take the horse and escapes. Write a program to solve this problem. Input to your program is list of names of soldiers and number n and the output should be the name of the soldier left.

Page 96: Linked list

Josephus Problem#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> struct node{

char info[25]; struct node *NEXT;

}; struct node *HEAD; struct node *TAIL; char name[25];

void myInit() { HEAD=(struct node *)

malloc(sizeof(struct node)); TAIL=(struct node *)

malloc(sizeof(struct node)); HEAD->NEXT=TAIL; TAIL->NEXT=HEAD; }

Page 97: Linked list

Josephus Problemvoid myInsert() { struct node *TEMP; TEMP=(struct

node*)malloc(sizeof(struct node));

strcpy(TEMP->info,name); TEMP->NEXT=HEAD-

>NEXT; HEAD->NEXT=TEMP; }

void myRemove() { struct node *TEMP;

TEMP=(struct node*) malloc(sizeof(struct node));

TEMP=HEAD->NEXT; HEAD->NEXT=HEAD-

>NEXT->NEXT; strcpy(name,TEMP->info); }

Page 98: Linked list

Josephus Problemvoid main() { clrscr(); int numSol, counter; myInit(); printf("Enter the number of

soldier: "); scanf("%d",&numSol); for(int i=1;i<=numSol; i++) {

printf("Pls. Type a Name: ");

scanf("%s",&name); myInsert(); } printf("Value for Counter: "); scanf("%d",&counter); for(int j=1;j<=numSol;j++) { for(int k=1;k<=counter;k++) {

myRemove(); if(k==counter){ puts(name); getch();

} } } }