编写程序以反转给定单链表的方向。换句话说,在逆转之后,所有指针现在应该指向后方。
我正在努力解决上述问题。我为单链表编写了插入,搜索,删除和打印功能。
我的打印功能如下
void print(list **l)
{
list *p=*l;
for(int i=0;p;i++)
{
cout<<p->item<<endl;
p=p->next;
}
}
它可以很好地打印列表中的所有值。
但是在主函数中,如果我像这样做
list *p=*l;
它给了我分段错误。我的主要功能如下
main()
{
list **l;
*l=NULL;
int n;
while(cin>>n)
insert(l,n);
list *p=*l;
list *prev=NULL;
list *next;
while(p)
{
next=p->next;
p->next=prev;
prev=p;
if(next==NULL)
*l=p;
p=next;
}
print(l);
}
我的插入功能如下
void insert(list **l,int x)
{
list *p;
p=(list *)malloc(sizeof(list));
p->item=x;
p->next=*l;
*l=p;
}
我在打印功能和主要功能之间的分配有什么区别?为什么我的打印功能没有任何错误,我在主函数中出现了分段错误?
如果我的功能是这样的
main()
{
list **l;
*l=NULL;
int n;
while(cin>>n)
insert(l,n);
print(l);
}
我没有收到任何错误,我可以插入和打印列表的值。
答案 0 :(得分:3)
写作时
list **l;
*l=NULL;
您正在取消引用无效指针,因此遇到未定义的行为。
在函数内部,您可能正在传递一个有效的指针作为参数。例如
list* l;
void print(&l)
在这种情况下,&l
的类型为list**
- 它指向悬空list*
,因此取消引用它将产生一个指针(l
本身)。 l
未初始化,但不能从中读取。
答案 1 :(得分:1)
你写道:
list **l;
*l=NULL;
但是l没有分配,你不知道它的值,所以* l = NULL是未定义的行为,因为你不知道你正在改变哪个内存区域。