Algorithms_in_C++  1.0.0
Set of algorithms implemented in C++.
sublist_search.cpp File Reference

Implementation of the Sublist Search Algorithm More...

#include <cassert>
#include <iostream>
#include <vector>
Include dependency graph for sublist_search.cpp:

Classes

struct  search::sublist_search::Node
 A Node structure representing a single link Node in a linked list. More...
 
class  TestCases
 class encapsulating the necessary test cases More...
 

Namespaces

 search
 for std::vector
 
 

Functions

void search::sublist_search::printLinkedList (Node *start)
 A simple function to print the linked list. More...
 
Nodesearch::sublist_search::makeLinkedList (const std::vector< uint64_t > &data)
 Give a vector of data, it adds each element of vector in the linked list and return the address of head pointer. More...
 
bool search::sublist_search::sublistSearch (Node *sublist, Node *mainList)
 Main searching function. More...
 
static void test ()
 Self-test implementations. More...
 
int main (int argc, char *argv[])
 Main function. More...
 

Detailed Description

Implementation of the Sublist Search Algorithm

Algorithm

  • Sublist search is used to detect a presence of one list in another list.
  • Suppose we have a single-node list (let's say the first list), and we want to ensure that the list is present in another list (let's say the second list), then we can perform the sublist search to find it.
  • For instance, the first list contains these elements: 23 -> 30 -> 41, and the second list contains these elements: 10 -> 15 -> 23 -> 30 -> 41 -> 49. At a glance, we see that the first list presents in the second list.

Working

  • The sublist search algorithm works by comparing the first element of the first list with the first element of the second list.
  • If the two values don't match, it goes to the next element of the second list. It does this until the two values match.
Author
Nitin Sharma

Function Documentation

◆ main()

int main ( int  argc,
char *  argv[] 
)

Main function.

Parameters
argccommandline argument count (ignored)
argvcommandline array of arguments (ignored)
Returns
0 on exit

< Main list in which sublist is to be searched

< Sublist to be searched

< Main list in which sublist is to be searched

< boolean to check if the sublist exists or not

339  {
340  test(); // run self-test implementations
341 
342  std::vector<uint64_t> mainlistData = {
343  2, 5, 6, 7, 8}; ///< Main list in which sublist is to be searched
344  std::vector<uint64_t> sublistData = {6, 8}; ///< Sublist to be searched
345 
346  search::sublist_search::Node *mainlistLL =
348  search::sublist_search::Node *sublistLL =
350  sublistData); ///< Main list in which sublist is to be
351  ///< searched
352 
354  sublistLL,
355  mainlistLL); ///< boolean to check if the sublist exists or not
356 
357  std::cout << "Sublist: " << std::endl;
359 
360  std::cout << "Main list: " << std::endl;
362  std::cout << std::endl;
363 
364  if (exists) {
365  std::cout << "[TRUE] - sublist found in main list\n";
366  } else {
367  std::cout << "[FALSE] - sublist NOT found in main list\n";
368  }
369  return 0;
370 }
T endl(T... args)
A Node structure representing a single link Node in a linked list.
Definition: sublist_search.cpp:47
bool sublistSearch(Node *sublist, Node *mainList)
Main searching function.
Definition: sublist_search.cpp:100
static void test()
Self-test implementations.
Definition: sublist_search.cpp:328
Node * makeLinkedList(const std::vector< uint64_t > &data)
Give a vector of data, it adds each element of vector in the linked list and return the address of he...
Definition: sublist_search.cpp:73
void printLinkedList(Node *start)
A simple function to print the linked list.
Definition: sublist_search.cpp:57
bool exists(const std::string &str, const std::unordered_set< std::string > &strSet)
Function that checks if the string passed in param is present in the the unordered_set passed.
Definition: word_break.cpp:60
Here is the call graph for this function:

◆ makeLinkedList()

Node* search::sublist_search::makeLinkedList ( const std::vector< uint64_t > &  data)

Give a vector of data, it adds each element of vector in the linked list and return the address of head pointer.

Parameters
dataA vector of "int" containing the data that is supposed to be stored in nodes of linked list.
Returns
Node* A head pointer to the linked list.

This is used in test cases for rapidly creating linked list with 100+ elements, instead of hard-coding 100 elements in test cases.

73  {
74  /// This is used in test cases for rapidly creating linked list with 100+
75  /// elements, instead of hard-coding 100 elements in test cases.
76  Node *head = nullptr;
77  Node *tail = nullptr;
78  for (int i : data) {
79  Node *node = new Node;
80  node->data = i;
81  node->next = nullptr;
82  if (head == nullptr) {
83  head = node;
84  tail = node;
85  } else {
86  tail->next = node;
87  tail = tail->next;
88  }
89  }
90  return head;
91 }
int data[MAX]
test data
Definition: hash_search.cpp:24
struct list node
Definition: linkedlist_implentation_usingarray.cpp:14
Definition: avltree.cpp:13
Here is the call graph for this function:

◆ printLinkedList()

void search::sublist_search::printLinkedList ( Node start)

A simple function to print the linked list.

Parameters
startThe head of the linked list
Returns
void
57  {
58  while (start != nullptr) {
59  std::cout << "->" << start->data;
60  start = start->next;
61  }
63 }
Here is the call graph for this function:

◆ sublistSearch()

bool search::sublist_search::sublistSearch ( Node sublist,
Node mainList 
)

Main searching function.

Parameters
sublistA linked list which is supposed to be searched in mainList.
mainListA linked list in which sublist will be searched.
Returns
true if the sublist is found
false if the sublist is NOT found

Initialize target pointer to the head node of sublist.

Initialize main pointer to the current node of main list.

If the data of target node and main node is equal then move to the next node of both lists.

Is target pointer becomes null that means the target list is been traversed without returning false. Which means the sublist has been found and return ture.

set the target pointer again to stating point of target list.

set the main pointer to the next element of the main list and repeat the algo.

If the main list is exhausted, means sublist does not found, return false

100  {
101  if (sublist == nullptr || mainList == nullptr) {
102  return false;
103  }
104 
105  /// Initialize target pointer to the head node of sublist.
106  Node *target_ptr = sublist;
107 
108  while (mainList != nullptr) {
109  /// Initialize main pointer to the current node of main list.
110  Node *main_ptr = mainList;
111 
112  while (target_ptr != nullptr) {
113  if (main_ptr == nullptr) {
114  return false;
115 
116  } else if (main_ptr->data == target_ptr->data) {
117  /// If the data of target node and main node is equal then move
118  /// to the next node of both lists.
119  target_ptr = target_ptr->next;
120  main_ptr = main_ptr->next;
121 
122  } else {
123  break;
124  }
125  }
126 
127  if (target_ptr == nullptr) {
128  /// Is target pointer becomes null that means the target list is
129  /// been traversed without returning false. Which means the sublist
130  /// has been found and return ture.
131  return true;
132  }
133 
134  /// set the target pointer again to stating point of target list.
135  target_ptr = sublist;
136 
137  /// set the main pointer to the next element of the main list and repeat
138  /// the algo.
139  mainList = mainList->next;
140  }
141 
142  /// If the main list is exhausted, means sublist does not found, return
143  /// false
144  return false;
145 }
Here is the call graph for this function:

◆ test()

static void test ( )
static

Self-test implementations.

Returns
void
328  {
329  TestCases tc;
330  tc.runTests();
331 }
class encapsulating the necessary test cases
Definition: inorder_successor_of_bst.cpp:225
void runTests()
Executes test cases.
Definition: inorder_successor_of_bst.cpp:243
Here is the call graph for this function: