TheAlgorithms/C++ 1.0.0
All the algorithms implemented in C++
Loading...
Searching...
No Matches
sublist_search.cpp File Reference

Implementation of the Sublist Search Algorithm More...

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

Go to the source code of this file.

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

namespace  search
 for std::assert
 
namespace  sublist_search
 

Functions

void search::sublist_search::printLinkedList (Node *start)
 A simple function to print the linked list.
 
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.
 
void search::sublist_search::deleteList (Node *const root)
 
bool search::sublist_search::sublistSearch (Node *sublist, Node *mainList)
 Main searching function.
 
static void test ()
 Self-test implementations.
 
int main (int argc, char *argv[])
 Main function.
 

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

Definition in file sublist_search.cpp.

Function Documentation

◆ deleteList()

void search::sublist_search::deleteList ( Node *const root)

Definition at line 101 of file sublist_search.cpp.

101 {
102 if (root != NULL) {
103 deleteList(root->next);
104 delete root;
105 }
106}

◆ 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

Definition at line 360 of file sublist_search.cpp.

360 {
361 test(); // run self-test implementations
362
363 std::vector<uint64_t> mainlistData = {
364 2, 5, 6, 7, 8};
365 std::vector<uint64_t> sublistData = {6, 8};
366
367 search::sublist_search::Node *mainlistLL =
371 sublistData);
373
375 sublistLL,
376 mainlistLL);
377
378 std::cout << "Sublist: " << std::endl;
380
381 std::cout << "Main list: " << std::endl;
383 std::cout << std::endl;
384
385 if (exists) {
386 std::cout << "[TRUE] - sublist found in main list\n";
387 } else {
388 std::cout << "[FALSE] - sublist NOT found in main list\n";
389 }
390
391 deleteList(mainlistLL);
392 deleteList(sublistLL);
393 return 0;
394}
A Node structure representing a single link Node in a linked list.
bool sublistSearch(Node *sublist, Node *mainList)
Main searching function.
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...
static void test()
Self-test implementations.
void printLinkedList(Node *start)
A simple function to print the linked list.
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.

◆ 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.

Definition at line 74 of file sublist_search.cpp.

74 {
77 Node *head = nullptr;
78 Node *tail = nullptr;
79 for (int i : data) {
80 Node *node = new Node;
81 node->data = i;
82 node->next = nullptr;
83 if (head == nullptr) {
84 head = node;
85 tail = node;
86 } else {
87 tail->next = node;
88 tail = tail->next;
89 }
90 }
91 return head;
92}
struct node { int data; int height; struct node *left; struct node *right;} node
for std::queue
Definition avltree.cpp:13
int data[MAX]
test data

◆ 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

Definition at line 58 of file sublist_search.cpp.

58 {
59 while (start != nullptr) {
60 std::cout << "->" << start->data;
61 start = start->next;
62 }
63 std::cout << std::endl;
64}

◆ 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

Definition at line 115 of file sublist_search.cpp.

115 {
116 if (sublist == nullptr || mainList == nullptr) {
117 return false;
118 }
119
121 Node *target_ptr = sublist;
122
123 while (mainList != nullptr) {
125 Node *main_ptr = mainList;
126
127 while (target_ptr != nullptr) {
128 if (main_ptr == nullptr) {
129 return false;
130
131 } else if (main_ptr->data == target_ptr->data) {
134 target_ptr = target_ptr->next;
135 main_ptr = main_ptr->next;
136
137 } else {
138 break;
139 }
140 }
141
142 if (target_ptr == nullptr) {
146 return true;
147 }
148
150 target_ptr = sublist;
151
154 mainList = mainList->next;
155 }
156
159 return false;
160}

◆ test()

static void test ( )
static

Self-test implementations.

Returns
void

Definition at line 349 of file sublist_search.cpp.

349 {
350 TestCases tc;
351 tc.runTests();
352}
class encapsulating the necessary test cases
void runTests()
Executes test cases.