深度优先搜索和; C ++中的广度优先搜索实现

时间:2014-04-18 07:09:37

标签: c++ graph depth-first-search breadth-first-search pointer-to-pointer

我是一个初级编码器,我正在编码dfs bfs,但它重新显示错误,我已经分配了一个节点数组,我已经使用指针指针,但是当我为每个数组成员的元素赋值时,它显示错误。这是唯一的错误ACCORF = DING TO ME,DIND HELP !!

 struct node
{

int dat;
int vstd;
struct node *nxt;
};

struct node **graph=(struct node**)malloc(5*sizeof(struct node*));

void initial()

{
    for(int i=0;i<5;i++)
       struct node *(graph[i])=(struct node*)malloc(sizeof(struct node));
}

struct node *head=NULL;
void visited(struct node *strt)
{
    struct node *temp;

for(int i=0;i<5;i++)

    {
        temp=graph[i];

        while(temp!=NULL)

        {

            if(temp->dat==strt->dat)

            temp->vstd=1;

            temp=temp->nxt;

        }

    }

}

struct node* find(struct node *gelem)

{

    for(int i=0;i<5;i++)

    {

        if(graph[i]->dat==gelem->dat)

        return(graph[i]);

    }

    return NULL;

}

void dfs(struct node *gelem)

{

    struct node *temp;

    visited(gelem);

    cout<<gelem->dat<<endl;

    temp=find(gelem);

    while(temp!=NULL)

    {

        if(temp->vstd!=1)

        {

            dfs(temp);

        }

        temp=temp->nxt;

    }

}

void dpthfrst()

{

    struct node *temp;

    for(int v=0;v<5;v++)

    {

        temp=graph[v];

        while(temp!=NULL)

        {

            temp->vstd=0;

            temp=temp->nxt;

        }



    }

    for(int v=0;v<5;v++)

    {

        temp=graph[v];

        while(temp!=NULL)

        {

           if(temp->vstd!=1)

           dfs(temp);

           temp=temp->nxt;

        }

    }

}


void bfs(struct node *grtemp)

{

           struct node *head,*temp,*tmp2,*tmp3;

           ins(head,grtemp);

           do

           {

           temp=del(head);

           visited(temp);

           cout<<temp->dat<<endl;

           tmp2=temp->nxt;

           while(tmp2!=NULL)

           {

               tmp3=find(tmp2);

               ins(head,tmp3);

           }

           }while(!isemp(head));


}


void brthfrst()

{

    struct node *temp;

    for(int v=0;v<5;v++)

    {

        temp=graph[v];

        while(temp!=NULL)

        {

            temp->vstd=0;

            temp=temp->nxt;

        }


    }

    for(int v=0;v<5;v++)

    {

        temp=graph[v];

        while(temp!=NULL)
        {

           if(temp->vstd!=1)

           bfs(temp);

           temp=temp->nxt;

        }

    }

}

void insrtnode()

{

    struct node *temp;

    struct node *nnode=(struct node*)malloc(sizeof(struct node));

    struct node *tnode=(struct node*)malloc(sizeof(struct node));

    int s,d,f1=0,f2=0;

    cout<<"Insert the connection"<<endl;

    cin>>s;

    cin>>d;

    nnode->dat=s;

    nnode->nxt=NULL;

    nnode->vstd=0;

    tnode->dat=d;

    tnode->nxt=NULL;

    tnode->vstd=0;



    for(int i=0;i<5;i++)

    {

        if(graph[i]->dat==s)

            f1=1;

        if(graph[i]->dat==d)

            f2=1;



    }

    if(f1==0 && f2==0 && cnt<3)
    {

        for(int i=0;i<5;i++)

        {

            if(graph[i]==NULL)

            {

                graph[i]=nnode;

                graph[i]->nxt=tnode;

                graph[i++]=tnode;

                cnt+=2;

                break;

            }

        }

    }
   else if((f1==1 && f2==0 && cnt<4)||(f1==0 && f2 ==1 && cnt<4 ))


   {

       if(f1==1)

       {

           for(int i=0;i<5;i++)

           {

               if(graph[i]->dat==s)

               {

                   temp=graph[i];

                   while(temp->nxt!=NULL)

                    temp=temp->nxt;

                   temp->nxt=tnode;

               }

               if(graph[i]==NULL)

               {

                   graph[i]=tnode;

                   cnt++;

                   return;

               }

           }

       }

       if(f2==1)

       {
           for(int i=0;i<5;i++)
           {

               if(graph[i]==NULL)
               {
                   graph[i]=nnode;
                   graph[i]->nxt=tnode;
                   cnt++;
                   return;
               }
           }
       }
   }
       else

       {
           cout<<"Not a valid insertion";
           return;
       }
}

int main()
{
    initial();
    int ch;
    char ans;
    do
    {

        cout<<"1.INSERT\n 2.DFS \n 3.BFS\n";
        cin>>ch;
        switch(ch)
        {
            case 1: insrtnode();
                    break;
            case 2:dpthfrst();
                   break;
            case 3:brthfrst();
                   break;
            default :cout<<"Invalid \n";
        }
        cout<<"Do you want to continue?(y/n)";
        cin>>ans;
    }
    while(ans=='y'||ans=='Y'); 
    return 0;
}

1 个答案:

答案 0 :(得分:0)

void initial()

{
    for(int i=0; i<5; i++)
        struct node *(graph[i])=(struct node*)malloc(sizeof(struct node));
}

struct node *(graph[i])中,当您宣布该位置时,您正在访问其i位置。应该是这样的

graph[i]=(struct node*)malloc(sizeof(struct node));

在insrtnode函数中

if(f1==0 && f2==0 && cnt<3)
    {

        for(int i=0;i<5;i++)

        {

            if(graph[i]==NULL)

            {

                graph[i]=nnode;

                graph[i]->nxt=tnode;

                graph[i++]=tnode;

                cnt+=2;

                break;

            }

        }

    }

graph[i++]=tnode;

应该是

graph[++i]=tnode;

还尝试将变量名称更改为更有意义的名称,以便其他人可以调试。还在您的代码中添加了一些注释。你这篇文章的初衷是删除编译错误。这是固定的。现在我建议你重构代码并自己开始调试。