c - 广度优先搜索问题
问题描述
我创建了一个程序,它应该读取图中要存在的顶点数,并且在使用链接列表创建顶点之间的链接时遇到问题。我让它创建顶点并在某些节点之间创建链接,但由于某种原因,当我尝试输入某个顶点作为链接时它会崩溃。
例如,如果我将顶点数指定为 4 并将输入输入为 1 2 3 4 那么接下来要链接的顶点我输入 1 和要链接的顶点为 -1 2 3 输入 3 后它会崩溃,为什么?当我输入 2 作为顶点时,我可以与任何顶点链接。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct BFS_node
{
int data,vis;
struct BFS_node *linknodes;
};
typedef struct BFS_node node;
node *head,*N=NULL;
int num;
void create_node(node **Node)
{
if(*Node==NULL)
{
*Node=(node*)malloc(sizeof(node));
head=*Node;
}
else
*Node=*Node+1;
printf("%d enter the value \n",*Node);
scanf("%d",&(*Node)->data);
(*Node)->linknodes=(node *)malloc(num*sizeof(node));
printf(" %d \n",(*Node)->linknodes);
}
node * search_node(int num,node *head2)
{
while(head2)
{
if(head2->data==num)
return head2;
head2++;
}
}
void linking()
{
node *Dnode,**Lnode;
int num,i=0;
char Snum[10];
printf("enter the number you want to link ");
scanf("%d",&num);
Dnode=search_node(num,head);
printf("%d",Dnode);
while(getchar() != '\n' && getchar()!=EOF);
Lnode=Dnode->linknodes;
printf("enter the linked numbers");
while(fgets(Snum,sizeof(Snum),stdin))
{
if(sscanf(Snum,"%d",&num)!=1)
break;
*Lnode=search_node(num,head);
printf("%d %d",Lnode,*Lnode);
Lnode++;
}
}
BFStraversal()
{
int num,i=0;
node *queue[10],*link;
printf("enter the starting number");
scanf("%d",&num);
queue[i]=search_node(num,head);
link=queue[i]->linknodes;
printf("%d",link->data);
queue[i]->vis=1;
while(queue[i]!=NULL)
{
int j=1;
link=queue[i]->linknodes;
printf("%d",queue[i]->linknodes->data);
while(link->data !=NULL)
{
if(link->vis!=1)
{
queue[i+j]=link;
link->vis=1;
j++;
}
link++;
}
printf("%d",queue[i]->data);
i++;
}
}
int main()
{
printf("enter the number of vertices \n ");
scanf("%d",&num);
for(int i=0;i<num;i++)
create_node(&N);
for(int i=0;i<num;i++)
linking();
BFStraversal();
return 0;
}
解决方案
这是完整的工作代码。感觉松了一口气,这开始烦人了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct BFS_node
{
int data,vis;
struct BFS_node *linknodes;
};
typedef struct BFS_node node;
node *head,*N=NULL;
int num,i=0,count=-1;
int queue[20];
void create_node(node **Node)
{
if(*Node==NULL)
{
*Node=(node*)malloc(num*sizeof(node));
head=*Node;
}
else
*Node=*Node+1;
printf(" enter the value \n");
scanf("%d",&(*Node)->data);
(*Node)->vis=1;
(*Node)->linknodes=(node *)malloc(num*sizeof(node));
printf("address- %d link- %d \n",*Node,(*Node)->linknodes);
}
node * search_node(int num,node *head2)
{
while(head2)
{
if(head2->data==num)
return head2;
head2++;
}
}
void linking()
{
node *Dnode,**Lnode;
int num2,i=0;
char Snum[10];
printf("enter the number you want to link ");
scanf("%d",&num2);
Dnode=search_node(num2,head);
while(getchar() != '\n' && getchar()!=EOF);
Lnode=Dnode->linknodes;
printf("enter the linked numbers\n");
while(fgets(Snum,sizeof(Snum),stdin))
{
node *head2=head;
if(sscanf(Snum,"%d",&num2)!=1)
break;
*Lnode=search_node(num2,head);
printf(" linknode-%d link-%d\n ",Lnode,*Lnode);
Lnode++;
}
*Lnode=0;
}
BFStraversal(int vertex)
{
node *node,*head2=head,**links;
node=search_node(vertex,head);
links=node->linknodes;
node->vis=0;
printf(" %d ",vertex);
while(*links!=0)
{
if((*links)->vis)
{
queue[i]=(*links)->data;
(*links)->vis=0;
i++;
}
links++;
}
if(++count<i)
BFStraversal(queue[count]);
}
int main()
{
printf("enter the number of vertices \n ");
scanf("%d",&num);
for(int i=0;i<num;i++)
create_node(&N);
for(int i=0;i<num;i++)
linking();
printf("enter the source vertex");
int source;
scanf("%d",&source);
BFStraversal(source);
return 0;
}
enter code here
推荐阅读
- python - 针对特定应用程序结构的 Flask 蓝图和 SQL-Alchemy 之间的数据库连接
- php - Laravel 5.8:此路由不支持 POST 方法
- flutter - 当我在谷歌地图上绘制折线时出现问题 Flutter
- reactjs - 如何使用 UseRef React 钩子在 TextInput 中设置值
- c# - 通过一个 .NET5 微服务(应用程序)访问多个 Gmail 帐户
- java - 更新查询在preparedStatements Java中不起作用
- c - 如何在链接器文件中添加堆内存
- ionic-framework - 我正在尝试在离子应用程序中制作侧面菜单。但是侧边菜单的链接没有点击
- node.js - 应用程序之间通过 docker 网络的 dokku 内部连接
- javascript - 如何从对象中获取对应的key和value,并将其转换为数组对象