我正在使用邻接列表方法创建图形。每个节点表示为指向与其连接的其他节点的节点。以下是我的代码
program main
use graphs
implicit none
type(node),pointer :: start
type(node), dimension(:), pointer :: grp
integer :: n, ios=0, a,b, i
open(1, file='test6.txt', status='OLD', action='READ')
read(1,*,iostat=ios) n
allocate(start)
allocate(grp(n))
do, i=1,n
grp(i)%val=i
enddo
do while(ios==0)
read(1,*, iostat=ios)a,b
if(ios.NE.0)then
exit
endif
start => grp(a)
call add(start, b)
start => grp(b)
call add(start, a)
end do
end program main
模块图如下
module graphs
type node
integer :: val
type(node), pointer :: next
end type node
contains
subroutine add(strt, nxn)
implicit none
type(node), pointer :: strt, new_node, lst
integer :: nxn
allocate(new_node)
allocate(lst)
lst => strt
new_node%val = nxn
new_node%next => NULL()
do while(associated(lst%next))
lst => lst%next
enddo
lst%next => new_node
end subroutine add
end module graphs
档案test6.txt
如下
43
1 2
1 10
2 3
2 11
3 4
4 5
5 6
6 7
7 8
8 9
3 12
4 13
5 14
6 15
7 16
8 17
9 18
10 11
11 12
12 13
13 14
14 15
15 16
16 17
17 18
10 19
11 19
12 20
我收到以下错误
Program received signal SIGSEGV: Segmentation fault - invalid memory
reference
Backtrace for this error:
#0 0x7f786df6bef7 in ???
#1 0x7f786df6b12d in ???
#2 0x7f786dbbc4af in ???
#3 0x401db0 in __graphs_MOD_add
at /home/nav/MS project/new/grph.f90:18
#4 0x400f48 in ???
#5 0x400f85 in ???
#6 0x7f786dba782f in ???
#7 0x400a18 in ???
#8 0xffffffffffffffff in ???
Segmentation fault (core dumped)
上述程序对于小图表运行流畅,但不适用于大图表。我无法得到我做错了什么?我正在使用gfortran编译器。
答案 0 :(得分:1)
您的代码中没有任何地方将起始%next
指针设置为null。所以,当你来到
do while(associated(lst%next))
lst%next
指向的地址未定义。您不能询问它是否已关联,因为结果associated()
将返回也未定义。另请参阅此经典资源以获取更多解释http://www.cs.rpi.edu/~szymansk/OOF90/bugs.html#5
最好的解决方法是指针组件的默认初始化
type node
integer :: val
type(node), pointer :: next => null()
end type node
养成始终将指针组件设置为null的习惯。