編寫一個程序來顛倒給定單鏈表的方向。換句話說,在逆轉之後,現在所有的指針都應該向後指向。指針賦值時的分段錯誤
我想解決上述問題。我編寫了用於插入,搜索和刪除以及打印單個鏈接列表的函數。
我的打印功能如下
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);
}
我沒有得到任何錯誤我能夠插入和列表的打印值。
'list ** l;'是一個懸掛指針,所以'* l = NULL;'是未定義的行爲。 – enobayram 2013-02-19 11:56:50
@enobayram我插入值的權利? – user2086900 2013-02-19 11:58:01
是的,你正確地在'insert'函數中執行了一個插入,但是即使對於C,你的整體方法也是不適當的,更不用說C++了。是否有任何理由不使用'std :: list'?即使你想像C那樣編碼,使用'list * l = NULL;'並且以'print(&l)'的形式傳遞它。 –
enobayram
2013-02-19 12:13:21