Graph implementation in C++ using adjacency list

Multi tool use
Multi tool use











up vote
1
down vote

favorite
1












there is my final code for implementing a Graph in C++ using adjacency list and Object-oriented. I got some help from StackOverflow and it was really helpful, but now I would ask about some advice for improving and a possible way of implementing two functions: isPath( v, w ) for finding if two nodes are connected and isConnected(graph) returning "yes" if the graph is strongly connected otherwise "no".



The code:



#include <iostream>
#include <vector>

using namespace std;

struct Edge {
int source;
int target;
};

class Graph
{
private:
int numOfNodes;
vector<vector<int>> baseVec;

public:
Graph(int numOfNodes) : numOfNodes(numOfNodes), baseVec(numOfNodes) {}

void newEdge(Edge edge) {
if (edge.source >= numOfNodes || edge.target >= numOfNodes
|| edge.source < 0 || edge.target < 0) {
cout << "Invalid edge!n";
return;
}
baseVec[edge.source].emplace_back(edge.target);
baseVec[edge.target].emplace_back(edge.source);
}

void display() {
for (vector<vector<int>>::size_type i = 0; i < baseVec.size(); i++) {
cout << "n Adjacency list of vertex " << i << "n head: ";
for (vector<int>::size_type j = 0; j < baseVec[i].size(); j++)
cout << baseVec[i][j] << " ";
std::cout << std::endl;
}
}
};

int main() {
int vertex;
cout << "Enter number of nodes: ";
cin >> vertex;

Graph graph(vertex);

while (true) {
int source, target;
cout << "Enter edge ex.1 2 (-1 -1 to exit): n";
cin >> source >> target;
if ((source == -1) && (target == -1))
break;
graph.newEdge({ source, target });
}
graph.display();
return 0;
}


I really can't find many things to change, so I wrote the isConnected() function. Maybe it has some weaknesses or errors. Hope it's useful and I'm still waiting for advice. Thank you!



Code inside the class:



    bool isConected(std::vector<int> nodeVec)
{

for (st

d::vector<std::vector<int>>::size_type i = 0; i < baseVec.size(); i++)
{
if (baseVec[i].empty())
{
return false;
}
}
for (std::vector<std::vector<int>>::size_type i = 0; i < baseVec.size(); i++)
{
for (std::vector<int>::size_type j = 0; j < baseVec[i].size() + 1; j++)
{
if (baseVec[i][j] == nodeVec[j + 1])
{
return true;
}
}
}
}


The line in main:



std::vector<int> nodeVec;
for (int i = 0; i < vertex; i++)
{
nodeVec.emplace_back(i);
}


And:



if (graph.isConected(nodeVec) == true)
{
std::cout << "Yesn";
}
else
{
std::cout << "Non";
}









share|improve this question









New contributor




Mitko Donchev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
























    up vote
    1
    down vote

    favorite
    1












    there is my final code for implementing a Graph in C++ using adjacency list and Object-oriented. I got some help from StackOverflow and it was really helpful, but now I would ask about some advice for improving and a possible way of implementing two functions: isPath( v, w ) for finding if two nodes are connected and isConnected(graph) returning "yes" if the graph is strongly connected otherwise "no".



    The code:



    #include <iostream>
    #include <vector>

    using namespace std;

    struct Edge {
    int source;
    int target;
    };

    class Graph
    {
    private:
    int numOfNodes;
    vector<vector<int>> baseVec;

    public:
    Graph(int numOfNodes) : numOfNodes(numOfNodes), baseVec(numOfNodes) {}

    void newEdge(Edge edge) {
    if (edge.source >= numOfNodes || edge.target >= numOfNodes
    || edge.source < 0 || edge.target < 0) {
    cout << "Invalid edge!n";
    return;
    }
    baseVec[edge.source].emplace_back(edge.target);
    baseVec[edge.target].emplace_back(edge.source);
    }

    void display() {
    for (vector<vector<int>>::size_type i = 0; i < baseVec.size(); i++) {
    cout << "n Adjacency list of vertex " << i << "n head: ";
    for (vector<int>::size_type j = 0; j < baseVec[i].size(); j++)
    cout << baseVec[i][j] << " ";
    std::cout << std::endl;
    }
    }
    };

    int main() {
    int vertex;
    cout << "Enter number of nodes: ";
    cin >> vertex;

    Graph graph(vertex);

    while (true) {
    int source, target;
    cout << "Enter edge ex.1 2 (-1 -1 to exit): n";
    cin >> source >> target;
    if ((source == -1) && (target == -1))
    break;
    graph.newEdge({ source, target });
    }
    graph.display();
    return 0;
    }


    I really can't find many things to change, so I wrote the isConnected() function. Maybe it has some weaknesses or errors. Hope it's useful and I'm still waiting for advice. Thank you!



    Code inside the class:



        bool isConected(std::vector<int> nodeVec)
    {

    for (st

    d::vector<std::vector<int>>::size_type i = 0; i < baseVec.size(); i++)
    {
    if (baseVec[i].empty())
    {
    return false;
    }
    }
    for (std::vector<std::vector<int>>::size_type i = 0; i < baseVec.size(); i++)
    {
    for (std::vector<int>::size_type j = 0; j < baseVec[i].size() + 1; j++)
    {
    if (baseVec[i][j] == nodeVec[j + 1])
    {
    return true;
    }
    }
    }
    }


    The line in main:



    std::vector<int> nodeVec;
    for (int i = 0; i < vertex; i++)
    {
    nodeVec.emplace_back(i);
    }


    And:



    if (graph.isConected(nodeVec) == true)
    {
    std::cout << "Yesn";
    }
    else
    {
    std::cout << "Non";
    }









    share|improve this question









    New contributor




    Mitko Donchev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.






















      up vote
      1
      down vote

      favorite
      1









      up vote
      1
      down vote

      favorite
      1






      1





      there is my final code for implementing a Graph in C++ using adjacency list and Object-oriented. I got some help from StackOverflow and it was really helpful, but now I would ask about some advice for improving and a possible way of implementing two functions: isPath( v, w ) for finding if two nodes are connected and isConnected(graph) returning "yes" if the graph is strongly connected otherwise "no".



      The code:



      #include <iostream>
      #include <vector>

      using namespace std;

      struct Edge {
      int source;
      int target;
      };

      class Graph
      {
      private:
      int numOfNodes;
      vector<vector<int>> baseVec;

      public:
      Graph(int numOfNodes) : numOfNodes(numOfNodes), baseVec(numOfNodes) {}

      void newEdge(Edge edge) {
      if (edge.source >= numOfNodes || edge.target >= numOfNodes
      || edge.source < 0 || edge.target < 0) {
      cout << "Invalid edge!n";
      return;
      }
      baseVec[edge.source].emplace_back(edge.target);
      baseVec[edge.target].emplace_back(edge.source);
      }

      void display() {
      for (vector<vector<int>>::size_type i = 0; i < baseVec.size(); i++) {
      cout << "n Adjacency list of vertex " << i << "n head: ";
      for (vector<int>::size_type j = 0; j < baseVec[i].size(); j++)
      cout << baseVec[i][j] << " ";
      std::cout << std::endl;
      }
      }
      };

      int main() {
      int vertex;
      cout << "Enter number of nodes: ";
      cin >> vertex;

      Graph graph(vertex);

      while (true) {
      int source, target;
      cout << "Enter edge ex.1 2 (-1 -1 to exit): n";
      cin >> source >> target;
      if ((source == -1) && (target == -1))
      break;
      graph.newEdge({ source, target });
      }
      graph.display();
      return 0;
      }


      I really can't find many things to change, so I wrote the isConnected() function. Maybe it has some weaknesses or errors. Hope it's useful and I'm still waiting for advice. Thank you!



      Code inside the class:



          bool isConected(std::vector<int> nodeVec)
      {

      for (st

      d::vector<std::vector<int>>::size_type i = 0; i < baseVec.size(); i++)
      {
      if (baseVec[i].empty())
      {
      return false;
      }
      }
      for (std::vector<std::vector<int>>::size_type i = 0; i < baseVec.size(); i++)
      {
      for (std::vector<int>::size_type j = 0; j < baseVec[i].size() + 1; j++)
      {
      if (baseVec[i][j] == nodeVec[j + 1])
      {
      return true;
      }
      }
      }
      }


      The line in main:



      std::vector<int> nodeVec;
      for (int i = 0; i < vertex; i++)
      {
      nodeVec.emplace_back(i);
      }


      And:



      if (graph.isConected(nodeVec) == true)
      {
      std::cout << "Yesn";
      }
      else
      {
      std::cout << "Non";
      }









      share|improve this question









      New contributor




      Mitko Donchev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      there is my final code for implementing a Graph in C++ using adjacency list and Object-oriented. I got some help from StackOverflow and it was really helpful, but now I would ask about some advice for improving and a possible way of implementing two functions: isPath( v, w ) for finding if two nodes are connected and isConnected(graph) returning "yes" if the graph is strongly connected otherwise "no".



      The code:



      #include <iostream>
      #include <vector>

      using namespace std;

      struct Edge {
      int source;
      int target;
      };

      class Graph
      {
      private:
      int numOfNodes;
      vector<vector<int>> baseVec;

      public:
      Graph(int numOfNodes) : numOfNodes(numOfNodes), baseVec(numOfNodes) {}

      void newEdge(Edge edge) {
      if (edge.source >= numOfNodes || edge.target >= numOfNodes
      || edge.source < 0 || edge.target < 0) {
      cout << "Invalid edge!n";
      return;
      }
      baseVec[edge.source].emplace_back(edge.target);
      baseVec[edge.target].emplace_back(edge.source);
      }

      void display() {
      for (vector<vector<int>>::size_type i = 0; i < baseVec.size(); i++) {
      cout << "n Adjacency list of vertex " << i << "n head: ";
      for (vector<int>::size_type j = 0; j < baseVec[i].size(); j++)
      cout << baseVec[i][j] << " ";
      std::cout << std::endl;
      }
      }
      };

      int main() {
      int vertex;
      cout << "Enter number of nodes: ";
      cin >> vertex;

      Graph graph(vertex);

      while (true) {
      int source, target;
      cout << "Enter edge ex.1 2 (-1 -1 to exit): n";
      cin >> source >> target;
      if ((source == -1) && (target == -1))
      break;
      graph.newEdge({ source, target });
      }
      graph.display();
      return 0;
      }


      I really can't find many things to change, so I wrote the isConnected() function. Maybe it has some weaknesses or errors. Hope it's useful and I'm still waiting for advice. Thank you!



      Code inside the class:



          bool isConected(std::vector<int> nodeVec)
      {

      for (st

      d::vector<std::vector<int>>::size_type i = 0; i < baseVec.size(); i++)
      {
      if (baseVec[i].empty())
      {
      return false;
      }
      }
      for (std::vector<std::vector<int>>::size_type i = 0; i < baseVec.size(); i++)
      {
      for (std::vector<int>::size_type j = 0; j < baseVec[i].size() + 1; j++)
      {
      if (baseVec[i][j] == nodeVec[j + 1])
      {
      return true;
      }
      }
      }
      }


      The line in main:



      std::vector<int> nodeVec;
      for (int i = 0; i < vertex; i++)
      {
      nodeVec.emplace_back(i);
      }


      And:



      if (graph.isConected(nodeVec) == true)
      {
      std::cout << "Yesn";
      }
      else
      {
      std::cout << "Non";
      }






      c++ object-oriented functional-programming graph






      share|improve this question









      New contributor




      Mitko Donchev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      Mitko Donchev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited 7 hours ago





















      New contributor




      Mitko Donchev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 20 hours ago









      Mitko Donchev

      386




      386




      New contributor




      Mitko Donchev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Mitko Donchev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Mitko Donchev is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          Some comments -





          • cout << "Invalid edge" is not a sane error-relaying mechanism. The C++ way to do things is to throw an exception. The calling code could catch the exception and print an error, or could let the app exit if this is a serious-enough error.


          • void display() needs to be void display() const. It doesn't modify anything.

          • Don't iterate through an STL container using an integer index. Iterate using an iterator. If you don't know what I mean, google around or read https://www.geeksforgeeks.org/iterators-c-stl/






          share|improve this answer





















            Your Answer





            StackExchange.ifUsing("editor", function () {
            return StackExchange.using("mathjaxEditing", function () {
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
            });
            });
            }, "mathjax-editing");

            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "196"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });






            Mitko Donchev is a new contributor. Be nice, and check out our Code of Conduct.










             

            draft saved


            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f207796%2fgraph-implementation-in-c-using-adjacency-list%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            0
            down vote













            Some comments -





            • cout << "Invalid edge" is not a sane error-relaying mechanism. The C++ way to do things is to throw an exception. The calling code could catch the exception and print an error, or could let the app exit if this is a serious-enough error.


            • void display() needs to be void display() const. It doesn't modify anything.

            • Don't iterate through an STL container using an integer index. Iterate using an iterator. If you don't know what I mean, google around or read https://www.geeksforgeeks.org/iterators-c-stl/






            share|improve this answer

























              up vote
              0
              down vote













              Some comments -





              • cout << "Invalid edge" is not a sane error-relaying mechanism. The C++ way to do things is to throw an exception. The calling code could catch the exception and print an error, or could let the app exit if this is a serious-enough error.


              • void display() needs to be void display() const. It doesn't modify anything.

              • Don't iterate through an STL container using an integer index. Iterate using an iterator. If you don't know what I mean, google around or read https://www.geeksforgeeks.org/iterators-c-stl/






              share|improve this answer























                up vote
                0
                down vote










                up vote
                0
                down vote









                Some comments -





                • cout << "Invalid edge" is not a sane error-relaying mechanism. The C++ way to do things is to throw an exception. The calling code could catch the exception and print an error, or could let the app exit if this is a serious-enough error.


                • void display() needs to be void display() const. It doesn't modify anything.

                • Don't iterate through an STL container using an integer index. Iterate using an iterator. If you don't know what I mean, google around or read https://www.geeksforgeeks.org/iterators-c-stl/






                share|improve this answer












                Some comments -





                • cout << "Invalid edge" is not a sane error-relaying mechanism. The C++ way to do things is to throw an exception. The calling code could catch the exception and print an error, or could let the app exit if this is a serious-enough error.


                • void display() needs to be void display() const. It doesn't modify anything.

                • Don't iterate through an STL container using an integer index. Iterate using an iterator. If you don't know what I mean, google around or read https://www.geeksforgeeks.org/iterators-c-stl/







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered 1 hour ago









                Reinderien

                932415




                932415






















                    Mitko Donchev is a new contributor. Be nice, and check out our Code of Conduct.










                     

                    draft saved


                    draft discarded


















                    Mitko Donchev is a new contributor. Be nice, and check out our Code of Conduct.













                    Mitko Donchev is a new contributor. Be nice, and check out our Code of Conduct.












                    Mitko Donchev is a new contributor. Be nice, and check out our Code of Conduct.















                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f207796%2fgraph-implementation-in-c-using-adjacency-list%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    xzN8 QmPo9W,ri5TWGGkG,OLb
                    hRDqVc qnpNakBNPzIw,cvJGjiLoVJwdGNIWMAw3ttH5u3 ugVqZR5mA Pfmc yq,SxnwnCdJG,NGQ8VFp 4GLw1brZbWKQqji4Qr

                    Popular posts from this blog

                    Costa Masnaga

                    Fotorealismo

                    Sidney Franklin