• UNIT2: COMPLEX DATA STRUCTURE AND ALGORITHM


    INTRODUCTORY ACTIVITY

    Read the following scenario and after answer questions:

    In a bank, a Teller has the role of serving the clients. He/she has to organize the
    banknotes of same values together and coins of same values together that he/she has
    to serve to clients. When a client arrives in the bank, he/she chooses a line to join in the
    front of a Teller and the line is formed according to the arrival of clients.

    Mr. KARENZI wants to pay 78450 Rwf as his school fees to the bank and he must
    organize banknotes and coins before deposit money to facilitate the teller to not mix
    the banknotes and coins


    Answer the following questions:

    1. Observe the above figure and describe what you see;

    2. Where a new arrived client will line up?

    3. Using the above figure who is going to be served first by the teller 1 or 2;

    4. Discuss how KARENZI is going to organize bank notes and coins before
         depositing;

    5. Discuss how the teller is going to keep money deposited by Karenzi

    2.1. Introduction to Data Structures

    Data Structure is a way of collecting and organizing data in such a way that we
    can perform operations on these data in an effective way. Data Structures is about
    rendering data elements in terms of some relationship, for better organization and
    storage.

    Example: Library is composed of elements (books) to access a particular book
    requires knowledge of the arrangement of the books.

    2.1.1. Basic types of Data Structures

    Anything that can store data can be called as a data structure, hence Integer,
    Float, Boolean, Char etc., all are data structures. They are known as Primitive Data
    Structures. And we also have some complex Data Structures, which are used to store
    large and connected data and are called non primitive data structure or Abstract
    Data Structure.


    Example: Array, Linked List, Tree, Graph, Stack, Queue etc.
    All these data structures allow us to perform different operations on data. We select
    these data structures based on which type of operation is required.

     2.1.2. Importance of data structures

    The data structures have the following importance for programming:

    • Data structures study how data are stored in a computer so that operations
       can be implemented efficiently

    • Data structures are especially important when there is a large amount of
       information to deal with.

    • Data structures are conceptual and concrete ways to organize data for efficient
       storage and manipulation

    2.1.3. Data Structure Operations

    Beside the simple operations performed on data (unary operators, binary operators and
    precedence operators) seen in Senior Four, the data appearing in our data structures are
    processed by means of other operations. The following are some of the most frequently
    used operations.

    Traversing: Accessing each record exactly once so that certain items in the record may be
                         processed.

    Searching: Finding the location of the record with a given key value or finding
        the locations of all records which satisfy one or more conditions

    • Inserting: Adding a new record to the structure.

    Deleting: Removing a record from the structure.

    Sorting: Arranging the records in some logical order (e.g., in numerical order
       according to some NUMBER key, such as social security number or account number).

    Merging: Combining the records of two different sorted lists into a single sorted list.

    It is important for every Computer Science student to understand the concept of
    Information and how it is organized or how it can be utilized.

    If we arrange some data in appropriate sequence, then it forms a Structure and gives us
    a meaning. This meaning is called information. The basic unit of information in computer
    Science is a bit, binary digit. So we found two things in information: One is Data and the
    other is Structure

    2.2 Array of elements in data structure

    LEARNING ACTIVITY 2.1.

    Study the following table

    Answer the following questions.

    1. Suggest a name for the above table?

    2. How many rows and columns in the above table?

    3. Identify the location of the value 95 in the above table?

    Arrays hold a series of data elements, usually of the same size and data type.
    Individual elements are accessed by their position in the array. The position is given
    by an index, which is also called a subscript. The index usually uses a consecutive
    range of integers, (as opposed to an associative array) but the index can have any
    ordinal set of values

    Some arrays are multi-dimensional, meaning they are indexed by a fixed number of
    integers, for example by a tuple of four integers. Generally, one- and two-dimensional
    arrays are the most common. Most programming languages have a built-in array
    data type.

    In computer programming, a group of homogeneous elements of a specific data
    type is known as an array, one of the simplest data structures.

    2.2.1. Arrays dimensions:

    A dimension of array is a direction in which you can vary the specification of an
    array›s elements. An array can be of one or many dimensions.

    a. One-dimensional array.

    Example: a [3]

    It is an array called a with 3 elements. The elements of the array are logically
    represented by the name of the array with in brackets its index or positions. For the
    one dimensional array a with 3 elements, elements are written like a[0], a[1] and
    a[2]. The indexes start always by 0. Graphically, it is

    b. Multi-dimensional arrays
        Example:

             Two dimensional array ex: a[2][7]as Integer
            Three dimensional array ex: a[3][2][5]as Integer

    2.2.2. Two dimensional array

    A Two dimensional Array is a collection of a fixed number of elements (components)
    of the same type arranged in two dimensions.

    The two dimensional array is also called a matrix or a table. The intersection of a
    column and a row is called a cell. The numbering of rows and columns starts by 0

    Example:
    The array a[3][4] is an array of 3 rows and 4 columns. In matrix representation, it
    looks like the following:
    a[i][j] means that it is an element located at the intersection of row i and column j.
    Each element is identified by its row and column

    2.2.3. Two dimensional array declaration

    The syntax for declaring a two-dimensional array is:
    SET Array name=Array
    of Data type

    Where row size and column size are expressions yielding positive integer values,
    the two expressions row size and column size specify the number of rows and the
    number of columns, respectively, in the array.

    Examples:

    1. SET a=Array[2][7] of Integer

    2. SET b=Array[4][3] of Integer

    Notice that the number of elements =row size*column size

    The examples above defines respectively arrays named a and b with 14 (2*7) elements
    and 12 (4*3) elements. The expression marks [0] [0] will access the first element of
    the matrix marks and marks [1] [6] will access the last row and last column of array a.

    If the array marks if filled with the elements 80, 75, 76, 75, 55, 70, 55, 70, 65, 85, 35
    and 59, we get the following table.

    2.2.4. Two dimensional array initialization

    When a two-dimension array has been declared, it needs to be assigned values for
    its elements. This action of assigning values to array elements is called initialization.
    Two-Dimensional array is initialized by specifying bracketed values for each row. For
    the case of array of integers, the default values of each element is 0 while for others
    the default values for other types is not known.

    For the case of an array of 3 rows and 4 columns, if the name is A and the type of
    elements is integer, the initialization is:

    int A[3][4]={{A[0][0], A[0][1], A[0][2], A[0][3]}, /* initializers for row indexed by 0 */
    {A[1][0], A[1][1], A[1][2], A[1][3]}, /* initializers for row indexed by 1*/
    {A[2][0], A[2][1], A[2][2], A[2][3]} /* initializers for row indexed by 2 */
    };

    The nested braces, which indicate the intended row, are optional. The following
    initialization is equivalent to the previous initialization.

    Int A[3][4]={A[0][0], A[0][1], A[0][2], A[0][3], A[1][0], A[1][1], A[1][2], A[1][3], A[2][0],
    A[2][1], A[2][2], A[2][3]};

    An example of marks for 3 students in 4 courses. The array will look like this:
    If the table is called marks, marks [1][3]=15; where the row position is 1 and the
    column position is 3.

    The expression marks [0] [0] will access the first element of the matrix marks and
    marks [2] [3] will access the last row and last column.

    Syntax to initializing two-dimensional arrays

    The two dimensional array marks which will hold 12 elements can be initialized like:

    BEGIN
    SET marks=Array[3] [4] of Integer
    marks[0][0]=18
    marks[0][1]=16
    marks[0][2]=14
    marks[0][3]=19
    marks[1][0]=10
    marks[1][1]=20
    marks[1][2]=12
    marks[1][3]=15
    marks[2][0]=15
    marks[2][1]=17
    marks[2][2]=18
    marks[2][3]=16

     END

    APPLICATION ACTIVITY 2.1.

    1. Four secondary schools in RUHANGO District are displaying the number
       of students per year that they registered in 2015, 2016, 2017 and 2018.

    a. How many rows and columns will be in the table that contains the
        displayed data?

    b. Declare an array called population to contain the needed data.

    c. Initialize the array population with numbers of your choice.

    2. Given below the case of array a:

    a[0][0]     1      a[1][0] 54

    a[0][1]     2       a[1][1] 23

    a[0][2]      3       a[1][2] 11

    a[0][3]     13          a[1][3] 45

    a[0][4]     17          a[1][4] 31

    a[0][5 ]    34          a[1][5] 65

    a[0][6]     19              a[1][6] 26

    a. Give the size of the above array;

    b. Declare array a;

    c. Initialize the above array.

    2.2.5. Accessing two dimensional array elements

    LEARNING ACTIVITY 2.2.

    What do the following statements mean:

    WRITE marks[1][2] ;
    What are the meanings of the above statements

    • Reading (storing) two dimensional array elements

    There exist two ways of accessing the elements of an array. The elements’
    values of the array can come from the input devices or from a given file so that
    these elements are written into the array. The function used is READ or other
    versions of it, depending on the programming languages used for programs
    writing.

    For example READ marks[1][2] stores a value in second row, third column
    location of the array marks.

    To store multiple values into array you must use a FOR loop.

    Syntax:
    FOR i=initial value TO upperlimit DO
    FOR j=initial value TO upperlimit DO
    READ array name[i][j]i=i+1
    j=j+1
    END FOR
    END FOR
    Where i refers to the row position and j refers to the column position.

    Initial value=lower limit

    Example: Write an algorithm of a program that allows the user to enter (store) two
    dimensional array elements
    BEGIN
    SET marks=Array [3] [8] of Integer
    Use variable i as integer
    Use variable j as integer
    FOR i=0 TO 2 DO
    FOR j=0 TO 7 DO
    READ marks[i] [j]i=i+1
    j=j+1


    END FOR
    END FOR
    END


    Writing (displaying) two dimensional array elements

    To access two dimensional array elements’ values, we can also take the elements’
    values of an array residing in the memory of the computer and write them in any
    output device or a given file.

    To write (display) elements from an array in an output device or other file, use a
    WRITE function or other versions of it depending on the programming languages
    used for programs writing together with the array name and location (index) of the
    element. In that case the elements of a two dimensional array can be displayed by
    the following syntax:

             WRITE Array name [i][j]

    Where i refers to the row position and j refers to the column position.

    To display a single value of an array you must provide the array name and index to
    write operation example:

    Example for writing on screen a two dimensional array element
    WRITE a[1][2], i=1 and j=2).

    Example: Write an algorithm of a program that displays stored two dimensional
    array marks’ elements
    BEGIN
    SET a=Array[3][8] of integer
    Use variable i As integer
    Use variable j As integer
    WRITE “stored two dimensional array elements are:”
    FOR i=0 to 2DO
    FOR j=0 to 7DO
    WRITE a[i][j]i=i+1
    j= j+1
    END FOR
    END FOR
    END

    Algorithm for reading and printing values in arrays

    Example: Write an algorithm that allows the user to enter(store) two dimensional
                   array elements and displays those stored elements.



    APPLICATION ACTIVITY 2.2.

    1. Write an algorithm to do the following operations on a two dimensional
         array A of size m x n.

    • Declare the array A;

    • Read the element ‘values into matrix of size m x n

    • Output the elements’ values of matrix of size m x n on the screen;

    • Calculate the sum of all elements’ values of matrix of size m x n;

    • Write a programme in C++ Language where you apply the above questions

    2. Write an algorithm that allows a user to input data through input device
        and display the smallest element’ s value on the screen.

    3. Write a programme in C++ language that implements the above
        algorithm.

    4. Consider a 2 by 3 array T

    a. Write a declaration of T

    b. How many rows does T have?

    c. How many columns does T have?

    d. How many elements does T have?

    e. Write name of elements in second row

    f. Write the name of element in third column

    g. Write a single statement that sets the elements of T in row 1and column 2
        to zero

    h. Write a statement that inputs the values of T from keyboard

    i. Write a statement that displays the elements of first row of T

    2.3. ABSTRACT DATA STRUCTURE

    LEARNING ACTIVITY 2.3



    1. Observe and analyze the above figure

    2. Explain different procedures that you can use to arrange the above books.

    2.3.1. Definition of Abstract Data type in data structure.

    Abstract Data structure is a mathematical model of a data structure that specifies the
    type of data stored, the operations supported on them and the types of parameters
    of the operations with no implementation. Each program language has its own way
    to implement abstract data type.

    2.3.2 Importance of abstract data type in data structures

    • Data structures study how data are stored in a computer so that operations
    can be implemented efficiently;

    • Abstract Data structures are especially important when you have a large
       amount of information;

    • Conceptual and concrete ways to organize data for efficient storage and
       manipulation

    2.3.3. Abstract Data type Operations

    The data appearing in our data structures are processed by means of certain
     operations. Following are some of the most frequently used operations.

    • Searching: Finding the location of the record with a given key value or finding
      the locations of all records which satisfy one or more conditions;

    • Sorting: Arranging the records in some logical order .

    2.4. List

    2.4.1. Introduction

    A list is a collection of data in which each element of the list contains the location of
    the next element.

    In a list, each element contains two parts: data and link to the next element. The data
    parts of the list hold the value information and data to be processed. The link part
    of the list is used to chain the data together and contains a pointer (an address) that
    identifies the next element in the list.
    In the list you can do the following operations:

    LIST: Creates an empty list;

    INSERT: inserts an element in the list;

    DELETE: deletes an element from the list;

    RETRIEVE: retrieves an element from the list;

    TRAVERSE: traverses the list sequentially;

    EMPTY: checks the status of the list.

    Example of a list:

    A bank has 10 branches created one after another at different dates. The Bank
    Inspector who wants to visit all of them can follow the order of their creation. He/
    she will be informed only about the name and location of the first branch. When he
    reaches that branch, the Branch Manager will tell him/her the address of the next
    branch, and so one.

    After visiting all branches, the Bank Inspector will realize that he/she has a list of the
    bank branches.

    Graphically, it will be represented like a list where each branch is considered as a
    node containing the names of the branch and the address of the next branch.

    Difference between Arrays and Lists

    A list is an ordered set of data. It is often used to store objects that are to be processed
    sequentially.

    An array is an indexed set of variables, such as dancer [1], dancer [2], dancer [3] It is
    like a set of boxes that hold things. A list is a set of items. An array is a set of variables
    that each store an item.

    In a list, the missing spot is filled in when something is deleted. While in an array, an
    empty variable is left behind when something is deleted.Simply a list is a sequence
    of data, and linked list is a sequence of data linked with each other.

      2.4.2 Linked list

    This is a dynamic table/ data structure used to hold a sequence. Its characteristics
     are the following:

    • Items forming a sequence are not necessarily held in contiguous data location
       or in the order in which they occur in the sequence.

    • Each item in the list is called a node and contains an information field and a
       new address field called a link or pointer field.

    • Information field holds actual data for list item; link field contains the address
      of the next item.

    • The link field in the last item indicates that there are not further items. E.g. has
       a value of 0.

    • Associated with the list is a pointer variable which points to the first node in
       the list.

    • We use linked list in linking files, for example, in a hard disk.

    • It can grow or shrink in size during execution of a program.

    • It can be made just as long as required

    • It does not waste memory space.

    Linked list is classified into three types as shown below:
     
       • Single linked lists

      • Double linked lists
     
      • Circular linked list

    1. Single linked lists

    Single linked list is a sequence of elements in which every element has link to its
    next element in the sequence. In any single linked list, the individual element is
    called as “Node”. Every “Node” contains two fields, data and next. The data field is
    used to store actual value of that node and next field is used to store the address of
    the next node in the sequence




    In a single linked list, the address of the first node is always stored in a reference node
    known as “front” (Sometimes it is also known as “head”).Always next part (reference part) of the last node  must be NULL


    Algorithm in Single Linked List

    Creating and read an element in a NODE
    BEGIN
    struct node{
    int info
    struct node next
    } head, current, temp
    head=null
    temp=null
    current=null
    Begin sub
    Step 1 Read the element into x
    Step 2 Create a temp node in the memory
    temp =(struct node )sizeof (node)
    Step 3 Assign the values in temp node as follows
    temp -> info =x
    temp ->next=null
    End sub
    END

    Inserting at Specific location in the list (After a Node)
    We can use the following steps to insert a new node after a node in the single linked list

    • Step 1: Create a newNode with given value.

    • Step 2: Check whether list is Empty (head == NULL)

    • Step 3: If it is Empty then, set newNode => next = NULL and head = newNode.

    • Step 4: If it is Not Empty then, define a node pointer temp and initialize with head.

    • Step 5: Keep moving the temp to its next node until it reaches to the node

    after which we want to insert the newNode (until temp1 => data is equal to
    location, here location is the node value after which we want to insert the
    newNode).

    • Step 6: Every time check whether temp is reached to last node or not. If it
       is reached to last node then display ‘Given node is not found in the list!!!
       Insertion not possible!!!’ and termin ate the function. Otherwise move the
      temp to next node.

    • Step 7: Finally, Set ‘newNode => next = temp => next’ and ‘temp => next = newNode’

       Deleting a Specific Node from the list

    We can use the following steps to delete a specific node from a single linked list

    • Step 1: Check whether list is Empty (head == NULL)

    • Step 2: If it is Empty then, display ‘List is Empty!!! Deletion is not possible’ and
         terminate the function.

    • Step 3: If it is Not Empty then, define two Node pointers ‘temp1’ and ‘temp2’
        and initialize ‘temp1’ with head.

    • Step 4: Keep moving the temp1 until it reaches to the exact node to be deleted
      or to the last node. And every time set ‘temp2 = temp1’ before moving the
     ‘temp1’ to its next node.

    • Step 5: If it is reached to the last node then display ‘Given node not found in
       the list! Deletion not possible!!!’ And terminate the function.

    • Step 6: If it is reached to the exact node which we want to delete, then check
       whether list is having only one node or not

    • Step 7: If list has only one node and that is the node to be deleted, then set
       head = NULL and delete temp1 (free (temp1)).

    • Step 8: If list contains multiple nodes, then check whether temp1 is the first
       node in the list (temp1 == head).

    • Step 9: If temp1 is the first node then move the head to the next node (head =
       head => next) and delete temp1.

    • Step 10: If temp1 is not first node then check whether it is last node in the list
       (temp1=> next == NULL).

    • Step 11: If temp1 is last node then set temp2 => next = NULL and delete
      temp1 (free (temp1)).

    • Step 12: If temp1 is not first node and not last node then set temp2 => next =
       temp1=> next and delete temp1 (free (temp1)).

    Displaying a Single Linked List

    We can use the following steps to display the elements of a single linked list

    • Step 1: Check whether list is Empty (head == NULL)

    • Step 2: If it is Empty then, display ‘List is Empty!!!’ and terminate the function.

    • Step 3: If it is Not Empty then, define a Node pointer ‘temp’ and initialize with
       head.

    • Step 4: Keep displaying temp=> data with an arrow (->) until temp reaches to
       the last node

    • Step 5: Finally display temp => data with arrow pointing to NULL (temp =>
       data -> NULL).
     
    2. Double linked lists

    Double linked list is a sequence of elements in which every element has links to its
    previous element and next element in the sequence. So, we can traverse forward by
    using next field and can traverse backward by using previous field. Every node in a
    double linked list contains three fields and they are shown in the following figure

    Algorithm in Double Linked List

    Inserting at Specific location in the list (After a Node)

    We can use the following steps to insert a new node after a node in the double
    linked list

    • Step 1: Create a newNode with given value.

    • Step 2: Check whether list is Empty (head == NULL)

    • Step 3: If it is Empty then, assign NULL to newNode => previous&newNode =>
                next and newNode to head.

    • Step 4: If it is not Empty then, define two node pointers temp1&temp2 and initialize temp1 with head.

    • Step 5: Keep moving the temp1 to its next node until it reaches to the node
      after which we want to insert the newNode (until temp1 => data is equal to
      location, here location is the node value after which we want to insert the newNode).

    • Step 6: Every time check whether temp1 is reached to the last node. If it is
       reached to the last node then display ‘Given node is not found in the list!!!
       Insertion not possible!!!’ and terminate the function. Otherwise move the
        temp1 to next node.

    • Step 7: Assign temp1 => next to temp2, newNode to temp1=> next, temp1
       to newNode => previous, temp2 to newNode => next and newNode to temp2
        => previous.

    Deleting a Specific Node from the list

    We can use the following steps to delete a specific node from the double linked list

    • Step 1: Check whether list is Empty (head == NULL)

    • Step 2: If it is Empty then, display ‘List is Empty!!! Deletion is not possible’ and
                 terminate the function.

    • Step 3: If it is not Empty, then define a Node pointer ‘temp’ and initialize with head.

    • Step 4: Keep moving the temp until it reaches to the exact node to be deleted
        or to the last node.

    • Step 5: If it is reached to the last node, then display ‘Given node not found in
      the list! Deletion not possible!!!’ and terminate the fuction.

    • Step 6: If it is reached to the exact node which we want to delete, then check
       whether list is having only one node or not

    • Step 7: If list has only one node and that is the node which is to be deleted
       then set head to NULL and delete temp (free(temp)).

    • Step 8: If list contains multiple nodes, then check whether temp is the first
       node in the list (temp == head).

    • Step 9: If temp is the first node, then move the head to the next node (head =
       head => next), set head of previous to NULL (head => previous = NULL) and
        delete temp.

    • Step 10: If temp is not the first node, then check whether it is the last node in
       the list (temp => next == NULL).

    • Step 11: If temp is the last node then set temp of previous of next to NULL
    (temp => previous => next = NULL) and delete temp (free(temp)).

    • Step 12: If temp is not the first node and not the last node, then set temp of
       previous of next to temp of next (temp => previous => next = temp => next),
       temp of next of previous to temp of previous (temp => next => previous =
       temp => previous) and delete temp (free(temp)).

    Displaying a Double Linked List

    We can use the following steps to display the elements of a double linked list

    Step 1: Check whether list is Empty (head == NULL)

    Step 2: If it is Empty, then display ‘List is Empty!!!’ and terminate the function.

    Step 3: If it is not Empty, then define a Node pointer ‘temp’ and initialize with
       head.

    Step 4: Display ‘NULL <= ‘.

    Step 5: Keep displaying temp → data with an arrow (↔) until temp reaches to
       the last node

    • Step 6: Finally, display temp → data with arrow pointing to NULL (temp → data ---> NULL).

    3. Circular Linked List

    In circular linked list, every node points to its next node in the sequence but the last
    node points to the first node in the list

    Algorithm in Circular Linked List

    Inserting at Specific location in the list (After a Node)

    We can use the following steps to insert a new node after a node in the circular
    linked list...

    • Step 1: Create a newNode with given value.

    • Step 2: Check whether list is Empty (head == NULL)

    • Step 3: If it is Empty then, set head = newNode and newNode → next = head.

    • Step 4: If it is Not Empty then, define a node pointer temp and initialize with head.

    • Step 5: Keep moving the temp to its next node until it reaches to the node
      after which we want to insert the newNode (until temp1 → data is equal to
     location, here location is the node value after which we want to insert the newNode).

    • Step 6: Every time check whether temp is reached to the last node or not. If
       it is reached to last node then display ‘Given node is not found in the list!!!
      Insertion not possible!!!’ and terminate the function. Otherwise move the
      temp to next node.

    • Step 7: If temp is reached to the exact node after which we want to insert the
       newNode then check whether it is last node (temp → next == head).

    • Step 8: If temp is last node then set temp → next = newNode and newNode
    → next = head.

    • Step 8: If temp is not last node then set newNode → next = temp → next
      and temp → next = newNode.

    Deleting a Specific Node from the list

    We can use the following steps to delete a specific node from the circular linked list...

    Step 1: Check whether list is Empty (head == NULL)

    Step 2: If it is Empty then, display ‘List is Empty!!! Deletion is not possible’
      and terminate the function.

    Step 3: If it is Not Empty then, define two Node pointers ‘temp1’ and ‘temp2
      and initialize ‘temp1’ with head.

    Step 4: Keep moving the temp1 until it reaches to the exact node to be deleted
      or to the last node. And every time set ‘temp2 = temp1’ before moving the
      ‘temp1’ to its next node.

    Step 5: If it is reached to the last node then display ‘Given node not found in
      the list! Deletion not possible!!!’
    . And terminate the function.

    Step 6: If it is reached to the exact node which we want to delete, then check
       whether list is having only one node (temp1 → next == head)

    Step 7: If list has only one node and that is the node to be deleted then set
       head = NULL and delete temp1 (free(temp1)).

    Step 8: If list contains multiple nodes then check whether temp1 is the first
      node in the list (temp1 == head).

    Step 9: If temp1 is the first node then set temp2 = head and keep moving
       temp2 to its next node until temp2 reaches to the last node. Then set head =
       head → next, temp2 → next = head and delete temp1.

    Step 10: If temp1 is not first node then check whether it is last node in the list

    (temp1 → next == head).

    Step 11: If temp1 is last node then set temp2 → next = head and delete
    temp1 (free (temp1)).

    Step 12: If temp1 is not first node and not last node then set temp2 → next
    = temp1 → next and delete temp1 (free (temp1)).

    Displaying a circular Linked List

    We can use the following steps to display the elements of a circular linked list

    Step 1: Check whether list is Empty (head == NULL)

    Step 2: If it is Empty, then display ‘List is Empty!!!’ and terminate the function.

    Step 3: If it is Not Empty then, define a Node pointer ‘temp’ and initialize with
                 head.

    Step 4: Keep displaying temp → data with an arrow (--->) until temp reaches
       to the last node

    • Step 5: Finally display temp → data with arrow pointing to head → data.

    2.5. Queue

    A queue is a linear list in which data can only be inserted at one end, called the REAR,
    and deleted from the other end, called the FRONT. These restrictions ensure that the
    data is processed through the queue in the order in which it is received. In an other
    words, a queue is a structure in which whatever goes fist comes out first (first in,
    first out(FIFO) structure).



    2.5.1 Types of queues

    There exist two types of queues:

    • Linear queue

    • Circular queue

    a. Linear Queue

    Queue data structure is a linear data structure in which the operations
    are performed based on FIFO principle. Queue Operations using Array
    before we implement actual operations, first follow the below steps to create an
    empty queue.

    Step 1: Include all the header files which are used in the program and define
      a constant ‘SIZE’ with specific value.

    Step 2: Declare all the user defined functions which are used in queue
        implementation.

    Step 3: Create a one dimensional array with above defined SIZE (int queue[SIZE])

    Step 4: Define two integer variables ‘front’ and ‘rear’ and initialize both with
        ‘-1’. (int front = -1, rear = -1)

    • Step 5: Then implement main method by displaying menu of operations list
     and make suitable function calls to perform operation selected by the user on
      queue.

    enQueue(value) - Inserting value into the queue


    • Step 1: Check whether queue is FULL. (rear == SIZE-1)

    • Step 2: If it is FULL, then display “Queue is FULL!!! Insertion is not possible!!!””
       and terminate the function.

    • Step 3: If it is NOT FULL, then increment rear value by one (rear++) and set
      queue [rear] = value.

    deQueue() - Deleting a value from the Queue

    • Step 1: Check whether queue is EMPTY. (front == rear)

    • Step 2: If it is EMPTY, then display “Queue is EMPTY!!! Deletion is not possible!!!”
       and terminate the function.

    • Step 3: If it is NOT EMPTY, then increment the front value by one (front ++).
      Then display queue[front] as deleted element. Then check whether both front
       and rear are equal (front == rear), if it TRUE, then set both front and rear to ‘-1’
       (front = rear = -1).

    display() - Displays the elements of a Queue

    We can use the following steps to display the elements of a queue

    Step 1: Check whether queue is EMPTY. (front == rear)

    • Step 2: If it is EMPTY, then display “Queue is EMPTY!!!” and terminate the
      function.

    Step 3: If it is NOT EMPTY, then define an integer variable ‘I’ and set ‘i = front+1’.

    Step 3: Display ‘queue[i]’ value and increment ‘I’ value by one (i++). Repeat
       the same until ‘I’ value is equal to rear (i<= rear)

    b. Circular Queue

    Circular Queue is a linear data structure in which the operations are performed
    based on FIFO (First In First Out) principle and the last position is connected back to
    the first position to make a circle.

    Circular Queue Operation

    To implement a circular queue data structure using array, we first create it.

    Step 1: Include all the header files which are used in the program and define a
       constant ‘SIZE’ with specific value.

    Step 2: Declare all user defined functions used in circular queue implementation.

    Step 3: Create a one dimensional array with above defined SIZE (int cQueue[SIZE])

    Step 4: Define two integer variables ‘front’ and ‘rear’ and initialize both with ‘-1’. (int
       front = -1, rear = -1)

    Step 5: Implement main method by displaying menu of operations list and make
      suitable function calls to perform operation selected by the user on circular queue.

    enQueue(value) - Inserting value into the Circular Queue

    • Step 1: Check whether queue is FULL. ((rear == SIZE-1 && front == 0) || (front ==
       rear+1))

    • Step 2: If it is FULL, then display “Queue is FULL!!! Insertion is not possible!!!” and
       terminate the function.

    • Step 3: If it is NOT FULL, then check rear == SIZE - 1 && front != 0 if it is TRUE, then
       set rear = -1.

    • Step 4: Increment rear value by one (rear++), set queue[rear] = value and check
    ‹front == -1’ if it is TRUE, then set front = 0.

    deQueue() - Deleting a value from the Circular Queue

    Step 1: Check whether queue is EMPTY. (front == -1 && rear == -1)

    Step 2: If it is EMPTY, then display “Queue is EMPTY!!! Deletion is not possible!!!” and
       terminate the function.

    • Step 3: If it is NOT EMPTY, then display queue[front] as deleted element and
       increment the front value by one (front ++). Then check whether front == SIZE, if it
       is TRUE, then set ‘front = 0’. Then check whether both ‘front – 1’ and rear are equal
       (front -1 == rear), if it TRUE, then set both front and rear to ‘-1’ (front = rear = -1).

    display () - Displays the elements of a Circular Queue

    Step 1: Check whether queue is EMPTY. (front == -1)

    Step 2: If it is EMPTY, then display “Queue is EMPTY!!!” and terminate the function.

    Step 3: If it is NOT EMPTY, then define an integer variable ‘i’ and set ‘i = front’.

    Step 4: Check whether ‘front <= rear’, if it is TRUE, then display ‘queue[i]’ value and
       increment ‘I’ value by one (i++). Repeat the same until ‘i <= rear’ becomes FALSE.

    Step 5: If ‘front <= rear’ is FALSE, then display ‘queue[i]’ value and increment ‘I’ value
       by one (i++). Repeat the same until ‘i <= SIZE – 1’ becomes FALSE.

    Step 6: Set i to 0.

    Step 7: Again display ‘cQueue[i]’ value and increment i value by one (i++). Repeat
       the same until ‘i <= rear’ becomes FALSE.

    2.5.2 Queue operations

    There are three main operations related to queues.

    Enqueue: the enqueue operation inserts an items at the rear of the queue

    Dequeue: the dequeue operation deletes the item at the front of the queue

    Display: show elements in the array

       2.6 Stack

    A stack is a restricted linear list in which all additions and deletions are made at one
    end, the top. If we insert a series of data items into a stack and then remove them,
    the order of the data is reversed. Data input as 5, 10, 15, 20, for example would be
    removed as 20, 15, 10, and 5. This reversing attribute is why stacks are known as Last
    in, First out (LIFO) data structures.

    We use many different types of stacks in our daily lives. We often talk of a stack of
    coins, stack of books on a table and stack of plates in a kitchen. Any situation in which

    we can only add or remove an object at the top is a stack. If we want to remove an
    object other than the one at the top, we must first remove all objects above it. The
    following charts illustrates cases of stack

    A Stack is a Last in First out (LIFO) dynamic table or data structure. It has the following
    characteristics:

    • List of the same kind of elements;

    • Addition and deletion of elements occur only at one end, called the top of the
      stack;

    • Computers use stacks to implement method calls;

    • Stacks are also used to convert recursive algorithms into non recursive
      algorithm.

    2.6.1 Operations performed on stacks

    The different operations performed on stacks are as follows:

    Push: adds an element to the stack

    Pop: removes an element from the stack

    Peek: display at top element of the stack

    Stack Operations using Array

    Before implementing actual operations, first follow the below steps to create an
    empty stack.

    Step 1: Include all the header files which are used in the program and define a
    constant ‘SIZE’ with specific value.

    Step 2: Declare all the functions used in stack implementation.

    Step 3: Create a one dimensional array with fixed size (int stack[SIZE])

    Step 4: Define a integer variable ‘top’ and initialize with ‘-1’. (int top = -1)

    • Step 5: In main method display menu with list of operations and make suitable
      function calls to perform operation selected by the user on the stack.

    push(value) - Inserting value into the stack

    Step 1: Check whether stack is FULL. (top == SIZE-1)

    Step 2: If it is FULL, then display “Stack is FULL!!! Insertion is not possible!!!” and
      terminate the function.

    Step 3: If it is NOT FULL, then increment top value by one (top++) and set stack [top]  to value (stack[top] = value).

    pop() - Delete a value from the Stack

    Step 1: Check whether stack is EMPTY. (top == -1)

    Step 2: If it is EMPTY, then display “Stack is EMPTY!!! Deletion is not possible!!!’” and
      terminate the function.

    Step 3: If it is NOT EMPTY, then delete stack [top] and decrement top value by
       one(top-).

    Display() - Displays the elements of a Stack

    Step 1: Check whether stack is EMPTY. (top == -1)

    Step 2: If it is EMPTY, then display “Stack is EMPTY!!!” and terminate the function.

    Step 3: If it is NOT EMPTY, then define a variable ‘I’ and initialize with top.
      Display stack[i] value and decrement i value by one (i--).

    • Step 3: Repeat above step until i value becomes ‘0’.

      2.6.2 Stack exceptions

    Adding an element to a full stack and removing an element from an empty stack
    would generate errors or exceptions:

    Stack overflow exception: it occurs if you try to add an item to stack or queue
      which is already full.

    Stack underflow exception: it occurs if you try to remove an item from an
    empty queue or stack.

    Notec 1: Stack and Queue data structures can be implement in two ways: By using
    array or by using linked list.

    Notice 2: When stack or Queue is implemented using array, that stack or Queue can
    organize only a limited number of elements. When stack or Queue is implemented
    using linked list, that stack or Queue can organize an unlimited number of elements.

       2.7 Tree

    In linear data structure, data is organized in sequential order and in non-linear data
    structure; data is organized in random order. Tree is a very popular data structure
    used in wide range of applications. A tree data structure can be defined as follows.

    In a tree data structure, if we have N number of nodes then we can have a maximum
    of N-1 number of links.

    Tree data structure is a collection of data (Node) which is organized in hierarchical
    structure and this is a recursive definition.

    Example


    2.7.1 Tree Terminology

    In a tree data structure, we use the following terminology:

    a. Root

    In a tree data structure, the first node is called as Root Node. Every tree must have
    root node..



       b. Edge

    In a tree data structure, the connecting link between any two nodes is called an Edge.
    In a tree with ‘N’ number of nodes there will be a maximum of ‘N-1’ number of edges.

    c. Parent

    In a tree data structure, the node which is predecessor of any node is called a
    PARENT NODE. In simple words, the node which has branch from it to any other
    node is called as parent node.
          d. Child

    In a tree data structure, the node which is descendant of any node is called a CHILD
    Node. In a tree, any parent node can have any number of child nodes. In a tree, all
    the nodes except root are child nodes.

         e. Siblings
    In a tree data structure, nodes which belong to same Parent are called SIBLINGS.

    In a tree data structure, the node which does not have a child is called a LEAF Node.
    In a tree data structure, the leaf nodes are also called a External Nodes or Terminal
    node.

               g. Internal Nods

    In a tree data structure, the node which has at least one child is called INTERNAL Node.
    In a tree data structure, nodes other than leaf nodes are called Internal Nodes. The
    root node is also said to be Internal Node if the tree has more than one node. Internal
    nodes are also called as ‹Non-Terminal’ nodes.


          h. Degree

    In a tree data structure, the total number of children of a node is called as DEGREE of
    that Node. In simple words, the Degree of a node is total number of children it has. The
    highest degree of a node among all the nodes in a tree is called as ‹Degree of Tree’

         i. Level

    In a tree data structure, the root node is said to be at Level 0 and the children of root
    node are at Level 1 and the children of the nodes which are at Level 1 will be at Level
    2 and so on... In simple words, in a tree each step from top to bottom is called as a
    Level and the Level count starts with ‘0’ and incremented by one at each level (Step).



          j. Height

    In a tree data structure, the total number of edges from leaf node to a particular
    node in the longest path is called as HEIGHT of that Node. In a tree, height of the root
    node is said to be height of the tree. In a tree, height of all leaf nodes is ‘0’.


    Figure 2.25.: Height representation
                
               k. Depth
    In a tree data structure, the total number of edges from root node to a particular
    node is called DEPTH of that Node. In a tree, the total number of edges from root node
    to a leaf node in the longest path is said to be Depth of the tree. In a tree, depth of
    the root node is ‘0’.



            l. Path

    In a tree data structure, the sequence of Nodes and Edges from one node to another
    node is called as PATH between those two Nodes. Length of a Path is total number of
    nodes in that path. In below example the path A - B - E - J has length 4.



            m. Sub Tree

    In a tree data structure, each child from a node forms a sub tree recursively. Every
    child node will form a sub-tree on its parent node.


       2.7.2 Binary Tree Representations

    A binary tree data structure is represented using two methods. Those methods are
    as follows:

    • Linked List of Binary Tree representation

    • Array Representation
    Let T be a Binary Tree. There are two ways of representing T in the memory as follow
    Linked

    a. Linked List of Binary Tree representation

    Consider a Binary Tree T. T will be maintained in memory by means of a linked list
    representation, which uses three parallel arrays; INFO, LEFT, and RIGHT pointer
    variable ROOT as follows. In Binary Tree, each node N of T will correspond to a
    location k such that:

    1. LEFT [k] contains the location of the left child of node N.

    2. INFO [k] contains the data at the node N.

    3. RIGHT [k] contains the location of right child of node N.
        • Representation of a node:


    In this representation of binary tree, root will contain the location of the root R of T.
    If any one of the sub tree is empty, then the corresponding pointer will contain the
    null value if the tree T itself is empty, the ROOT will contain the null value.

    Example

    Consider the binary tree T in the figure of Binary Tree


    Linked Representation of the Binary Tree

    b. Array Representation of Binary Tree
    Let us consider that we have a tree T. let our tree T is a binary tree that us complete binary
    tree. Then there is an efficient way of representing T in the memory called the sequential
    representation or array representation of T. This representation uses only a linear array
    TREE as follows:

    1. The root N of T is stored in TREE [1].

    2. If a node occupies TREE [k] then its left child is stored in TREE [2 * k] and its
       right child is stored into TREE [2 * k + 1].

    For Example:
    Consider the following Tree:




    Its sequential representation is as follow:


    2.7.3 Binary Tree Traversals

    When we wanted to display a binary tree, we need to follow some order in which all
    the nodes of that binary tree must be displayed. In any binary tree displaying order
    of nodes depends on the traversal method.

    Displaying (or) visiting order of nodes in a binary tree is called as Binary Tree
    Traversal.

    There are three types of binary tree traversals.

    • In - Order Traversal

    • Pre - Order Traversal

    • Post - Order Traversal

    Traversal is a process to visit all the nodes of a tree and may print their values too.
    Because, all nodes are connected via edges (links) we always start from the root
    (head) node. That is, we cannot randomly access a node in a tree.

    Generally, we traverse a tree to search or locate a given item or key in the tree or to
    print all the values it contains.

    a. In-order Traversal

    In this traversal method, the left sub tree is visited first, then the root and later the
    right sub-tree. We should always remember that every node may represent a sub
    tree itself.

    If a binary tree is traversed in-order, the output will produce sorted key values in an
    ascending order.


    We start from A, and following in-order traversal, we move to its left subtree B. B is
    also traversed in-order. The process goes on until all the nodes are visited. The output
    of inorder traversal of this tree will be −

    D → B → E → A → F → C → G

    Algorithm:

    Until all nodes are traversed −

    Step 1 − Recursively traverse left subtree.

    Step 2 − Visit root node.

    Step 3 − Recursively traverse right subtree.

    b. Pre-order Traversal

    In this traversal method, the root node is visited first, then the left subtree and finally
    the right subtree.

    We start from A, and following pre-order traversal, we first visit A itself and then
    move to its left subtree B. B is also traversed pre-order. The process goes on until all the
    nodes are visited. The output of pre-order traversal of this tree will be −

    A → B → D → E → C → F → G

    Algorithm:

    Until all nodes are traversed −

    Step 1 − Visit root node.

    Step 2 − Recursively traverse left subtree.

    Step 3 − Recursively traverse right subtree.

    c. Post-order Traversal

    In this traversal method, the root node is visited last, hence the name. First we
    traverse the left sub tree, then the right sub tree and finally the root node.



    We start from A, and following Post-order traversal, we first visit the left sub tree B. B is also
    traversed post-order. The process goes on until all the nodes are visited. The output of
    post-order traversal of this tree will be −
    D → E → B → F → G → C → A

    Algorithm:

    Until all nodes are traversed −

    Step 1 − Recursively traverse left subtree.

    Step 2 − Recursively traverse right subtree.

    Step 3 − Visit root node.

    Binary Search tree exhibits a special behavior. A node’s left child must have a value
    less than its parent’s value and the node’s right child must have a value greater than
    its parent value.

        2.7.4. Basic Operations on binary tree

    A Binary Search Tree (BST) is a tree in which all the nodes follow the below-mentioned
       properties

    • The left sub-tree of a node has a key less than or equal to its parent node’s key.

    • The right sub-tree of a node has a key greater than to its parent node’s key.

    Thus, BST divides all its sub-trees into two segments; the left sub-tree and the right

    sub-tree and can be defined as
    left_subtree (keys) ≤ node (key) ≤ right_subtree (keys)

    Representation

    BST is a collection of nodes arranged in a way where they maintain BST properties.
    Each node has a key and an associated value. While searching, the desired key is
    compared to the keys in BST and if found, the associated value is retrieved.
    Following is a pictorial representation of BST






    UNIT1: FUNDAMENTALS OF LAPTOP AND PORTABLE DEVICESUNIT 3: INTRODUCTION TO COMPUTER NETWORK