100% found this document useful (2 votes)
6 views

Data Structure and Algorithms Using C++: A Practical Implementation 1st Edition Sachi Nandan Mohanty instant download

Ebook

Uploaded by

urnerguter84
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (2 votes)
6 views

Data Structure and Algorithms Using C++: A Practical Implementation 1st Edition Sachi Nandan Mohanty instant download

Ebook

Uploaded by

urnerguter84
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 50

Data Structure and Algorithms Using C++: A

Practical Implementation 1st Edition Sachi


Nandan Mohanty pdf download

https://textbookfull.com/product/data-structure-and-algorithms-
using-c-a-practical-implementation-1st-edition-sachi-nandan-
mohanty/

Download more ebook from https://textbookfull.com


We believe these products will be a great fit for you. Click
the link to download now, or visit textbookfull.com
to discover even more!

Recommender System with Machine Learning and Artificial


Intelligence Practical Tools and Applications in
Medical Agricultural and Other Industries 1st Edition
Sachi Nandan Mohanty (Editor)
https://textbookfull.com/product/recommender-system-with-machine-
learning-and-artificial-intelligence-practical-tools-and-
applications-in-medical-agricultural-and-other-industries-1st-
edition-sachi-nandan-mohanty-editor/

Primary Mathematics Textbook 2B Jennifer Hoerst

https://textbookfull.com/product/primary-mathematics-
textbook-2b-jennifer-hoerst/

Handbook of Macroeconomics, Volume 2A-2B SET 1st


Edition John B. Taylor

https://textbookfull.com/product/handbook-of-macroeconomics-
volume-2a-2b-set-1st-edition-john-b-taylor/

Essential algorithms a practical approach to computer


algorithms using Python and C Second Edition Rod
Stephens

https://textbookfull.com/product/essential-algorithms-a-
practical-approach-to-computer-algorithms-using-python-and-c-
second-edition-rod-stephens/
Problem Solving in Data Structures & Algorithms Using C
First Edition Jain

https://textbookfull.com/product/problem-solving-in-data-
structures-algorithms-using-c-first-edition-jain/

Problem Solving in Data Structures Algorithms Using C


Programming Interview Guide 1st Edition Hemant Jain

https://textbookfull.com/product/problem-solving-in-data-
structures-algorithms-using-c-programming-interview-guide-1st-
edition-hemant-jain/

Data Mining Algorithms in C++: Data Patterns and


Algorithms for Modern Applications 1st Edition Timothy
Masters

https://textbookfull.com/product/data-mining-algorithms-in-c-
data-patterns-and-algorithms-for-modern-applications-1st-edition-
timothy-masters/

Problem Solving in Data Structures Algorithms Using C


Programming Interview Guide First Edition Hemant Jain

https://textbookfull.com/product/problem-solving-in-data-
structures-algorithms-using-c-programming-interview-guide-first-
edition-hemant-jain/

Modern Data Mining Algorithms in C++ and CUDA C: Recent


Developments in Feature Extraction and Selection
Algorithms for Data Science 1st Edition Timothy Masters

https://textbookfull.com/product/modern-data-mining-algorithms-
in-c-and-cuda-c-recent-developments-in-feature-extraction-and-
selection-algorithms-for-data-science-1st-edition-timothy-
Data Structure and Algorithms
Using C++
Scrivener Publishing
100 Cummings Center, Suite 541J
Beverly, MA 01915-6106

Publishers at Scrivener
Martin Scrivener (martin@scrivenerpublishing.com)
Phillip Carmical (pcarmical@scrivenerpublishing.com)
Data Structure
and Algorithms Using C++

A Practical Implementation

Edited by
Sachi Nandan Mohanty
ICFAI Foundation For Higher Education, Hyderabad, India
and
Pabitra Kumar Tripathy
Kalam Institute of Technology, Berhampur, India
This edition first published 2021 by John Wiley & Sons, Inc., 111 River Street, Hoboken, NJ 07030, USA
and Scrivener Publishing LLC, 100 Cummings Center, Suite 541J, Beverly, MA 01915, USA
© 2021 Scrivener Publishing LLC
For more information about Scrivener publications please visit www.scrivenerpublishing.com.

All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or
transmitted, in any form or by any means, electronic, mechanical, photocopying, recording, or other-
wise, except as permitted by law. Advice on how to obtain permission to reuse material from this title
is available at http://www.wiley.com/go/permissions.

Wiley Global Headquarters


111 River Street, Hoboken, NJ 07030, USA

For details of our global editorial offices, customer services, and more information about Wiley prod-
ucts visit us at www.wiley.com.

Limit of Liability/Disclaimer of Warranty


While the publisher and authors have used their best efforts in preparing this work, they make no rep­
resentations or warranties with respect to the accuracy or completeness of the contents of this work and
specifically disclaim all warranties, including without limitation any implied warranties of merchant-­
ability or fitness for a particular purpose. No warranty may be created or extended by sales representa­
tives, written sales materials, or promotional statements for this work. The fact that an organization,
website, or product is referred to in this work as a citation and/or potential source of further informa­
tion does not mean that the publisher and authors endorse the information or services the organiza­
tion, website, or product may provide or recommendations it may make. This work is sold with the
understanding that the publisher is not engaged in rendering professional services. The advice and
strategies contained herein may not be suitable for your situation. You should consult with a specialist
where appropriate. Neither the publisher nor authors shall be liable for any loss of profit or any other
commercial damages, including but not limited to special, incidental, consequential, or other damages.
Further, readers should be aware that websites listed in this work may have changed or disappeared
between when this work was written and when it is read.

Library of Congress Cataloging-in-Publication Data

ISBN 978-1-119-75054-3

Cover image: Pixabay.Com


Cover design by Russell Richardson

Set in size of 11pt and Minion Pro by Manila Typesetting Company, Makati, Philippines

Printed in the USA

10 9 8 7 6 5 4 3 2 1
Contents

Preface xi
1 Introduction to Data Structure 1
1.1 Definition and Use of Data Structure 1
1.2 Types of Data Structure 2
1.3 Algorithm 3
1.4 Complexity of an Algorithm 6
1.5 Efficiency of an Algorithm 7
1.6 Asymptotic Notations 8
1.7 How to Determine Complexities 9
1.8 Questions 13
2 Review of Concepts of ‘C++’ 15
2.1 Array 15
2.1.1 One-Dimensional Array 16
2.1.2 Multi-Dimensional Array 17
2.1.3 String Handling 20
2.2 Function 26
2.2.1 User Defined Functions 26
2.2.2 Construction of a Function 27
2.2.3 Actual Argument and Formal Argument 31
2.2.4 Call by Value and Call by Reference 32
2.2.5 Default Values for Parameters 34
2.2.6 Storage Class Specifiers 35
2.3 Pointer 37
2.3.1 Declaration of a Pointer 37
2.3.2 Initialization of a Pointer 37
2.3.3 Arithmetic With Pointer 38
2.3.4 Passing of a Pointer to Function 39
2.3.5 Returning of a Pointer by Function 40
2.3.6 C++ Null Pointer 41

v
vi Contents

2.4 Structure 42
2.4.1 The typedef Keyword 46
2.5 Questions 47
3 Sparse Matrix 49
3.1 What is Sparse Matrix 49
3.2 Sparse Matrix Representations 49
3.3 Algorithm to Represent the Sparse Matrix 51
3.4 Programs Related to Sparse Matrix 52
3.5 Why to Use Sparse Matrix Instead of Simple Matrix? 56
3.6 Drawbacks of Sparse Matrix 57
3.7 Sparse Matrix and Machine Learning 57
3.8 Questions 58
4 Concepts of Class 59
4.1 Introduction to CLASS 59
4.2 Access Specifiers in C++ 60
4.3 Declaration of Class 60
4.4 Some Manipulator Used In C++ 62
4.5 Defining the Member Functions Outside of the Class 64
4.6 Array of Objects 64
4.7 Pointer to Object 66
4.8 Inline Member Function 67
4.9 Friend Function 69
4.9.1 Simple Friend Function 69
4.9.2 Friend With Inline Substitution 70
4.9.3 Granting Friendship to Another Class
(Friend Class) 71
4.9.4 More Than One Class Having the Same
Friend Function 73
4.10 Static Data Member and Member Functions 75
4.11 Constructor and Destructor 78
4.11.1 Constructor 78
4.11.1.1 Empty Constructor 79
4.11.1.2 Default Constructor 79
4.11.1.3 Parameterized Constructors 80
4.11.1.4 Copy Constructor 81
4.11.2 Destructor 83
4.12 Dynamic Memory Allocation 84
4.13 This Pointer 86
4.14 Class Within Class 87
4.15 Questions 89
Contents vii

5 Stack 91
5.1 STACK 91
5.2 Operations Performed With STACK 91
5.3 ALGORITHMS 93
5.4 Applications of STACK 96
5.5 Programming Implementations of STACK 106
5.6 Questions 126
6 Queue 129
6.1 Queue 129
6.2 Types of Queue 129
6.3 Linear Queue 129
6.4 Circular Queue 134
6.5 Double Ended Queue 138
6.6 Priority Queue 139
6.7 Programs 142
6.8 Questions 165
7 Linked List 167
7.1 Why Use Linked List? 167
7.2 Types of Link List 167
7.3 Single Link List 168
7.4 Programs Related to Single Linked List 177
7.4.1 /* Creation of a Linked List */ 177
7.4.2 /* Insert a Node Into a Simple Linked List at
the Beginning */ 178
7.4.3 /* Insert a Node Into a Simple Linked List at
the End of the List */ 180
7.4.4 /* Insert a Node Into a Simple Linked List
When the Node Is Known */ 182
7.4.5 /* Insert a Node Into a Simple Linked List
Information Is Known and Put After Some
Specified Node */ 184
7.4.6 /* Deleting the First Node From a Simple
Linked List */ 187
7.4.7 /* Deleting the Last Node From a Simple
Linked List */ 189
7.4.8 /* Deleting a Node From a Simple Linked
List When Node Number Is Known */ 191
7.4.9 Deleting a Node From a Simple Linked List
When Information of a Node Is Given 193
viii Contents

7.4.10 /* SEARCH A NODE INTO A SIMPLE LINKED


LIST WITH INFORMATION IS KNOWN*/ 197
7.4.11 /* Sorting a Linked List in Ascending Order */ 199
7.4.12 /* Reversing a Linked List */ 202
7.4.13 Program for Student Data Using Linked List 203
7.5 Double Link List 210
7.6 Programs on Double Linked List 216
7.6.1 /* Creation of Double Linked List */ 216
7.6.2 /* Inserting First Node in the Doubly
Linked List */ 218
7.6.3 /*Inserting a Node in the Doubly Linked List
When Node Number Is Known*/ 220
7.6.4 /*Inserting a Node in the Doubly Linked List
When Information Is Known*/ 223
7.6.5 /* Delete First Node From a Double Linked List */ 226
7.6.6 /*Delete the Last Node From the Double
Linked List*/ 229
7.7 Header Linked List 231
7.7.1 /* Inserting a Node Into a Header Linked List */ 233
7.8 Circular Linked List 235
7.9 Application of Linked List 239
7.9.1 Addition of Two Polynomial 239
7.9.2 /* Polynomial With Help of Linked List */ 240
7.9.3 Program for Linked Queue 241
7.9.4 Program for Linked Stack 243
7.10 Garbage Collection and Compaction 245
7.11 Questions 247
8 TREE 249
8.1 Tree Terminologies 249
8.2 Binary Tree 251
8.3 Representation of Binary Tree 253
8.3.1 Array Representation of a Tree 253
8.3.2 Linked List Representation of a Tree 254
8.4 Operations Performed With the Binary Tree 254
8.4.1 /*Creation of a Tree*/ 255
8.5 Traversing With Tree 256
8.5.1 /* Binary Tree Traversal */ 259
8.6 Conversion of a Tree From Inorder and Preorder 262
Contents ix

8.7 Types of Binary Tree 265


8.8 Expression Tree 265
8.9 Binary Search Tree 268
8.10 Height Balanced Tree (AVL Tree) 272
8.11 Threaded Binary Tree 277
8.12 Heap Tree 279
8.13 Huffman Tree 282
8.14 Decision Tree 286
8.15 B-Tree 287
8.16 B + Tree 292
8.17 General Tree 293
8.18 Red–Black Tree 293
8.19 Questions 294
9 Graph 295
9.1 Graph Terminologies 295
9.2 Representation of Graph 301
9.3 Traversal of Graph 305
9.3.1 Breadth First Search (BFS) 305
9.3.2 Depth First Search 311
9.4 Spanning Tree 315
9.4.1 Kruskal Algorithm 315
9.4.2 Prim’s Algorithm 318
9.5 Single Source Shortest Path 322
9.5.1 Bellman–Ford Algorithm 323
9.5.2 Dijkstra’s Algorithm 327
9.6 All Pair Shortest Path 335
9.7 Topological Sorting 345
9.8 Questions 347
10 Searching and Sorting 349
10.1 Linear Search 349
10.2 Binary Search 351
10.3 Bubble Sort 355
10.4 Selection Sort 359
10.5 Insertion Sort 361
10.6 Merge Sort 363
10.7 Quick Sort 366
10.8 Radix Sort 369
10.9 Heap Sort 372
10.10 Questions 389
x Contents

11 Hashing 391
11.1 Hash Functions 391
11.2 Collisions 393
11.3 Collision Resolution Methods 393
11.4 Clustering 394
11.5 Questions 395
Index 397
Preface

Welcome to the first edition of Data Structures and Algorithms Using C++.
A data structure is the logical or mathematical arrangement of data in
memory. To be effective, data has to be organized in a manner that adds to
the efficiency of an algorithm and also describe the relationships between
these data items and the operations that can be performed on these items.
The choice of appropriate data structures and algorithms forms the funda-
mental step in the design of an efficient program. Thus, a deep understand-
ing of data structure concepts is essential for students who wish to work
on the design and implementation of system software written in C++, an
object-oriented programming language that has gained popularity in both
academia and industry. Therefore, this book was developed to provide
comprehensive and logical coverage of data structures like stacks, queues,
linked lists, trees and graphs, which makes it an excellent choice for learn-
ing data structures. The objective of the book is to introduce the concepts
of data structures and apply these concepts in real-life problem solving.
Most of the examples presented resulted from student interaction in the
classroom. This book utilizes a systematic approach wherein the design of
each of the data structures is followed by algorithms of different operations
that can be performed on them and the analysis of these algorithms in
terms of their running times.
This book was designed to serve as a textbook for undergraduate engi-
neering students across all disciplines and postgraduate level courses in
computer applications. Young researchers working on efficient data storage
and related applications will also find it to be a helpful reference source to
guide them in the newly established techniques of this rapidly growing
research field.

Dr. Sachi Nandan Mohanty and


Prof. Pabitra Kumar Tripathy
December 2020

xi
1
Introduction to Data Structure

1.1 Definition and Use of Data Structure


Data structure is the representation of the logical relationship existing
between individual elements of data. In other words the data structure is a
way of organizing all data items that considers not only the elements stored
but also their relationship to each other.
Data structure specifies

• Organization of data
• Accessing methods
• Degree of associativity
• Processing alternatives for information

The data structures are the building blocks of a program and hence the
selection of a particular data structure stresses on

• The data structures must be rich enough in structure to


reflect the relationship existing between the data, and
• The structure should be simple so that we can process data
effectively whenever required.

In mathematically Algorithm + Data Structure = Program


Finally we can also define the data structure as the “Logical and mathe-
matical model of a particular organization of data”

Sachi Nandan Mohanty and Pabitra Kumar Tripathy. Data Structure and Algorithms Using C++:
A Practical Implementation, (1–14) © 2021 Scrivener Publishing LLC

1
2 Data Structure and Algorithms Using C++

1.2 Types of Data Structure


Data structure can be broadly classified into two categories as Linear and
Non-Linear

DATA STRUCTURE

LINEAR NON LINEAR

ARRAY QUEUE STACK TREE GRAPH TABLES SETS

Linear Data Structures


In linear data structures, values are arranged in linear fashion. Arrays,
linked lists, stacks, and queues are the examples of linear data structures in
which values are stored in a sequence.

Non-Linear Data Structure


This type is opposite to linear. The data values in this structure are not
arranged in order. Tree, graph, table, and sets are the examples of non-
linear data structure.

Operations Performed in Data Structure


In data structure we can perform the operations like

• Traversing
• Insertion
• Deletion
• Merging
• Sorting
• Searching
Introduction to Data Structure 3

1.3 Algorithm
The step by step procedure to solve a problem is known as the ALGORITHM.
An algorithm is a well-organized, pre-arranged, and defined computational
module that receives some values or set of values as input and provides a
single or set of values as out put. These well-defined computational steps
are arranged in sequence, which processes the given input into output.
An algorithm is said to be accurate and truthful only when it provides
the exact wanted output.
The efficiency of an algorithm depends on the time and space complex-
ities. The complexity of an algorithm is the function which gives the run-
ning time and/or space in terms of the input size.

Steps Required to Develop an Algorithm


• Finding a method for solving a problem. Every step of an
algorithm should be defined in a precise and in a clear man-
ner. Pseudo code is also used to describe an algorithm.
• The next step is to validate the algorithm. This step includes
all the steps in our algorithm and should be done manually
by giving the required input, perform the required steps
including in our algorithm and should get the required
amount of output in a finite amount of time.
• Finally implement the algorithm in terms of programming
language.

Mathematical Notations and Functions


™™ Floor and Ceiling Functions
Floor function returns the greatest integer that does not exceed
the number.
Ceiling function returns the least integer that is not less than
the number.

no denotes the floor function

no denotes the ceil function

Ex :
5.23 = 5 5.23 =6
4 Data Structure and Algorithms Using C++

™™ Remainder Function
To find the remainder “mod” function is being used as

A mod B

™™ To find the Integer and Absolute value of a number


INT(5.34) = 5 This statement returns the integer part of
the number
INT(- 6.45) = 6 This statement returns the absolute as well
as the integer portion of the number

™™ Summation Symbol
To add a series of number as a1+ a2 + a3 +…………+ an the
symbol Σ is used

n
Σ ai
i=1

™™ Factorial of a Number
The product of the positive integers from 1 to n is known as
the factorial of n and it is denoted as n!.

0! = 1

Algorithemic Notations
While writing the algorithm the comments are provided with in [ ].
The assignment should use the symbol “: =” instead of “=”
For Input use Read : variable name
For output use write : message/variable name

The control structures can also be allowed to use inside an algorithm but
their way of approaching will be some what different as
Simple If
If condition, then:
Statements
[end of if structure]
Introduction to Data Structure 5

If…else
If condition, then:
Statements
Else :
Statements
[end of if structure]

If…else ladder
If condition1, then:
Statements
Else If condition2, then:
Statements
Else If condition3, then:
Statements
…………………………………………

…………………………………………

…………………………………………
Else If conditionN, then:
Statements
Else:
Statements
[end of if structure]

LOOPING CONSTRUCT
Repeat for var = start_value to end_value by
step_value
Statements
[end of loop]

Repeat while condition:


Statements
[end of loop]
Ex : repeat for I = 1 to 10 by 2
Write: i
[end of loop]

OUTPUT
1 3 5 7 9
6 Data Structure and Algorithms Using C++

1.4 Complexity of an Algorithm


The complexity of programs can be judged by criteria such as whether
it satisfies the original specification task, whether the code is readable.
These factors affect the computing time and storage requirement of the
program.

Space Complexity
The space complexity of a program is the amount of memory it needs to
run to completion. The space needed by a program is the sum of the fol-
lowing components:

• A fixed part that includes space for the code, space for sim-
ple variables and fixed size component variables, space for
constants, etc.
• A variable part that consists of the space needed by com-
ponent variables whose size is dependent on the particular
problem instance being solved, and the stack space used by
recursive procedures.

Time Complexity
The time complexity of a program is the amount of computer time it needs
to run to completion. The time complexity is of two types such as

• Compilation time
• Runtime

The amount of time taken by the compiler to compile an algorithm is


known as compilation time. During compilation time it does not calculate
for the executable statements, it calculates only the declaration statements
and checks for any syntax and semantic errors.
The run time depends on the size of an algorithm. If the number of
instructions in an algorithm is large, then the run time is also large, and if
the number of instructions in an algorithm is small, then the time for exe-
cuting the program is also small. The runtime is calculated for executable
statements and not for declaration statements.
Introduction to Data Structure 7

Suppose space is fixed for one algorithm then only run time will be con-
sidered for obtaining the complexity of algorithm, these are

• Best case
• Worst case
• Average case

Best Case
Generally, most of the algorithms behave sometimes in best case. In this
case, algorithm searches the element for the first time by itself.
For example: In linear search, if it finds the element for the first time by
itself, then it behaves as the best case. Best case takes shortest time to exe-
cute, as it causes the algorithms to do the least amount of work.

Worst Case
In worst case, we find the element at the end or when searching of elements
fails. This could involve comparing the key to each list value for a total of
N comparisons.
For example in linear search suppose the element for which algorithm
is searching is the last element of array or it is not available in array then
algorithm behaves as worst case.

Average Case
Analyzing the average case behavior algorithm is a little bit complex than
the best case and worst case. Here, we take the probability with a list of
data. Average case of algorithm should be the average number of steps but
since data can be at any place, so finding exact behavior of algorithm is
difficult. As the volume of data increases, the average case of algorithm
behaves like the worst case of algorithm.

1.5 Efficiency of an Algorithm


Efficiency of an algorithm can be determined by measuring the time, space,
and amount of resources it uses for executing the program. The amount of
time taken by an algorithm can be calculated by finding the number of
steps the algorithm executes, while the space refers to the number of units
it requires for memory storage.
8 Data Structure and Algorithms Using C++

1.6 Asymptotic Notations


The asymptotic notations are the symbols which are used to solve the dif-
ferent algorithms and the notations are

• Big Oh Notation (O)


• Little Oh Notation (o)
• Omega Notation (W)
• Theta Notation (q)

Big Oh (O) Notation


This Notation gives the upper bound for a function to within a constant
factor. We write f(n) = O(g(n)) if there are +ve constants n0 and C such
that to the right of n0, the value of f(n) always lies on or below Cg(n)

Omega Notation (W)


This notation gives a lower bound for a function to with in a constant fac-
tor. We write f(n) = Ωg(n) if there are positive constants n0 and C such that
to the right of n0 the value of f(n) always lies on or above Cg(n)

Theta Notation (q)


This notation bounds the function to within constant factors. We say f(n) =
θg(n) if there exists +ve constants n0, C1 and C2 such that to the right of n0
the value of f(n) always lies between c1g(n) and c2(g(n)) inclusive.

Little Oh Notation (o)


F(n) = o(g(n)) iff f(n) = O(g(n)) and f(n) != Ωg(n).

Introduction
An important question is: How efficient is an algorithm or piece of code?
Efficiency covers lots of resources, including:
CPU (time) usage
Memory usage
Disk usage
Network usage
Introduction to Data Structure 9

All are important but we will mostly talk about CPU time
Be careful to differentiate between:

Performance: how much time/memory/disk/... is actually used


when a program is running. This depends on the machine, compiler, etc.,
as well as the code.

Complexity: how do the resource requirements of a program or algorithm


scale, i.e., what happens as the size of the problem being solved gets larger.
Complexity affects performance but not the other way around. The time
required by a method is proportional to the number of “basic operations”
that it performs. Here are some examples of basic operations:
one arithmetic operation (e.g., +, *).
one assignment
one test (e.g., x == 0)
one read
one write (of a primitive type)

Note: As an example,
O(1) refers to constant time.
O(n) indicates linear time;
O(nk) (k fixed) refers to polynomial time;
O(log n) is called logarithmic time;
O(2n) refers to exponential time, etc.
n² + 3n + 4 is O(n²), since n² + 3n + 4 < 2n² for all n > 10. Strictly speaking,
3n + 4 is O(n²), too, but big-O notation is often misused to mean equal to
rather than less than.

1.7 How to Determine Complexities


In general, how can you determine the running time of a piece of code?
The answer is that it depends on what kinds of statements are used.

1. Sequence of statements
statement 1;
statement 2;
...
statement k;
10 Data Structure and Algorithms Using C++

Note: this is code that really is exactly k statements; this is not


an unrolled loop like the N calls to addBefore shown above.)
The total time is found by adding the times for all statements:

total time = time(statement 1) + time


(statement 2) + ... + time(statement k)

If each statement is “simple” (only involves basic opera-


tions) then the time for each statement is constant and the
total time is also constant: O(1). In the following examples,
assume the statements are simple unless noted otherwise.
2. if-then-else statements
if (cond) {
sequence of statements 1
}
else {
sequence of statements 2
}

Here, either sequence 1 will execute, or sequence 2 will execute.


Therefore, the worst-case time is the slowest of the two possi-
bilities: max(time(sequence 1), time(sequence 2)). For exam-
ple, if sequence 1 is O(N) and sequence 2 is O(1) the worst-case
time for the whole if-then-else statement would be O(N).
3. for loops
for (i = 0; i < N; i++) {
sequence of statements
}

The loop executes N times, so the sequence of statements also


executes N times. Since we assume the statements are O(1), the
total time for the for loop is N * O(1), which is O(N) overall.
4. Nested loops
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
sequence of statements
}
}

The outer loop executes N times. Every time the outer loop
executes, the inner loop executes M times. As a result, the
statements in the inner loop execute a total of N * M times.
Thus, the complexity is O(N * M). In a common special case
Introduction to Data Structure 11

where the stopping condition of the inner loop is j < N


instead of j < M (i.e., the inner loop also executes N times),
the total complexity for the two loops is O(N2).
5. Statements with method calls:
When a statement involves a method call, the complexity of
the statement includes the complexity of the method call.
Assume that you know that method f takes constant time,
and that method g takes time proportional to (linear in) the
value of its parameter k. Then the statements below have the
time complexities indicated.
f(k); // O(1)
g(k); // O(k)

When a loop is involved, the same rule applies. For example:


for (j = 0; j < N; j++) g(N);

has complexity (N2). The loop executes N times and each


method call g(N) is complexity O(N).

Examples
Q1. What is the worst-case complexity of the each of the following code
fragments?

Two loops in a row:


for (i = 0; i < N; i++) {
sequence of statements
}
for (j = 0; j < M; j++) {
sequence of statements
}

Answer: Th
 e first loop is O(N) and the second loop is O(M). Since you
do not know which is bigger, you say this is O(N+M). This can
also be written as O(max(N,M)). In the case where the second
loop goes to N instead of M the complexity is O(N). You can
see this from either expression above. O(N+M) becomes O(2N)
and when you drop the constant it is O(N). O(max(N,M))
becomes O(max(N,N)) which is O(N).
12 Data Structure and Algorithms Using C++

Q2. How would the complexity change if the second loop went to N
instead of M?
A nested loop followed by a non-nested loop:
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
sequence of statements
}
}
for (k = 0; k < N; k++) {
sequence of statements
}

Answer: Th
 e first set of nested loops is O(N2) and the second loop is
O(N). This is O(max(N2,N)) which is O(N2).
Q3. A nested loop in which the number of times the inner loop executes
depends on the value of the outer loop index:
for (i = 0; i < N; i++) {
for (j = i; j < N; j++) {
sequence of statements
}
}

Answer: W
 hen i is 0 the inner loop executes N times. When i is 1 the
inner loop executes N-1 times. In the last iteration of the outer
loop when i is N-1 the inner loop executes 1 time. The number
of times the inner loop statements execute is N + N-1 + ... + 2 +
1. This sum is N(N+1)/2 and gives O(N2).
Q4. For each of the following loops with a method call, determine the
overall complexity. As above, assume that method f takes constant time,
and that method g takes time linear in the value of its parameter.

a. for (j = 0; j < N; j++) f(j);


b. for (j = 0; j < N; j++) g(j);
c. for (j = 0; j < N; j++) g(k);

Answer: a. E
 ach call to f(j) is O(1). The loop executes N times so it is N x
O(1) or O(N).
b. The first time the loop executes j is 0 and g(0) takes “no oper-
ations.” The next time j is 1 and g(1) takes 1 operations. The
last time the loop executes j is N-1 and g(N-1) takes N-1 oper-
ations. The total work is the sum of the first N-1 numbers and
is O(N2).
Introduction to Data Structure 13

c. Each time through the loop g(k) takes k operations and the
loop executes N times. Since you do not know the relative size
of k and N, the overall complexity is O(N x k).

1.8 Questions
1. What is data structure?
2. What are the types of operations that can be performed with
data structure?
3. What is asymptotic notation and why is this used?
4. What is complexity and its type?
5. Find the complexity of 3n2 + 5n.
6. Distinguish between linear and non-linear data structure.
7. Is it necessary is use data structure in every field? Justify
your answer.
2
Review of Concepts of ‘C++’

2.1 Array
Whenever we want to store some values then we have to take the help of a
variable, and for this we must have to declare it before its use. If we want
to store the details of a student so for this purpose we have to declare the
variables as
char name [20], add[30] ;
int roll, age, regdno ;
float total, avg ;
etc……
for a individual student.
If we want to store the details of more than one student than we have to
declare a huge amount of variables and which are too much difficult to access
it. I.e/ the programs length will increased too faster. So it will be better to
declare the variables in a group. I.e/ name variable will be used for more than
one student, roll variable will be used for more than one student, etc.
So to declare the variable of same kind in a group is known as the Array
and the concept of array is used for this purpose only.

Definition: The array is a collection of more than one element of same


kind with a single variable name.

Types of Array:
The arrays can be further classified into two broad categories such as:

• One Dimensional (The array having one boundary


specification)
• Multi dimensional (The array having more than one bound-
ary specification)

Sachi Nandan Mohanty and Pabitra Kumar Tripathy. Data Structure and Algorithms Using C++:
A Practical Implementation, (15–48) © 2021 Scrivener Publishing LLC

15
16 Data Structure and Algorithms Using C++

2.1.1 One-Dimensional Array


Declaration:

Syntax :
Data type variable_name[bound] ;
The data type may be one of the data types that we are studied. The
variable name is also same as the normal variable_name but the bound is
the number which will further specify that how much variables you want
to combine into a single unit.
Ex : int roll[15];
In the above example roll is an array 15 variables whose capacity is to
store the roll_number of 15 students.
And the individual variables are
roll[0] , roll[1], roll[2], roll[3] ,……………..,roll[14]

Array Element in Memory


The array elements are stored in a consecutive manner inside the memory.
i.e./ They allocate a sequential memory allocation.
For Ex : int x[7];
Let the x[0] will be at the memory address 568 then the entire array can
be represented in the memory as

x[0] X[1] X[2] X[3] X[4] X[5] X[6]


568 570 572 574 576 578 580

Initialization:
The array is also initialized just like other normal variable except that
we have to pass a group of elements with in a chain bracket separated by
commas.
Ex : int x[5]= { 24,23,5,67,897 } ;
In the above statement x[0] = 24, x[1] = 23, x[2]=5, x[3]=67,x[4]=897
Review of Concepts of ‘C++’ 17

Retrieving and Storing Some Value From/Into the Array


Since array is a collection of more than one elements of same kind so while
performing any task with the array we have to do that work repeatedly.
Therefore while retrieving or storing the elements from/into an array we
must have to use the concept of looping.

Ex: Write a Program to Input 10 Elements Into an Array and


Display Them.

#include<iostream.h>
void main()
{
int x[10],i;
;
cout<<“\nEnter 10 elements into the array”;
for(i=0 ; i<10; i++)
cin>>x[i];
cout<<“\n THE ENTERED ARRAY ELEMENTS ARE :”;
for(i=0 ; i<10; i++)
cout<<” “<<x[i];
}

OUTPUT
Enter 10 elements into the array
12
36
89
54
6
125
35
87
49
6
 THE ENTERED ARRAY ELEMENTS ARE : 12 36
89 54 6 125 35 87 49 6

2.1.2 Multi-Dimensional Array


The array having more than one boundary specification is known as multi
dimensional array. The total number of elements to be stored in side a
multi dimensional array is equals to the product of its boundaries.
18 Data Structure and Algorithms Using C++

But we do use the two dimensional array to handle the matrix opera-
tions. The two dimensional array having two boundary specifications.

Declaration of Two-Dimensional Array


The declaration of the two dimensional array is just like the one dimen-
sional array except that instead of using a single boundary we have to use
two boundary specification.

SYNTAX
data_type variable_name[boundary1][boundary2];

Ex : int x[3][4];
In the above example x is the two dimensional array which has the capacity
to store (3x4) 12 elements. The individual number of elements are
x[0][0] x[0][1] x[0][2] x[0][3]
x[1][0] x[1][1] x[1][2] x[1][3]
x[2][0] x[2][1] x[2][2] x[2][3]

INITIALIZATION
The array can also be initialized as like one dimensional array.
Ex: int x[3][4] = {{3,5,7,8}, {45,12,34,3}, {56,89,56,23}};
OR
int x[3][4] = {3,5,7,8,45,12,34,3,56,89,56,23};
After the above initialization
x[0][0]=3 x[0][1]=5 x[0][2]=7 x[0][3]=8
x[1][0]=45 x[1][1]=12 x[1][2]=34 x[1][3]=3
x[2][0]=56 x[2][1]=89 x[2][2]=56 x[2][3]=23

Processing of a Two-Dimensional Array


While processing a two-dimensional array we have to use two loops.
Another Random Document on
Scribd Without Any Related Topics
the rowers being dressed as polar bears, with blocks of ice for seats;
another the tropical regions, with palms and gorgeous flowers. In
the evening there was a serenade, starting from a point above the
Rialto. The singers and the orchestra were placed on a barge
decorated and lighted by many coloured lamps, and the music of
Donizetti's "A te, o cara" filled the air. The object of every gondolier
on an occasion of this kind was to get his padrone as near to the
music as possible, whether he wanted it or not. The singers' barge,
therefore, was surrounded by a solid mass of gondolas, which
floated slowly down the canal together, getting denser as the canal
narrowed to pass under the Rialto bridge. It was a fantastic scene—
with the masses of Bengal lights, the rising moon, the gondolas
swaying gently to the rhythm of the song and the sea, and the
statuesque gondoliers, creatures of the sea, standing upright on the
stern of their vessels, or, oars in hand and hair blown by the breeze,
silhouetted against a background of deep-blue sky.
THE RIALTO

The gondolier in Venice is an important person to the stranger. Half


one's comfort depends on his worthiness or unworthiness. He is like
the girl of childhood's fame "who, if she was good, was very very
good, but, if she was bad, was horrid." If you are the employer of an
ideal gondolier you will find him thorough, ready-handed, and
versatile. In passing rapidly through Venice one does not properly
appreciate his worth. You must own him for some months before
you discover that he will attach himself to you and identify himself
with your interests in an almost feudal manner. He will save you an
infinity of trouble, and repay your confidence with honesty. The
gondolier usually prefers to have a foreigner for a master. The
foreigner pays well, never grumbling at the full tariff of five lire a
day: also, as the foreigner does not know the language or the place,
the gondolier becomes of some importance in the eyes of his
neighbours, who bid for his patronage. With a Venetian master he
would be paid from three to five lire a day; the work would be
harder, and the hours later.
When the squerariola (gondola builders) have finished their work,
the vessel will probably have cost three hundred lire. Even then the
craft is not by any means complete. There are the steel ornaments
and many other details to be bought and bargained for,—things not
procurable at the squero. For the steel prow (ferro), which must
have the edges of its teeth in one straight line, and in these days of
hurried workmanship is not always to be found, one must seek in all
the smithies in Venice. A good gondolier, however, will often possess
a ferro, an heirloom, made of hand-wrought iron, not cast in mould,
heavy and brittle, as are the new ferri, but light and pliant. A ferro of
the good and ancient make, if properly cared for and not allowed to
rust, will outlive many a gondola. For the sea-horses, the rude
carvings, the pictured Madonnas, the rugs and the covering for the
felce,—all, in fact, that helps to make the gondola the picturesque
craft it is,—one must go to the various shops in Venice.
Modern progress and modern ideas are rapidly sweeping away the
ancient and hereditary profession of the gondolier. One feels that his
life and that of the traghetto are drawing to a close—that soon they
will be things of the past. What would the Grand Canal be like
without its swiftly gliding gondola, black-hulled, black-roofed,—its
most characteristic feature? What a terrible thing it will be when that
exquisite art is forgotten,—when the Venetian can no longer judge
the turn of a corner or balance himself on the poop,—when for the
picturesque cries "Stali!" and "Premi!" will be substituted the clank
and thud of the steamers' screws! When a company first began to
run steamers from Venice to the railway station and public gardens,
the gondoliers struck. For three whole days there were no gondolas
running in Venice; the canals were full of tightly packed vessels,
while their owners hung together in groups at the wine-shops,
talking. A strange and scratch fleet of nondescript boats plied
between Venice and the islands, and the expression of the
gondoliers, as they leaned over the bridges and watched the
amateur watermen struggling with their oars, was quite unique. On
the second day a notice was posted up in every traghetto begging
the men to return to their work, and not to bring dishonour on a
profession which had always been such a source of pride to Venice.
This had no effect. The gondoliers merely enlisted the services of a
barrister, getting him to take a copy of their demand to the Company
—that the offending steamers should be removed. That was
impossible. The steamers were cheap and useful, and the gondoliers
could not be allowed to dictate to the State. However, they were told
that if they returned peaceably to their work something might be
done for them. They persisted in their strike, until suddenly—no one
ever knew why, or whence it came—a single gondola started running
from one of the ferries. That broke the ice. The gondoliers rushed to
their crafts and untied them. The strike was forgotten. The men's
first thought was to find good custom. I have always felt that there
was something touching in this hopeless struggle of the gondoliers
against the modernity that is fast settling on and demoralising
Venice.

PRINTED BY
NEILL AND COMPANY, LIMITED,
EDINBURGH.
*** END OF THE PROJECT GUTENBERG EBOOK VENICE ***

Updated editions will replace the previous one—the old editions


will be renamed.

Creating the works from print editions not protected by U.S.


copyright law means that no one owns a United States
copyright in these works, so the Foundation (and you!) can copy
and distribute it in the United States without permission and
without paying copyright royalties. Special rules, set forth in the
General Terms of Use part of this license, apply to copying and
distributing Project Gutenberg™ electronic works to protect the
PROJECT GUTENBERG™ concept and trademark. Project
Gutenberg is a registered trademark, and may not be used if
you charge for an eBook, except by following the terms of the
trademark license, including paying royalties for use of the
Project Gutenberg trademark. If you do not charge anything for
copies of this eBook, complying with the trademark license is
very easy. You may use this eBook for nearly any purpose such
as creation of derivative works, reports, performances and
research. Project Gutenberg eBooks may be modified and
printed and given away—you may do practically ANYTHING in
the United States with eBooks not protected by U.S. copyright
law. Redistribution is subject to the trademark license, especially
commercial redistribution.

START: FULL LICENSE


THE FULL PROJECT GUTENBERG LICENSE
PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK

To protect the Project Gutenberg™ mission of promoting the


free distribution of electronic works, by using or distributing this
work (or any other work associated in any way with the phrase
“Project Gutenberg”), you agree to comply with all the terms of
the Full Project Gutenberg™ License available with this file or
online at www.gutenberg.org/license.

Section 1. General Terms of Use and


Redistributing Project Gutenberg™
electronic works
1.A. By reading or using any part of this Project Gutenberg™
electronic work, you indicate that you have read, understand,
agree to and accept all the terms of this license and intellectual
property (trademark/copyright) agreement. If you do not agree
to abide by all the terms of this agreement, you must cease
using and return or destroy all copies of Project Gutenberg™
electronic works in your possession. If you paid a fee for
obtaining a copy of or access to a Project Gutenberg™
electronic work and you do not agree to be bound by the terms
of this agreement, you may obtain a refund from the person or
entity to whom you paid the fee as set forth in paragraph 1.E.8.

1.B. “Project Gutenberg” is a registered trademark. It may only


be used on or associated in any way with an electronic work by
people who agree to be bound by the terms of this agreement.
There are a few things that you can do with most Project
Gutenberg™ electronic works even without complying with the
full terms of this agreement. See paragraph 1.C below. There
are a lot of things you can do with Project Gutenberg™
electronic works if you follow the terms of this agreement and
help preserve free future access to Project Gutenberg™
electronic works. See paragraph 1.E below.
1.C. The Project Gutenberg Literary Archive Foundation (“the
Foundation” or PGLAF), owns a compilation copyright in the
collection of Project Gutenberg™ electronic works. Nearly all the
individual works in the collection are in the public domain in the
United States. If an individual work is unprotected by copyright
law in the United States and you are located in the United
States, we do not claim a right to prevent you from copying,
distributing, performing, displaying or creating derivative works
based on the work as long as all references to Project
Gutenberg are removed. Of course, we hope that you will
support the Project Gutenberg™ mission of promoting free
access to electronic works by freely sharing Project Gutenberg™
works in compliance with the terms of this agreement for
keeping the Project Gutenberg™ name associated with the
work. You can easily comply with the terms of this agreement
by keeping this work in the same format with its attached full
Project Gutenberg™ License when you share it without charge
with others.

1.D. The copyright laws of the place where you are located also
govern what you can do with this work. Copyright laws in most
countries are in a constant state of change. If you are outside
the United States, check the laws of your country in addition to
the terms of this agreement before downloading, copying,
displaying, performing, distributing or creating derivative works
based on this work or any other Project Gutenberg™ work. The
Foundation makes no representations concerning the copyright
status of any work in any country other than the United States.

1.E. Unless you have removed all references to Project


Gutenberg:

1.E.1. The following sentence, with active links to, or other


immediate access to, the full Project Gutenberg™ License must
appear prominently whenever any copy of a Project
Gutenberg™ work (any work on which the phrase “Project
Gutenberg” appears, or with which the phrase “Project
Gutenberg” is associated) is accessed, displayed, performed,
viewed, copied or distributed:

This eBook is for the use of anyone anywhere in the United


States and most other parts of the world at no cost and
with almost no restrictions whatsoever. You may copy it,
give it away or re-use it under the terms of the Project
Gutenberg License included with this eBook or online at
www.gutenberg.org. If you are not located in the United
States, you will have to check the laws of the country
where you are located before using this eBook.

1.E.2. If an individual Project Gutenberg™ electronic work is


derived from texts not protected by U.S. copyright law (does not
contain a notice indicating that it is posted with permission of
the copyright holder), the work can be copied and distributed to
anyone in the United States without paying any fees or charges.
If you are redistributing or providing access to a work with the
phrase “Project Gutenberg” associated with or appearing on the
work, you must comply either with the requirements of
paragraphs 1.E.1 through 1.E.7 or obtain permission for the use
of the work and the Project Gutenberg™ trademark as set forth
in paragraphs 1.E.8 or 1.E.9.

1.E.3. If an individual Project Gutenberg™ electronic work is


posted with the permission of the copyright holder, your use and
distribution must comply with both paragraphs 1.E.1 through
1.E.7 and any additional terms imposed by the copyright holder.
Additional terms will be linked to the Project Gutenberg™
License for all works posted with the permission of the copyright
holder found at the beginning of this work.

1.E.4. Do not unlink or detach or remove the full Project


Gutenberg™ License terms from this work, or any files
containing a part of this work or any other work associated with
Project Gutenberg™.

1.E.5. Do not copy, display, perform, distribute or redistribute


this electronic work, or any part of this electronic work, without
prominently displaying the sentence set forth in paragraph 1.E.1
with active links or immediate access to the full terms of the
Project Gutenberg™ License.

1.E.6. You may convert to and distribute this work in any binary,
compressed, marked up, nonproprietary or proprietary form,
including any word processing or hypertext form. However, if
you provide access to or distribute copies of a Project
Gutenberg™ work in a format other than “Plain Vanilla ASCII” or
other format used in the official version posted on the official
Project Gutenberg™ website (www.gutenberg.org), you must,
at no additional cost, fee or expense to the user, provide a copy,
a means of exporting a copy, or a means of obtaining a copy
upon request, of the work in its original “Plain Vanilla ASCII” or
other form. Any alternate format must include the full Project
Gutenberg™ License as specified in paragraph 1.E.1.

1.E.7. Do not charge a fee for access to, viewing, displaying,


performing, copying or distributing any Project Gutenberg™
works unless you comply with paragraph 1.E.8 or 1.E.9.

1.E.8. You may charge a reasonable fee for copies of or


providing access to or distributing Project Gutenberg™
electronic works provided that:

• You pay a royalty fee of 20% of the gross profits you derive
from the use of Project Gutenberg™ works calculated using the
method you already use to calculate your applicable taxes. The
fee is owed to the owner of the Project Gutenberg™ trademark,
but he has agreed to donate royalties under this paragraph to
the Project Gutenberg Literary Archive Foundation. Royalty
payments must be paid within 60 days following each date on
which you prepare (or are legally required to prepare) your
periodic tax returns. Royalty payments should be clearly marked
as such and sent to the Project Gutenberg Literary Archive
Foundation at the address specified in Section 4, “Information
about donations to the Project Gutenberg Literary Archive
Foundation.”

• You provide a full refund of any money paid by a user who


notifies you in writing (or by e-mail) within 30 days of receipt
that s/he does not agree to the terms of the full Project
Gutenberg™ License. You must require such a user to return or
destroy all copies of the works possessed in a physical medium
and discontinue all use of and all access to other copies of
Project Gutenberg™ works.

• You provide, in accordance with paragraph 1.F.3, a full refund of


any money paid for a work or a replacement copy, if a defect in
the electronic work is discovered and reported to you within 90
days of receipt of the work.

• You comply with all other terms of this agreement for free
distribution of Project Gutenberg™ works.

1.E.9. If you wish to charge a fee or distribute a Project


Gutenberg™ electronic work or group of works on different
terms than are set forth in this agreement, you must obtain
permission in writing from the Project Gutenberg Literary
Archive Foundation, the manager of the Project Gutenberg™
trademark. Contact the Foundation as set forth in Section 3
below.

1.F.

1.F.1. Project Gutenberg volunteers and employees expend


considerable effort to identify, do copyright research on,
transcribe and proofread works not protected by U.S. copyright
law in creating the Project Gutenberg™ collection. Despite these
efforts, Project Gutenberg™ electronic works, and the medium
on which they may be stored, may contain “Defects,” such as,
but not limited to, incomplete, inaccurate or corrupt data,
transcription errors, a copyright or other intellectual property
infringement, a defective or damaged disk or other medium, a
computer virus, or computer codes that damage or cannot be
read by your equipment.

1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except


for the “Right of Replacement or Refund” described in
paragraph 1.F.3, the Project Gutenberg Literary Archive
Foundation, the owner of the Project Gutenberg™ trademark,
and any other party distributing a Project Gutenberg™ electronic
work under this agreement, disclaim all liability to you for
damages, costs and expenses, including legal fees. YOU AGREE
THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT
LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT
EXCEPT THOSE PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE
THAT THE FOUNDATION, THE TRADEMARK OWNER, AND ANY
DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE LIABLE
TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL,
PUNITIVE OR INCIDENTAL DAMAGES EVEN IF YOU GIVE
NOTICE OF THE POSSIBILITY OF SUCH DAMAGE.

1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you


discover a defect in this electronic work within 90 days of
receiving it, you can receive a refund of the money (if any) you
paid for it by sending a written explanation to the person you
received the work from. If you received the work on a physical
medium, you must return the medium with your written
explanation. The person or entity that provided you with the
defective work may elect to provide a replacement copy in lieu
of a refund. If you received the work electronically, the person
or entity providing it to you may choose to give you a second
opportunity to receive the work electronically in lieu of a refund.
If the second copy is also defective, you may demand a refund
in writing without further opportunities to fix the problem.

1.F.4. Except for the limited right of replacement or refund set


forth in paragraph 1.F.3, this work is provided to you ‘AS-IS’,
WITH NO OTHER WARRANTIES OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
MERCHANTABILITY OR FITNESS FOR ANY PURPOSE.

1.F.5. Some states do not allow disclaimers of certain implied


warranties or the exclusion or limitation of certain types of
damages. If any disclaimer or limitation set forth in this
agreement violates the law of the state applicable to this
agreement, the agreement shall be interpreted to make the
maximum disclaimer or limitation permitted by the applicable
state law. The invalidity or unenforceability of any provision of
this agreement shall not void the remaining provisions.

1.F.6. INDEMNITY - You agree to indemnify and hold the


Foundation, the trademark owner, any agent or employee of the
Foundation, anyone providing copies of Project Gutenberg™
electronic works in accordance with this agreement, and any
volunteers associated with the production, promotion and
distribution of Project Gutenberg™ electronic works, harmless
from all liability, costs and expenses, including legal fees, that
arise directly or indirectly from any of the following which you
do or cause to occur: (a) distribution of this or any Project
Gutenberg™ work, (b) alteration, modification, or additions or
deletions to any Project Gutenberg™ work, and (c) any Defect
you cause.

Section 2. Information about the Mission


of Project Gutenberg™
Project Gutenberg™ is synonymous with the free distribution of
electronic works in formats readable by the widest variety of
computers including obsolete, old, middle-aged and new
computers. It exists because of the efforts of hundreds of
volunteers and donations from people in all walks of life.

Volunteers and financial support to provide volunteers with the


assistance they need are critical to reaching Project
Gutenberg™’s goals and ensuring that the Project Gutenberg™
collection will remain freely available for generations to come. In
2001, the Project Gutenberg Literary Archive Foundation was
created to provide a secure and permanent future for Project
Gutenberg™ and future generations. To learn more about the
Project Gutenberg Literary Archive Foundation and how your
efforts and donations can help, see Sections 3 and 4 and the
Foundation information page at www.gutenberg.org.

Section 3. Information about the Project


Gutenberg Literary Archive Foundation
The Project Gutenberg Literary Archive Foundation is a non-
profit 501(c)(3) educational corporation organized under the
laws of the state of Mississippi and granted tax exempt status
by the Internal Revenue Service. The Foundation’s EIN or
federal tax identification number is 64-6221541. Contributions
to the Project Gutenberg Literary Archive Foundation are tax
deductible to the full extent permitted by U.S. federal laws and
your state’s laws.

The Foundation’s business office is located at 809 North 1500


West, Salt Lake City, UT 84116, (801) 596-1887. Email contact
links and up to date contact information can be found at the
Foundation’s website and official page at
www.gutenberg.org/contact
Section 4. Information about Donations to
the Project Gutenberg Literary Archive
Foundation
Project Gutenberg™ depends upon and cannot survive without
widespread public support and donations to carry out its mission
of increasing the number of public domain and licensed works
that can be freely distributed in machine-readable form
accessible by the widest array of equipment including outdated
equipment. Many small donations ($1 to $5,000) are particularly
important to maintaining tax exempt status with the IRS.

The Foundation is committed to complying with the laws


regulating charities and charitable donations in all 50 states of
the United States. Compliance requirements are not uniform
and it takes a considerable effort, much paperwork and many
fees to meet and keep up with these requirements. We do not
solicit donations in locations where we have not received written
confirmation of compliance. To SEND DONATIONS or determine
the status of compliance for any particular state visit
www.gutenberg.org/donate.

While we cannot and do not solicit contributions from states


where we have not met the solicitation requirements, we know
of no prohibition against accepting unsolicited donations from
donors in such states who approach us with offers to donate.

International donations are gratefully accepted, but we cannot


make any statements concerning tax treatment of donations
received from outside the United States. U.S. laws alone swamp
our small staff.

Please check the Project Gutenberg web pages for current


donation methods and addresses. Donations are accepted in a
number of other ways including checks, online payments and
credit card donations. To donate, please visit:
www.gutenberg.org/donate.

Section 5. General Information About


Project Gutenberg™ electronic works
Professor Michael S. Hart was the originator of the Project
Gutenberg™ concept of a library of electronic works that could
be freely shared with anyone. For forty years, he produced and
distributed Project Gutenberg™ eBooks with only a loose
network of volunteer support.

Project Gutenberg™ eBooks are often created from several


printed editions, all of which are confirmed as not protected by
copyright in the U.S. unless a copyright notice is included. Thus,
we do not necessarily keep eBooks in compliance with any
particular paper edition.

Most people start at our website which has the main PG search
facility: www.gutenberg.org.

This website includes information about Project Gutenberg™,


including how to make donations to the Project Gutenberg
Literary Archive Foundation, how to help produce our new
eBooks, and how to subscribe to our email newsletter to hear
about new eBooks.
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

textbookfull.com

You might also like