私はリンクリストを分割するCプログラムを持っています。これはロジックです - リンクリストに偶数のノードがある場合は、それを同じ半分に分割します。そうでなければ、1つのノードが子リンクリストよりも多い親リンクリストとそれを分割する。 以下のコードを実行すると、メインループのdisplay_LL関数が 'p'リンクリストを正しく表示します。その分割は正しく行われます。しかし、display_LL関数は、 'r'リンクリストのNULLを出力します。分割されたリンクされたリストが関数スコープの外で空になっています
'frontbacksplit_LL'関数の中からリンクリストを印刷すると、 'p'と 'r'のリンクリストが正しく表示されます。
なぜこのような別の動作、私は理解できません。
これはスコープの問題ですか?もしそうなら、私はコードにどのような変更を加える必要がありますか?
Plsはリンクリストと仮定します。 'p'は空のリンクリストではありません。ノードがあります。わかりやすくするためにコードを省略しました。また、display_LL関数コードも表示されません。
struct node {
int data;
struct node *link;
};
void main()
{
struct node *p,*q,*r;
p=NULL;
q=NULL;
frontbacksplit_LL(p,r,count(p)); //Imagine p has nodes. count(p) gives number of
printf("Front_Back Splits:\n"); //nodes in the linked list.
display_LL(p); //displays split linked list correctly
display_LL(r); //Shows EMPTY linked list.
getch();
}
frontbacksplit_LL(struct node *a,struct node *b,int node_count)
{
struct node *temp;
int i,t;
temp=a;
if(node_count%2==0) //even
{
for(i=0;i<node_count/2;i++)
temp=temp->link;
b=temp->link;
temp->link=NULL;
}
else
{
for(i=0;i<(ceil(node_count/2));i++)
temp=temp->link;
b=temp->link;
temp->link=NULL;
}
display_LL(a); //Displays split linked list correctly.
display_LL(b); //Displays split linked list correctly.
}
引数として渡されるポインタの変更:http://agnelkurian.com/blog/?p=168 –
あなたの助けに感謝します。あなたの提案はすべて同じように有効です。しかし、コードを少し微調整すれば動作することがわかりました。私がしたことは、次のようなrへの参照を送りました:frontbacksplit_LL(struct node * a、struct node ** b、int node_count) そしてこれをfrontbacksplit_LL(p、&r、count(p)); に機能とボイラーが機能しました!親リンクリスト(私が観察したもの)の参照を送る必要はありません。 これに関するコメント? – bijeshn
親リストポインタを変更していません。だから、参照することでそれを渡す必要はありません。 –