当我尝试在 c++

问题描述

这是我的 DFS 函数。虽然我在主函数中分配了visited数组,但我不知道为什么visited[start_vertex]不起作用!

                    typedef Node** PtP;
                    void DFS(PtP list,int start_vertex,bool* visited)
                    {
                        cout << "the crash under this line";
                        if (visited[start_vertex])
                        {
                            cout << "ignore";
                        }
                        visited[start_vertex] = true;
                        Node* adj = list[start_vertex];  // linked list list[0]
                        //  after this line start_vertex will be adjacency vertex of start vertex
                        while (adj != NULL)
                        {
    
    
                            DFS(list,adj->data,visited);
                            adj = adj->next;
    
                        }
                    }

这是我的主要功能,我创建了一个 bool 数组并通过四个元素分配了它并插入了 DFS 功能

int main()
{
    PtP list;
    list = new Node * [4];
    for (int i = 0; i < 4; i++)
    {
        list[i] = new Node[4];
        list[i] = NULL;
    }

    for (int i = 0; i < 4; i++)
    {
        cout << "enter number of vertices adjacency with " << i << ": ";
        int temp;
        cin >> temp;
        addEdge2(list,i,temp);
    }

    for (int i = 0; i < 4; i++)
    {
        cout << "list[" << i << "]: ";
        traverse(list[i]);
    }
    bool* visited = new bool[4];
    for (int i = 0; i < 4; i++)
    {
        visited = false;
    }
    DFS(list,visited);
    for (int i = 0; i < 4; i++)
    {
        cout << "visisted: " << visited[i] << " ";
    }
    for (int i = 0; i < 4; i++)
    {
        delete [] list[i];
    }
    delete [] list;
    return 0;

}

这是我的整个程序,仅用于测试 DFS 方法

#include <iostream>

using namespace std;
class Node {
public: 
    int data;
    Node* next;
    
};
typedef Node* Ptr;
typedef Node** PtP;

void addFront(Ptr& First,int x)
{
    Ptr p;
    p = new Node;
    p->data = x;
    p->next = First;
    First = p;
}
void addEdge(PtP &list,int v1,int v2)
{
    addFront(list[v1],v2);
    addFront(list[v2],v1);

}

void addEdge2(PtP& list,int v,int num_of_adj_vtex)
{
    cout << "enter vertices adjacency with  " << v << ": ";
    int temp;
    for (int i = 0; i < num_of_adj_vtex; i++)
    {
        cin >> temp;
        addFront(list[v],temp);
    }
}
void traverse(Node* first)
{
    Node* p = first;
    while (p != NULL)
    {
        cout << p->data<<" ";
        p = p->next;
    }
    cout << "\n";
}


void DFS(PtP list,bool* visited)
{
    
    if (visited[start_vertex])
    {
        
        cout << "vertex: " << start_vertex << " visited ";
    }
    visited[start_vertex] = true;
     // linked list list[0] after this line start_vertex will be adjaceny vertex of start vertex
    Node* adj = list[start_vertex];
    while (adj != NULL)
    {


        DFS(list,visited);
        adj = adj->next;

    }
}
int main()
{
    PtP list; //type def node ** ptp
    list = new Node * [4];
    for (int i = 0; i < 4; i++)
    {
        list[i] = NULL;
    }

    for (int i = 0; i < 4; i++)
    {
        cout << "enter number of vertices adjacency with " << i << ": ";
        int temp;
        cin >> temp;
        addEdge2(list,temp);
    }

    for (int i = 0; i < 4; i++)
    {
        cout << "list[" << i << "]: ";
        traverse(list[i]);
    }
    bool* visited = new bool[4];
    for (int i = 0; i < 4; i++)
    {
        visited[i] = false;
    }
    DFS(list,visited);
    for (int i = 0; i < 4; i++)
    {
        cout << "visisted: " << i << " "<< visited[i] << " ";
    }




    delete [] list;
    return 0;

}

解决方法

好的,据我所知,问题似乎与用户输入有关。方法:

void addEdge2(PtP& list,int v,int num_of_adj_vtex)
{
    cout << "enter vertices adjacency with  " << v << ": ";
    int temp;
    for (int i = 0; i < num_of_adj_vtex; i++)
    {
        cin >> temp;
        addFront(list[v],temp); //Here if temp > 3 your later code will fail.
    }
}

请求用户输入并将其存储在列表的前面...无论 temp 的值是什么,并将其放入数据字段。

稍后当您执行 DFS 方法时,您会递归调用相同的方法:

        DFS(list,adj->data,visited);
        adj = adj->next;

这取决于 adj->data 存储了什么,来自 addEdge2 函数。由于您已将布尔数组的长度设置为 4,因此该 adj->data 必须指向任何大于 3 的值,这将引发您提到的错误,因为它正在尝试访问未分配的内存。

看起来代码没有错,确切地说,即使您可以设置一些保护措施,例如确保用户输入 0 到 3 之间的值。